Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АВЛ - деревья1 / 2008-04-07-22-58-Назыров Артём Владимирович- АВЛ-деревьев

.doc
Скачиваний:
10
Добавлен:
01.05.2014
Размер:
40.45 Кб
Скачать

Copyright ©2006 Назыров Артем Владимирович СПбГЭТУ «ЛЭТИ»

АВЛ-деревья

По определению идеально сбалансированное дерево это дерево, все уровни которого, за исключением, может быть, последнего, полностью заполнены. (В бинарном дереве полностью заполненный уровень n содержит 2n узлов). При соблюдении данного условия бинарное дерево предоставляет оптимальнейшие условия для поиска в нем. Однако на практике поддерживать идеальную балансировку дерева вряд ли выгодно, поскольку процедура ее восстановления после случайного включения – довольно сложная операция, поэтому вводится понятие АВЛ-сбалансированных деревьев (АВЛ – аббревиатура фамилий создателей: Адельсон-Вельский и Ландис), в которых критерий сбалансированности несколько упрощен. Дерево называется АВЛ-сбалансированным тогда и только тогда, когда для каждого узла высота его двух поддеревьев различается не более чем на 1. На практике такое определение приводит к легко выполнимой балансировке, а средняя длина поиска остается такой же, как у идеально сбалансированного дерева.

Примеры АВЛ-сбалансированых деревьев:

рис. 1 АВЛ-сбалансированые деревья

С АВЛ-сбалансированными деревьями можно выполнять следующие операции за единицу времени даже в худшем случае:

1. Найти узел с данным ключом.

2. Включить узел с данным ключом.

3. Удалить узел с данным ключом.

При реализации АВЛ-деревья не сильно отличаются от обычных бинарных. Однако появляется дополнительная операция балансировки, требующаяся при нарушении баланса, в которой и заключается основная сложность. Баланс, определяемы разностью между высотами правого и левого поддеревьев может нарушиться после операции вставки нового узла и, соответственно, после удаления. При этом может возникнуть 4 варианта нарушения балансировки (то есть ):

рис. 2 виды нарушений балансировки.

Балансировка выполняется с помощью действий, называемых поворотами узлов. При включении узлов повороты выполняются для ближайшего узла с нарушенной балансировкой к включенному. То есть, если после включения узла в дереве образуется несколько узлов с нарушенной балансировкой, поворот выполняется для того, который находится ниже (то есть ближе к включенному). После балансировки этого узла восстанавливается баланс и выше расположенных узлов. Нарушенный путь обозначается аббревиатурами LL, RR (при данном типе разбалансировки выполняется одинарный поворот), RL, LR (требуется двойной поворот), в зависимости от пути от разбалансированного узла к узлу, вызвавшему эту разбалансировку. Причем, стоит отметить, что при LL и RR, и при RL и LR выполняемые действия являются симметричными относительно узлов, что удобно при реализации алгоритма.

Рассмотрим действия, применяемые при одинарном повороте на примере LL разбалансировки (еще раз напомню, что при RR необходимо выполнить абсолютно симметричные действия).

рис. 3 однократный LL-поворот

Маленькими буквами указаны узлы, которые могут и не существовать. При реализации данного поворота на практике следует осторожно поменять местами ссылки узлов дерева в соответствии с рисунком. После чего также осторожно поправить балансы.

Двойной поворот состоит из двух фаз. Первой нарушенные узлы приводятся к виду, рассмотренному ранее (рис. 3), после чего выполняется вторая фаза – соответствующий одинарный поворот. Рассмотрим на примере LR-поворота.

рис. 4 двукратный LR-поворот

Инструкции указанные выше действительны и в этом случае.

Исключение узла из АВЛ-дерева производится так же, как и из обычного дерева поиска, но после этого может возникнуть необходимость проведения балансировки. При этом если включение в АВЛ-дерева может потребовать не более одного поворота, то исключение может вызвать несколько поворотов на пути от удаляемого узла до корня дерева.

При реализации изложенных выше алгоритмов полезно учесть следующие соображения:

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

  2. Для хранения ссылок на «потомков» используйте массив указателей: так будет проще организовать симметрию поворотов.

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

  4. Будьте очень внимательны 

Обобщая, нужно заметить, что АВЛ-деревья целесообразно использовать в тех случаях, когда поиск узлов в дереве происходит гораздо чаще, чем включение и исключение узлов.

Список использованной литературы:

  1. Вирт Н. «Алгоритмы и структуры данных».

  2. Статья с сайта института оптико-нейтронных технологий РАН.

Copyright ©2006 Назыров Артем Владимирович СПбГЭТУ «ЛЭТИ»