Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
алгоритмы1.docx
Скачиваний:
31
Добавлен:
10.06.2015
Размер:
1.98 Mб
Скачать

37. Нагруженные деревья – основные понятия. Реализации узлов нагруженного дерева (атд treenode). Основные операторы для атд treenode.

Дана структура применения для хранения множества элементов являющихся символьными строками, такие структуры используются, когда основные операторы должны быть оператором INSERT, DELETE, MAKENULL и PRINT.

Качественное описание структуры в нагруженном дереве, каждое ребро помечено 1-ним символом основного алфавита.

Путь от корня к листу соответствует одномерному слову, который задается последовательностью символов. Дополнительно к основному алфавиту, деревья используют специальный символ «$» (маркёр) конца слова, следовательно любое слово заканчивается «$». Благодаря этому, например словам СОК и СОКРАТ будут соответствовать разные ветви дерева, иначе множество ребер соответствующим СОК не будет соответствовать множеству ребер СОКРАТ. При таком построении его узлы будут соответствовать префиксам слов, причем собственные префиксы словами не считаются.

Пример нагруженного дерева приведен на рис. 4.11

Вводим 2-ва абстрактных типа данных:

  1. АТД TREE (собственно нагруженное дерево)

  2. АТД TREENODE (узел нагруженного дерева)

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

Наиболее простая реализация узла нагруженного дерева является массив указателей на узлы. Индексирование символов расширенного алфавита:

type

chars=(‘a’, ‘б’, … , ‘я’, ‘$’); //множество символьного расширенного алфавита

TREENODE = array [chars] of ^ TREENODE;

var node: TREENODE;

Наглядно переменную NODE, если оно отображает 2-й узел на 2-м уровне, можно интерпретировать так:

Элемент node [‘0’] – это указатель на 2-й узел 3-го уравня

node [‘1’] является указателем на 3-й уровень 3-го узла

node [‘a’] … node [‘я’], node [$] nil

Если дан символ ξ действующий в дереве, то ребро node [ξ] будет указывать на номер в который входит соответствующее ребро, в противном случае node [ξ] получит nil

node [‘$’] всегда либо nil, либо указатель на себя, т.е петля.

Основные операторы для АТД TREENODE:

  • Создание пустого узла (листа)

procedure MAKENULL (var node TREENODE);

var c: chars;

begin

for c:=’a’ to ‘$’ do node [c]:=nil;

end;

  • Передача указателя элементу массива

procedure ASSIGN (var node: TREENODE; c: chars; p:^TREENODE);

begin node [c]:=p;

end;

  • Получение указателя ассоцир. с определенным символом в узле

function VALUEOF (var node: TREENODE; c: chars):^TREENODE;

begin

return (node [c]);

end;

  • Передача элементу массива индексированного конкретным символом указатель на новый узел

procedure GETNEW (var node: TREENODE; c: chars);

begin

new (node [c]); //создание нового узла, который будет адресовываться node [c]

MAKENULL (node [c]^); //инициализация всех элементов массива ненулевым адресом

Реализация узлов нагруженного дерева может быть очень не экономичной: если общее число различных префиксов = p и при этом величина N*p существенно больше l всех слов в хранилище, то в узлах нагруженного дерева будет …