Представление древовидных н сетевых структур в памяти эвм
Древовидные структуры. При физической организации древовидных структур данных в памяти ЭВМ необходимо решить два вопроса :
1) как организовать данные, представленные вершинами (узлами древовидной структуры) ;
2) как организовать связи между данными, представленные в схеме БД дугами древовидной структуры.
Для упрощения считаем, что данные в узле структуры можно представить последовательным списком элементов фиксированного размера, т. е. записями фиксированной длины. Поэтому рассмотрим способы организации связи между узлами в древовидной структуре данных.
Древовидная структура - это связный неориентированный граф, который не содержит циклов. Рассмотрим еще два вспомогательных определения. Разбиением } множества называется множество подмножеств(причем, ) таких, что их объединение есть множество А и они являются попарно непересекающимися:
для любых i не равных j
Вложенным множеством называется непустой набор } непустых множеств таких, что для любых двух множеств выполняется одно из следующих трех условий:
Таким образом, разбиение исходного множества и возможные последующие уточнения этого разбиения могут образовывать вложенное множество.
Деревья, эквивалентные набору вложенных множеств, называют ориентированными деревьями. Если линейно упорядочить элементы, то произойдет линейное упорядочение всех классов эквивалентности. В этом случае получают упорядоченное дерево. Поскольку получена линейная упорядоченность множества В, упорядоченное дерево можно представить линейным списком.
Двоичным (бинарным.) деревом называется упорядоченное дерево, в котором:
1) каждый произвольный узел, кроме концевого, имеет не более двух исходящих узлов (потомков или сыновей);
2) каждый сын произвольного узла идентифицируется как левый или правый сын.
Поддерево Т, корнем которого является левый сын узла и, называют левым поддеревом узла v. Поддерево Т, корнем которого является правый сын узла v, называют правым поддеревом узла v. Все узлы в Т располагают левее всех узлов в Т, т. е. при представлении двоичного дерева считают, что множество сыновей каждого узла упорядочено слева направо.
Обобщением двоичных деревьев является сбалансированное (или регулярное) дерево. В сбалансированном дереве количество исходящих узлов из любого произвольного узла может быть больше двух, однако обязательно из каждого произвольного узла (кроме концевого) исходит одинаковое количество порожденных узлов. Процесс включения новых узлов в сбалансированное дерево выполняется сверху вниз, а на каждом уровне дерева- слева направо. Сбалансированные деревья используются для построения индексов файлов.
Сбалансированное дерево называется полным, если для некоторого целого числа k каждый узел глубины, меньшей, k имеет r исходящих узлов и каждый узел глубины k является концевым узлом. Глубина узла v в дереве -это длина пути из корня в v. Высотой узла v в дереве называется длина самого длинного пути из v в один из концевых узлов. Уровень узла v в дереве равен разности между высотой дерева и глубиной узла v (уровень концевых узлов имеет номер 0, следующий уровень- 1 и т. д.).
Количество узлов полного сбалансированного дерева высоты k:
где г - количество исходящих узлов. В случае двоичного дерева r=2 и формула упрощается:
Методы представления древовидных структур линейным списком с последовательным распределением памяти.
Метод использования адресной арифметики. Метод хорошо применим к сбалансированным (регулярным) деревьям. В этом случае узлы представляются записями фиксированной длины. Пусть для размещения одного узла дерева требуется квант памяти размером т единиц.
Первый способ. В имеющемся векторе памяти А в первом кванте А[1] с адресом помещают корень дерева. Кванты
заполняют непосредственными потомками корня дерева. Последующие r квантов заполняют непосредственными потомками узла, размещенного в кванте А[2]. Далее г квантов заполняют непосредственными потомками узла, размещенного в кванте A[3], и т. д.
Адрес k-го кванта А[k] вычисляют по формуле:
В зависимости от значения г определим функциональную зависимость между адресами квантов, в которых размещаются узел и его непосредственные потомки.
Для случая г=2. Этот вариант рассмотрен в (списковые структуры)
Для случая r=3. Непосредственные потомки кванта A[k] это кванты A[3k-1], A[3k] и A[Зk+1] с адресами
Чтобы получить адрес узла, являющегося исходным для узла, размещенного в кванте А[k], необходимо k разделить на 3 и округлять до целого значения по общим правилам округления. Адрес определяют по формуле
Для случая г = 4 использование данного способа несколько осложняется. Это связано с тем, что для получения адреса узла, являющегося исходным для узла, размещенного в кванте A[k], требуется разрабатывать специальный алгоритм вычисления.
Структура, полученная при данном способе представления, позволяет осуществлять поиск узлов в прямом (от корня) и в обратном (к корню) направлениях.
Второй способ. Применим только для двоичных сбалансированных деревьев. Если используется вектор памяти от кванта i до кванта j включительно, то корень дерева помещается в квант A[l] где
т. е. в середину вектора памяти. В квантах памяти от i до (l-1) включительно размещается левое относительно корня поддерева а в квантах от (l+1) до j включительно -правое относительно корня поддерево. Размещение поддеревьев выполняется аналогично, корень левого поддерева размещается в квант
корень правого поддерева - в квант
Адреса квантов вычисляются по формуле . Структура, полученная при данном способе представления, приспособлена для поиска узлов в прямом направлении.
Рассмотренная структура еще называется деревом сравнений, поскольку используется для организации данных при логарифмическом или бинарном поиске.
Метод использования левосписковых структур. Метод строит последовательность узлов при обходе исходной древовидной структуры сверху вниз и слева направо. Алгоритм построения последовательности в данном методе следующий. Выбираются узлы, начиная от корня дерева и до концевого узла включительно по крайней левой ветви дерева, затем осуществляется подъем вверх до первой следующей ветви, и процесс повторяется. Узлы, ранее выбранные, в последовательность не включаются.