Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Методы реализации древовидных и сетевых структур в реляционных СУБД





Начать анализ методов следует со средств, поставляемых в составе инструментальных систем программирования. Все современные системы программирования позволяют подключать библиотеку управляющих элементов ActiveX COMCTL32.OCX. В составе этой библиотеки содержится управляющий элемент визуализации древовидных структур Tree View Control (TVC). TVC выводит на экран иерархический список узловых объектов, каждый из которых состоит из текстового элемента и, если необходимо, из рисунка bitmap. TVC используется, обычно, для вывода оглавления документа, каталогов (папок) файлов на диске или любой другой подобной информации, которая требует иерархического представления.

После создания TVC можно добавлять, удалять, упорядочивать и выполнять другие действия над узловыми объектами путём установки значений свойств и вызова методов. Можно программно развёртывать и свёртывать узловые объекты, показывая или скрывая дочерние (подчинённые) узлы.

Главным ограничением использования TVC для реализации вышеопределённых задач является то, что он базируется на встроенном наборе ключей узлов (Nodes Collection). Поэтому этот управляющий элемент можно использовать именно для целей визуализации, передавая ему необходимый фрагмент иерархической структуры для отображения на экране.

Многолетний опыт эмуляции ориентированных сетевых структур (без циклов) средствами реляционных СУБД позволил выделить четыре инвариантных метода представления деревьев:

· избыточный двухсвязный список;

· иерархический;

· трёхсвязный список;

· на основе классификации Дьюи.

Метод представления сетевых структур без циклов на основе избыточного двухсвязного списка. Такой метод требует одно ключевое поле – уже вышеупомянутое key, а также поля для указателей LLINK и RLINK. Однако для повышения степени инвариантности представления, а также наглядности и удобства изложения последующих методов, в качестве информационного поля мы будем использовать ключевое поле CHTO и в качестве родительского поле KUDA. Ключом в этом случае будет являться конкатенация этих полей. Для иллюстрации метода создадим нижеследующую таблицу TREE.DBF (табл. 1). В соответствии с ниже приведенном на рис. 12 фрагментом сети заполним поля CHTO, KUDA, LLINK и RLINK, принимая во внимание, что каждая пара CHTO - KUDA определяется на рисунке верхним и нижним прямоугольником, связанным линией с кружком. Номер в нижнем прямоугольнике заносится в поле CHTO. Номер, помещенный в кружке линии, связывающей два прямоугольника, является физическим номером записи пары CHTO - KUDA.

При заполнении полей LLINK и RLINK следует учитывать следующие правила:

· в поле LLINK заносится номер записи, соответствующей старшему сыну семьи. Если сыновья отсутствуют, то записывается -1;

· в поле RLINK заносится номер записи, соответствующей брату данной вершины. Если вершина является крайней в семье, то в это поле заносится -1.

В результате мы получим представление сетевой структуры в виде избыточного двухсвязного списка. В соответствии с алгоритмом, приведенном на Рис. 13, а также нижеприведенными комментариями к нему, легко написать программу прямого обхода на любом из диалектов хBASE или Delphi и убедиться в её работоспособности на созданной таблице.

Таблица 1

Номер CHTO KUDA LLINK RLINK
         
      -1 -1
         
         
      -1  
        -1
        -1
      -1  
        -1
  122а   -1  
  122б   -1 -1
      -1  
        -1
        -1
        -1
        -1
         

 

 


 

1 2

 

1 7 4 14

 

11 13 12 17

2 12 5

6 15

 

111 121

122 221

 

13 9

8 16

 

1221 1222

 

10 11

 

122а 122б

 

 

Рис. 12. Фрагмент сетевой структуры

 

 


 

начало

 

 

1. Установить вершину

начала обхода

 

2. Dimension Stk(255),

Stv(255), Uk=0

 

 

3. Установить направле-

ние обхода NO=.T.

 

4. Начало цикла.

i = 0

 

 

5. нет

NO =.T.?

 

да

 

6. (Uk = uk+1)Занести ключ

вершины в стек ключей

 

 

7.Есть нет да 11. Есть указатель

указатель на левое на правое

поддерево? поддерево?

 

да

8. (i=i+1) Занести в стек 12. Перейти на правое нет

вершин указатель на поддерево

текущую вершину

 

 

9.Перейти на левое 14. Перейти 13.Установить

поддерево по указателю направление

стека вершин обхода.F.

 

15. Удалить из стека вершин головную

вершину (i = i-1)

16.Окончание цикла 5

(i = 0)

 

 

конец

 

 

Рис. 13. Алгоритм прямого (левостороннего) обхода дерева

 

Комментарии к алгоритму, изображённому на рис. 13.

Оператор 1. Установление вершины начала обхода. В качестве начала обхода может быть принята любая вершина сети. Начало может быть установлено путем передачи в программу номера записи, с которой начинается обход.

Оператор 2. Инициализируются массивы, выполняющие роль стеков имен вершин и ключей вершин, т.е. ассоциированных с вершинами данных. Кроме того инициализируются целые переменные, выполняющие роли указателей вершин стеков.

Оператор 3. Установить направление обхода True Предполагается инициализация логической переменной, которой присваивается значение.T. и которое указывает на направление обхода от корня к листьям.

Оператор 4. Начало цикла. (Имеется в виду команда DO WHILE.T. xBASE)

Оператор 6. Занести ключ вершины в строку ключей. Это действие выполняет роль процедуры обработки узла дерева при прямом обходе. В настоящий момент для упрощения анализа в качестве ключа удобно принять значение поля CHTO.

Оператор 7. Есть указатель на левое поддерево? Означает проверку возможности перехода к вершине-сыну по отношению к текущей вершине.

Оператор 8. Занести в стек вершин указатель на текущую вершину. Означает, что необходимо увеличить указатель головы стека на 1 и занести номер записи текущей вершины в массив, выполняющий роль стека.

Оператор 9. Перейти на левое поддерево. Означает переход на запись, соответствующую вершине-сыну относительно текущей вершины.

Оператор 10. Установить направление обхода Тrue. Т.е. восстановить первоначальное направление обхода.

Оператор 11. Означает проверку возможности перехода на правое поддерево, которая определяется положительным указателем на правое поддерево.

Оператор 12. Перейти на правое поддерево. Означает переход на запись, соответствующую вершине-брату относительно текущей вершины. Здесь следует напомнить, что речь идет о двоичном представлении произвольного дерева. В таком представлении на общепринятом жаргоне может идти речь о вершине-отце, вершине-сыне и вершине-брате. Других вершин в двоичном представлении нет.

Оператор 13. Установить направление обхода False. Изменяет первоначальное направление обхода на обратное.

Оператор 14. Перейти по указателю стека вершин. Это действие означает чтение головы стека вершин и перехода по выбранному из него указателю на родительскую вершину относительно текущей вершины.

Оператор 15. Удалить из стека вершин головную вершину. Означает просто уменьшение указателя стека вершин на 1.

Оператор 16. Окончание цикла соответствующее команде ENDDO.

В качестве контрольного результата правильности работы программы могут служить значения стека ключей, которые должны содержать значения узлов сети, представляемых значениями поля CHTO в прямом порядке обхода.

Сделаем следующие замечания:

· пример иллюстрирует возможность работы с сетевой структурой, поскольку повторяющиеся поддеревья записываются в таблицу один раз;

· алгоритм использует для навигации по базе данных только команду безусловного перехода GO, использующую физические номера записей. Эта команда не требует наличия индексных файлов и является самой быстрой командой;

· алгоритм может быть реализован также и на основе массива, содержащегося в оперативной памяти;

Иерархическое представление ориентированной сети без циклов. Для такого представления достаточно всего два поля CHTO и KUDA. Воспользуемся снова той же таблицей TREE.DBF и заполним на основе сети, изображённой на Рис. 12, поля CHTO и KUDA, оставив пустыми поля LLINK, RLINK. В результате мы получим неупорядоченный набор иерархических отношений. Создадим тег вторичного индекса по полю KUDA и, тем самым сгруппируем записи по общности родительских вершин. В результате действия процедуры ProshPod, алгоритм которой изображён на Рис. 14, получим заполненные поля LLINK и RLINK, для любого поддерева, например, - исходящих из вершины 1 или 2. Для построения бинарного дерева для всей сети необходимо воспользоваться алгоритмом, изображённом на Рис. 15.

Задача в такой постановке возникает при создании базы данных спецификаций изделий в масштабе предприятия и решения задач входимости, применяемости изделий, формирования ведомости материалов, создания комплектовочных карт изделий и целого ряда других подобных задач.


 

начало

 

 

1. Установить вершину 6.Сохранить адрес записи

начала обхода в lnSA и ключ в lcChto

 

7.

текущая вершина lcChto Нет

встречается в поле

Kuda?

. Да

3. Начало цикла

i = 0

 

4. Нет

NO =.T.?

 

 

Да

 

 

5.Есть нет

указатель на левое

поддерево? Нет

11. Kuda=lcKuda?

да

13. i=i+1. Занести в стек

вершин указатель Да

текущую на вершину lcKuda= CHTO

 

 

15.Перейти на левое

поддерево

 

 

20.Окончание цикла 5

(i = 0)

 

конец

 

Рис. 14. Алгоритм процедуры ProshPod построения бинарного поддерева.


 

начало

 

 

Начало цикла с условием

Not Eof()

 

Да

Запись найдена?

 

 

Конец цикла

 

Рис. 15. Алгоритм построения двоичного дерева над неупорядоченным “лесом” деревьев

 

 

Избыточный двухсвязный список можно легко преобразовать в строгий двухсвязный список простым удалением поля KUDA, или в односвязный – удалением поля RLINK и использованием тега по полю KUDA.

Еще одну разновидность представления можно получить, оставив поля CHTO и LLINK и введя поле уровня вершины.

И наконец, вариант представления, который удобно использовать, в основном, для визуализации фрагментов древовидных структур – это упорядоченная в порядке левостороннего (прямого) обхода последовательность ключей узлов и соответствующая последовательность уровней каждого узла.

Представления сетевых структур без циклов на основе трёхсвязного списка. Рассмотрим представление сетевых структур, обеспечивающее наиболее быструю обработку и наибольшую степень инвариантности. Оно представляет собой модификацию избыточного двухсвязного списка следующим образом:

· ключевое поля KUDA преобразовывается в указатель на родительскую вершину;

· указатель LLINK становится указателем NEXT на следующую вершину в порядке левостороннего обхода;

· указатель RLINK остаётся без изменения и указывает всегда на правое поддерево, если оно существует. В противном случае RLINK содержит -1;

· для ускорения выполнения обратных обходов вводится логическое поле RLINKI, которое принимает значение True, если узел имеет более одной родительской вершины;

· для использования этого представления в качестве нейронной сети добавляется еще поле для представления количественной характеристики, интерпретируемой в различных контекстах различным образом: степень достоверности в сетях логического вывода; весовая характеристика при обучении нейронной сети и т.п.

В результате мы получим нижеследующий следующий листинг структуры таблицы.

Structure for table: C:\APPL\ELABOR\FTE5\WORK\TREE.DBF

Number of data records: 12

Date of last update: 25.10.98

Code Page: 1251

Field Field Name Type Width Dec Index

1 CHTO Character 4

2 KUDA Character 4

3 NEXT Character 4

4 RLINK Character 4

5 RLINKI Logical 1

6 Kol Numeric 3 2

** Total ** 20

Для работы с таким представлением автором были разработаны специальные пакеты программ в системе Visual FoxPro и Visual Basic.

Представление древовидных структур на основе классификации Дьюи. Еще одним из способов представления деревьев в ЭВМ, является такое представление, при котором каждая вершина имеет своё уникальное обозначение, которое получается путем добавления к обозначению родительского узла собственного уникального номера. Такой метод часто называют системой обозначений Дьюи для деревьев, по аналогии с классификационной схемой, применяемой в библиотеках. Пример такой реализации представлен на рис. 16.

 

 
 

Рис. 16. Представление дерева в форме классификации Дьюи

Десятичная система Дьюи применима ко всякому лесу: корень k-того дерева в лесу обозначается номером k; если α-номер любого узла степени m, то его сыновья обозначаются номерами α.1,α.2,…,α.m. Вместо десятичной системы счисления в реальных приложениях употребляют системы с основанием 128 или 256 и отводят более чем одну позицию для нумерации сыновей любого узла. Так например, в случае системы с основанием 256 и двухбайтовой позиции получим возможность оперировать более чем с 65000 членов семьи одного узла.

Обратим внимание на следующие важные свойства представления деревьев в форме классификации Дьюи:

· обозначения узлов представляют собой строки символов;

· узел, имеющий уровень k имеет обозначение длиной k*n символов, где n – число позиций, отведённое под номер;

· последние n символов представляют порядковый номер узла в составе семьи;

· для любого узла первые k*n-n символов являются обозначением родительской вершины.

Система обозначений Дьюи имеет много простых математических свойств и является полезным инструментом при анализе деревьев.

Для представления “леса” на основе классификации Дьюи необходима таблица базы данных (например, Tree.dbf), содержащая, как минимум, два поля:

· в поле Tree.NomVer хранится индекс вершины дерева;

· в поле Tree.Link – ключ записи таблицы, содержащей данные, ассоциированные с данным узлом.

Для такой таблицы создаётся индексный файл, содержащий обычно три тега (в терминах языка FoxPro):

· Index on NomVer to TAG NomVer;

· Index on Str(len(trim(NomVer))) + NomVer to TAG Family;

· Index on Link to TAG Link.

Тег NomVer обеспечивает упорядочивание индексов вершин в соответствии с прямым левосторонним обходом. Тег Family – в соответствии с уровнями дерева, т. е. сначала будут идти вершины первого уровня, затем – второго и т.д. Тег Link обеспечивает прямой доступ к узлам дерева по ассоциированным с узлами данным и, одновременно, группирование одинаковых данных, но встречающихся в различных контекстах.

Выводы

Классификационная компонента информационных систем САПР позволяет решить три задачи:

· создать среду для естественного манипулирования тем большим числом различных классификаторов объектов САПР, которые используются в инженерной практике;

· создать среду для однозначного формирования имён аттрибутов, относящихся к различным объектам САПР;

· обеспечить методическую базу для решения задач, основанных на применении сетевых моделей.

Классификационная компонента в информационных системах САПР не замещает собой дескрипторную компоненту, а лишь органически её дополняет.







Дата добавления: 2015-04-16; просмотров: 526. Нарушение авторских прав; Мы поможем в написании вашей работы!




Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Измерение следующих дефектов: ползун, выщербина, неравномерный прокат, равномерный прокат, кольцевая выработка, откол обода колеса, тонкий гребень, протёртость средней части оси Величину проката определяют с помощью вертикального движка 2 сухаря 3 шаблона 1 по кругу катания...

Неисправности автосцепки, с которыми запрещается постановка вагонов в поезд. Причины саморасцепов ЗАПРЕЩАЕТСЯ: постановка в поезда и следование в них вагонов, у которых автосцепное устройство имеет хотя бы одну из следующих неисправностей: - трещину в корпусе автосцепки, излом деталей механизма...

Понятие метода в психологии. Классификация методов психологии и их характеристика Метод – это путь, способ познания, посредством которого познается предмет науки (С...

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Именные части речи, их общие и отличительные признаки Именные части речи в русском языке — это имя существительное, имя прилагательное, имя числительное, местоимение...

Интуитивное мышление Мышление — это пси­хический процесс, обеспечивающий познание сущности предме­тов и явлений и самого субъекта...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия