Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 10:

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

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

Случайные двоичные деревья поиска

Поскольку основные операции с двоичными деревьями поиска требуют времени O(h), где hвысота дерева, важно знать, какова высота "типичного" дерева. Для этого принимают какие-то статистические предположения о распределении ключей и последовательности выполняемых операций. К сожалению, в общем случае ситуация трудна для анализа. Если определить случайное двоичное дерево из n различных ключей как дерево, получающееся из пустого дерева добавлением этих ключей в случайном порядке, считая все n! перестановок равновероятными, то можно доказать, что средняя высота случайного двоичного дерева поиска, построенного по n различным ключам, равна O(\log
n).

Красно-черные деревья

Мы видели, что основные операции с двоичным поисковым деревом высоты h могут быть выполнены за O(h) действий. Деревья эффективны, если их высота мала, но если не принимать специальные меры при выполнении операций, малая высота не гарантируется, и в этом случае деревья не более эффективны, чем списки.

Для повышения эффективности операций используют различные приемы перестройки деревьев, чтобы высота дерева была величиной O(\log n). Такие приемы называются балансировкой деревьев. При этом используются разные критерии качества балансировки. Одним из видов сбалансированных деревьев поиска являются так называемые красно-черные деревья, для которых предусмотрены операции балансировки, гарантирующие оценку высоты величиной O(\log n).

Частным случаем такой балансировки является АВЛ-балансировка, при которой у каждого узла высота его левого поддерева отличается от высоты правого не более чем на единицу. Заметим, что наихудшими в некотором смысле АВЛ-деревьями являются деревья Фибоначчи T_h {(h = 0, 1, 2,
\ldots)}, определяемые следующим образом: T_0 — пустое дерево, T_1дерево, состоящее из одного узла. При h
> 1 дерево T_h состоит из корня с левым поддеревом T_{h-1} и правым — T_{h-2}. Нетрудно видеть, что при заданной величине h дерево T_h имеет наименьшее число узлов среди всех АВЛ-деревьев высоты h.

Для удобства поисковые деревья будем расширять, вводя дополнительный фиктивный узел ( {\rm nil} -узел) и считая его потомком каждого узла исходного дерева, у которого нет правого, левого или обоих потомков, его же считаем родителем корня.

Красно-черное дерево — это расширенное двоичное дерево поиска, вершины которого разделены на красные (red) и черные (black) так, что:

  1. Каждый узел либо красный, либо черный.
  2. Каждый лист ( {\rm nil} -узел) — черный.
  3. Если узел красный, то оба его ребенка черные.
  4. Все пути, идущие вниз от корня к листьям, содержат одинаковое количество черных узлов.

Свойства 1-4 называют RB-свойствами. Узлы красно-черного дерева будем представлять записями вида

\eq*{
{\rm Node} = ({\rm color}, {\rm key}, {\rm left},
{\rm right}, {\rm parent}).
}

Комбинаторные свойства красно-черных деревьев

Для произвольного узла x определим черную высоту bh(x) как количество черных узлов на пути из x в некоторый лист, не считая сам узел x. По свойству 4 эта сумма не зависит от выбранного листа. Черной высотой дерева будем считать черную высоту его корня.

Пусть {\rm size}[x] — количество внутренних узлов в поддереве с корнем x ( {\rm nil} -узлы не считаются).

Лемма 1. Для произвольного узла x красно-черного дерева выполняется неравенство {\rm size}[x] \ge 2^{bh(x)} - 1.

Доказательство. Если x — лист, то bh(x) = 0 и {\rm size}[x]
= 0, следовательно, утверждение леммы выполнено. Далее, пусть для узлов {\rm left}[x] и {\rm
right}[x] утверждение леммы справедливо, то есть

\eq*{
{\rm size} [{\rm left} [x]] \ge
2^{bh({\rm left} [x])}
- 1\ \t{и}\ {\rm size} [{\rm right}[x]] \ge 2^{bh({\rm right} [x])} - 1,
}

тогда

\eq*{
\begin{gathered}
{\rm size} [x] = {\rm size} [{\rm left} [x]] + {\rm size}
[{\rm right} [x]] + 1 \ge \\
\ge (2^{bh({\rm left} [x])} - 1) + (2^{bh({\rm right}[x])} -1) + 1 = \\
= 2^{bh({\rm left}[x])}+2^{\rm bh({\rm right}[x])} - 1 \ge
2^{bh(x)-1} + 2^{bh(x)-1} - 1 \ge 2^{bh(x)} - 1.
\end{gathered}
}

Предпоследнее неравенство справедливо в силу соотношения

\eq*{
bh({\rm left}[x]) \ge (bh(x) - 1)\ \t{и}\ bh({\rm right}[x]) \ge
(bh(x) - 1).
}

Лемма 2. Красно-черное дерево с n внутренними узлами ({\rm
nil} -листья не считаются ) имеет высоту не больше 2{\log}(n + 1).

Доказательство. Обозначим высоту дерева через h. Согласно свойству 3, по меньшей мере половину всех вершин на пути от корня к листу, не считая корень, составляют черные вершины. Следовательно, черная высота дерева не меньше h/2. Тогда n \ge 2^{h/2} - 1 и, переходя к логарифмам, получаем \log (n + 1) \ge h/2 или h \le 2
\log(n + 1). Лемма доказана.

Полученная оценка высоты красно-черных деревьев гарантирует выполнение операций {\rm Search}, {\rm Minimum}, {\rm
Maximum}, {\rm Successor} и {\rm
Predecessor} с красно-черными деревьями за время O(\log n). Сложнее обстоит дело с процедурами {\rm Insert} и {\rm Delete}: проблема в том, что они могут испортить структуру красно-черного дерева, нарушив RB-свойства. Поэтому описанные процедуры придется модифицировать. Ниже увидим, как можно реализовать их за время O(\log
n) с сохранением RB-свойств.

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Антон Сиротинкин
Антон Сиротинкин

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

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ