|
||||
|
Назад | Содержание| Вперёд 10. 2. AVL - дерево: приближенносбалансированное...Назад | Содержание| Вперёд 10. 2. AVL - дерево: приближенносбалансированное дерево AVL-дерево - это дерево, обладающееследующими свойствами: (1) Левое и правоеподдеревья отличаются по глубине не более чем на1. (2) Оба поддереваявляются AVL-деревьями. Деревья, удовлетворяющие этому определению,могут быть слегка разбалансированными. Однакоможно показать, что даже в худшем случае глубинаAVL-дерева примерно пропорциональна log n, где n- число вершин дерева. Таким образомгарантируется логарифмический порядокпроизводительности операций внутри, добавитьи удалить. Операции над AVL-деревом работают посуществу так же, как и над двоичным справочником.В них только сделаны добавления, связанные споддержанием приближенной сбалансированностидерева. Если после вставления или удалениядерево перестает быть приближенносбалансированным, то специальные механизмывозвращают ему требуемую степеньсбалансированности. Для того, чтобы эффективнореализовать этот механизм, нам придетсясохранять некоторую дополнительную информациюотносительно степени сбалансированности дерева.На самом деле, нам нужно знать только разностьмежду глубинами поддеревьев, которая можетпринимать значения -1, 0 или +1. Тем не менее дляпростоты мы предпочтем сохранять сами величины глубин поддеревьев, а не разности междуними. Мы определим отношение вставленияэлемента как доб_avl( Дер, X, НовДер) где оба дерева Дер и НовДер -это AVL-деревья, причем НовДер полученоиз Дер вставлением элемента X.AVL-деревья будем представлять как термы вида д( Лев, А, Прав)/Глуб где А - корень, Лев и Прав- поддеревья, а Глуб - Рис. 10. 9. Три правилапостроения нового AVL-дepевa. глубину h +1. В случае, когда Х меньше, чем А, имееманалогичную ситуацию, причем левое и правоеподдеревья меняются местами. Таким образом, влюбом случае мы должны построить дерево НовДер,используя три дерева (назовем их Дер1, Дер2и Дер3) и два отдельных элемента А и В.Теперь рассмотрим вопрос: как соединить междусобой эти пять составных частей, чтобы дерево НовДербыло AVL-справочником? Ясно, что они должнырасполагаться внутри НовДер вследующем порядке (слева направо): Дер1, А, Дер2, В, Дер3 Рассмотрим три случая: (1) Среднее дерево Дер2глубже остальных двух деревьев. (2) Дер1 имеетглубину не меньше, чем Дер2 и Дер3. (3) Дер3 имеетглубину не меньше, чем Дер2 и Дер1. На рис. 10.9 видно, как можно построить дерево НовДерв каждом из этих трех случаев. Например, в случае 1среднее дерево Дер2 следует разбить надва части, а затем включить их в состав НовДер.Три правила, показанные на pис.10.9, нетруднозапасать на Прологе в виде отношения соединить( Дер, А,Дер2, В, Дер3, НовДер) Последний аргумент НовДер - этоAVL-дерево, построенное из пяти составных частей,пяти первых аргументов. Правило 1, например,принимает вид: соединить( Д1/Н1, А, д(Д21, В, Д22)/Н2, С, Д3/Н3, % Пять частей д( д( Д1/Н1, А, Д21)/На, В,д( Д22, С, Д3/Н3)/Нс)/Нb) :- % Результат H2 > H1, H2 > Н3, %Среднее дерево глубже остальных На is Н1 + 1, %Глубина левого поддерева Нс is Н3 + 1, %Глубина правого поддерева Hb is На + 1, %Глубина всего дерева Программа доб_аvl, вычисляющая такжеглубину дерева и его поддеревьев, показанаполностью на рис. 10.10. Упражнение 10. 3. Определите отношение avl( Дер) для проверки того, является ли ДерAVL-деревом, т.е. верно ли, что любые два егоподдерева, подсоединенные к одной и той жевершине, отличаются по глубине не более чем на 1.Двоичные % Вставление элемента в AVL-справочник доб_аvl( nil/0, X, д( nil/0, X,nil/0)/1). % Добавить Х к пустому дереву доб_аvl( д( L, Y, R)/Ну, X,НовДер) :- % Добавить Х к непустому дереву больше( Y, X), доб_аvl( L, X, д( L1, Z, L2)/ _ ), % Добавить к левому поддереву соединить( L1, Z, L2, Y, R, НовДер). % Сформировать новое дерево доб_avl( д( L, Y, R)/Ну, X,НовДер) :- больше( X, Y), доб_avl( R, X, д( R1, Z, R2)/ _ ), % Добавить к правому поддереву соединить( L1, Y, Rl, Z, R2, НовДер). соединить( Д1/Н1, А, д(Д21, В, Д22)/Н2, С, Д3/Н3, д( д( Д1/Н1, А, Д21)/На, В, д( Д22, С, L3/Н3)/Нс)/Нb) :- Н2 > H1, H2 > Н3, % Среднее дерево глубже остальных На is H1 + 1, Hс is Н3 + 1, Нb is На + 1. соединить( Д1/Н1, А, д(Д2/Н2, С, Д3/Н3, д( Д1/Н1, А, д( Д2/Н2, С, Д3/Н3)/Нс)/На) :- H1 >= H2, H1 >= Н3, %"Глубокое" левое дерево max1( H2, Н3, Нс), max1( H1, Нс, На). соединить( Д1/Н1, А,Д2/Н2, С, Д3/Н3, д( д( Д1/Н1, А, Д2/Н2)/На, С, Д3/Н3)/Нс) :- Н3 >= H2, Н3 >= H1, %"Глубокое" правое дерево max1( H1, H2, На), max1( На, Н3, Нс). max1( U, V, М) :- U > V, !, М is U + 1; % М равно 1плюс max( U,V) М is V + 1. Рис. 10. 10. Вставлениеэлемента в AVL-справочник. В этой программе предусмотрено, что попыткаповторного вставления элемента терпит неудачу. По поводу процедуры соединитьсм. рис. 10.9. деревья представляйте в виде термов д( Лев, Кор, Прав) илиnil. Посмотреть ответ Резюме 2-3 деревья и AVL-деревья, представленные в настоящей главе, - это примеры сбалансированных деревьев. Сбалансированные или приближенно сбалансированные деревья гарантируют эффективное выполнение трех основных операций над деревьями: поиск, добавление и удаление элемента. Время выполнения этих операций пропорционально log n, где n - число вершин дерева. Литература 2-3 деревья детально описаны, например, в Aho, Hopcroftand Ullman (1974, 1983). В книге этих авторов, вышедшей в 1983г., дается также реализация соответствующихалгоритмов на языке Паскаль. Н.Вирт (см. Wirth (1976))приводит программу на Паскале для работы сAVL-деревьями. 2-3 деревья являются частным случаемболее общего понятия В-деревьев. В-деревья, атакже несколько других вариантов структурданных, имеющих отношение к 2-3 деревьям вAVL-деревьям, рассматриваются в книге Gonnet (1984). Вэтой книге, кроме того, даны результаты анализаповедения этих структур. Программа вставления элемента в AVL-дерево,использующая только величину "перекоса"дерева (т.е. значение разности глубинподдеревьев, равной -1, 0 или 1, вместо самойглубины) опубликована ван Эмденом (1981). Aho А. V., Hopcroft J. Е. and Ullman J. D. (1974). The Design and Analysis ofComputer Algorithms. Addison-Wesley. [Имеется перевод: Ахо А.,Хопкрофт Дж. Построение и анализ вычислительныхалгоритмов. Пер. с англ. - М.: Мир, 1979.] Aho А. V., Hopcroft J. Е. and Ullman J. D. (1983). Data Structures andAlgorithms. Addison-Wesley. Gonnet G. H. (1984). Handbook of Algorithms + Data Structures. Addison-Wesley. van Emden M. (1981). Logic Programming Newsletter 2. Wirth N. (1976). Algorithms + Data Structures = Programs. Prentice-Hall.[Имеется перевод: Вирт H. Алгоритмы + структурыданных = программы. - M.: Мир, 1985.] Назад | Содержание| Вперёд |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|