Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1800 / 484 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 10:

Поисковые деревья

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

Упражнения

  1. Предположим, что корень красно-черного дерева красный. Если мы покрасим его в черный цвет, останется ли дерево красно-черным?
  2. Покажите, что самый длинный путь вниз от вершины x к листу не более чем вдвое длиннее самого короткого такого пути.
  3. Какое наибольшее и наименьшее количество внутренних узлов может быть в красно-черном дереве черной высоты k?

Вращения — это манипуляции с красно-черными деревьями с целью восстановления RB-свойств в случае их нарушения. Их используют при реализации операций {\rm Insert} и {\rm Delete}. Вращение представляет собой локальную операцию, при которой меняется несколько указателей, но свойство упорядоченности сохраняется.

На рис. 10.1 показаны два взаимно обратных вращения: левое и правое.


Рис. 10.1.

Левое вращение возможно в любом узле x, правый ребенок которого (назовем его y ) не является листом ( {\rm
nil} ). После вращения y оказывается корнем поддерева, x — левым ребенком узла y, а бывший левый ребенок y — правым ребенком узла x.

Упражнения

  1. Покажите, что левое и правое вращения можно осуществить за время O(1).
  2. Напишите процедуры {\rm LeftRotate}(T, x) и {\rm
RightRotate}(T, x), реализующие левое и правое вращение в дереве T относительно узла x.
  3. Пусть a, b и c — произвольные узлы в поддеревьях \al, \beta и \gamma на рис. 10.1 (справа). Как изменится глубина a, b и c при выполнении левого вращения?
  4. Покажите, что произвольное двоичное дерево поиска с n узлами может быть преобразовано в любое другое дерево с тем же числом узлов (и теми же ключами) с помощью O(n) вращений. (Указание: сначала покажите, что n - 1 правых вращений достаточно, чтобы преобразовать любое дерево в идущую вправо цепочку.)
  5. Напишите процедуры Insert ( T, x ) и Delete ( T, x ), которые добавляют и удаляют элемент x из дерева T за время O(log n).
  6. Разработайте алгоритм объединения двух красно-черных деревьев в одно красно-черное дерево за время O(log n).

АВЛ-деревья

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

Пусть n_k — минимальное число узлов в АВЛ-дереве высоты k. Тогда n_0 = 1, n_1 = 2, n_2 =
4, n_k = n_{k-1} + n_{k-2} + 1 при k \ge 2.

Теорема. Для любого k \ge 3 выполняется неравенство n_k \ge \al^{k +
1}, где \al = (1+\sqrt{5})/2 — положительный корень уравнения x^2 - x - 1.

Доказательство. Непосредственно проверяется базис индукции {n_3 \ge
\al^4}, n_4 \ge \al^5. Предположим теперь, что при k =
l выполняется неравенство n_k \ge \al^{k+1}, и докажем его при k = l + 1. Действительно, n_{l+1} = n_l + n_{l-1} + 1 > \al^{l+ 1} + \al^{l} + 1
> \al^{l+2}. Докажем последнее в этой цепочке неравенство.

Пусть \al^{l+1} + \al^l + 1 \le \al^{l+2}, тогда \al^{l+2} - \al^{l+1} - \al^l - 1 \ge
0 и, следовательно, \al^{l}(\al^2 - \al - 1) - 1 \ge 0. Получили противоречие (-1 \ge 0).

Следствие. Для любого АВЛ-дерева высоты k с n узлами выполняется соотношение k + 1 < \log_\al n = \log_\al 2 \log_2 n
\approx 1{,}44\cdot \log_2 n, что обеспечивает "логарифмическую трудоемкость" выполнения основных операций с АВЛ-деревом.

Идея балансировки двоичных деревьев поиска принадлежит\linebreak Г.М.Адельсону-Вельскому и Е.М.Ландису, предложившим в 1962 г. класс сбалансированных деревьев, называемых с тех пор АВЛ-деревьями. Баланс поддерживается с помощью процедуры вращения. Для его восстановления в дереве с n узлами после добавления или удаления узла может потребоваться \Theta(\log n) вращений.

Еще один класс деревьев поиска, называемых 2 - 3 -деревьями, был предложен Дж. Хопкрофтом в 1970 г. Здесь баланс поддерживается за счет изменения степеней узлов. Обобщение 2 - 3 -деревьев предложили Д.Байер и Е.Мак-Крейт. Их деревья называются Б-деревьями, которые мы рассмотрим в следующем разделе.

Красно-черные деревья предложил Д.Байер, назвав их симметричными двоичными Б-деревьями. Л.Гибас подробно изучил их свойства и предложил использовать для наглядности красный и черный цвета Посмотрите [7].

Из многих других вариаций на тему сбалансированных деревьев наиболее интересны расширяющиеся деревья, которые придумали Д.Слеатор и Р.Тарьян. Эти деревья являются саморегулирующимися. Хорошее описание расширяющихся деревьев дал Тарьян. Расширяющиеся деревья поддерживают баланс без использования дополнительных полей (типа цвета). Вместо этого расширяющие операции, включающие вращения, выполняются при каждом обращении к дереву. Учетная стоимость в расчете на одну операцию с деревом для расширяющихся деревьев составляет O(\log n).

Упражнения

  1. Напишите процедуру {\rm Insert}(T, z) для вставки элемента z в АВЛ-дерево T.
  2. Напишите процедуру {\rm Delete}(T, z) для удаления z из АВЛ-дерева T.
< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...