Изменения
Нет описания правки
===Вставка===
Рассмотрим рекурсивный алгоритм вставки ключа <tex>x</tex> в RBST состоящее из <tex>n</tex> вершин. С вероятностью <texdpi = "150">\frac{1}{n+1}</tex> вставим ключ в корень дерева, использую процедуру insert_at_root. С вероятностью <texdpi = "150">1 - \frac{1}{n+1} = \frac{n}{n+1}</tex> вставим его в правое поддереао, если он больше корня, или в левое поддерево, если меньше. Ниже приведён псевдокод процедуры вставки insert, процедуры insert_at_root, а также процедуры split(k), разбивающей дерево на два поддерева, в одном из которых все ключи строго меньше <tex>k</tex>, а в другом больше, либо равны; приведена достаточно очевидная рекурсивная реализация. (через Node обозначен тип вершины дерева, дерево представляется как указатель на корень)
'''Node''' '''insert''' (x, T)
{{Лемма
|statement= Пусть после операции split от дерева <tex>T</tex> по ключу <tex>x</tex> были получены деревья <tex>LT_{<}</tex> и <tex>RT_{>}</tex>. Тогда если <tex>T</tex> было случайным бинарным деревом поиска, содержащим множество ключей <tex>K</tex>, то деревья <tex>LT_{<}</tex> и <tex>RT_{>}</tex> {{---}} независимые случайные бинарные деревья поиска, содержащие соответственно множества ключей <tex>K_{<} = \{y \in K | y < x\}</tex> и <tex>K_{>} = \{y \in K | y > x\}</tex>.
|proof=
Применим индукцию по <tex>n</tex> {{---}} размеру дерева. Если <tex>n = 0</tex>, то лемма верна (получим два пустых дерева).
Пусть <tex>n > 0</tex>, и лемма верна при всех меньших размерах дерева.. Пусть также <tex>y = T \rightarrow key, L = T \rightarrow left, R = T \rightarrow right</tex>. Если <tex>x > y</tex>, то <tex>y</tex> {{---}} корень <tex>T_{<}</tex>, <tex>L</tex> {{---}} левое поддерево <tex>T_{<}</tex>, а split рекурсивно вызовется от <tex>R</tex>, разделив его на <tex>R'</tex> {{---}} правое поддерево <tex>T_{<}</tex> {{---}}, и <tex>T_{>}</tex>, которые по предположению индукции будут случайными бинарными деревьями поиска. Но <tex>L</tex> также случайно, т.к. является поддеревом <tex>T</tex>.
Итак для того, чтобы доказать, что <tex>T_{<}</tex> {{---}} случайное бинарное дерево поиска, осталось показать, что любая его вершина <tex>z</tex> с вероятностью <tex dpi = "150">\frac{1}{m}</tex> окажется в корне, где <tex>m</tex> {{---}} размер <tex>T_{<}</tex>. Действительно:
(пусть <tex>A \Longleftrightarrow z</tex> {{---}} корень <tex>T_{<}</tex>)
<tex dpi = "150">P[A | y < x] = \frac{P[A \wedge y < x]}{P[y < x]} = \frac{1 / n}{m / n} = \frac{1}{m}</tex>
Случай, когда <tex>x < y</tex> симметричен рассмотренному.
}}
|statement= Если <tex>T</tex> {{---}} случайное бинарное дерево поиска, содержащее множество ключей <tex>K</tex>, <tex>x \notin K</tex>, тогда процедура insert(x, T) вернёт случайное бинарное дерево поиска <tex>T</tex>, содержащее множество ключей <tex>K \cap x</tex>.
|proof=
Применим индукцию по <tex>n</tex> {{---}} размеру дерева. Если <tex>n = 0</tex>, то теорема верна: после операции insert(x, T) получим дерево с корнем <tex>x</tex> и двумя пустыми поддеревьями.
Пусть <tex>n > 0</tex>, и теорема верна при всех меньших размерах дерева. Возможны два случая: <tex>x</tex> вставляется в корень или рекурсивно в одно из поддеревьев.
В первом случае правое и левое поддеревья <tex>x</tex> по лемме являются случайными BST, а также вероятность того, что <tex>x</tex> окажется в корне, равна <tex dpi = "150">\frac{1}{n + 1}</tex>. Т.е. новое дерево {{---}} случайное BST.
Во втором случае корень у дерева останется прежнем. Заметим, что для каждого <tex>y \in K</tex> вероятность быть корнем была <tex dpi = "150">\frac{1}{n}</tex>, а корнем он останется с вероятностью <tex dpi = "150">\frac{n}{n + 1}</tex>, тогда для каждого <tex>y \in K</tex> вероятность быть корнем равна <tex dpi = "150">\frac{1}{n} \cdot \frac{n}{n + 1} = \frac{1}{n + 1}</tex>. По предположению же индукции поддерево, в которое вставляется <tex>x</tex> становится случайным бинарным деревом поиска; а т.к. другое поддерево корня было случайным, то новое дерево {{---}} случайное BST.
}}
|statement= Пусть <tex>L</tex> и <tex>R</tex> {{---}} независимые случайные бинарные деревья поиска, содержащие соответственно множества ключей <tex>K_{L}</tex> и <tex>K_{R}</tex>, причём <tex>K_{L} < K_{R}</tex> (то есть каждый элемент <tex>K_{L}</tex> меньше каждого элемента <tex>K_{R}</tex>). Тогда <tex>T = merge(L, R)</tex> {{---}} случайное бинарное дерево поиска, содержащее множество ключей <tex>K</tex> = <tex>K_{L} \cap K_{R}</tex>.
|proof=
Пусть <tex>m</tex> и <tex>n</tex> {{---}} размеры <tex>L</tex> и <tex>R</tex> соответственно. Применим индукцию по <tex>m</tex> и <tex>n</tex>. Если <tex>m = 0</tex> или <tex>n = 0</tex>, то лемма верна.
Пусть <tex>m > 0</tex> и <tex>n > 0</tex>, пусть также <tex>L \rightarrow key = a</tex> или <tex>L \rightarrow key = b</tex>. Без потери общности делаем корнем <tex>a</tex>. После рекурсивного слияния правого поддерева <tex>L</tex> и <tex>R</tex> получим случайное бинарное дерево поиска (которое является правым поддеревом нового дерева). Левое же поддерево нового дерева тоже случайное. Также верно, что для любого <tex>x \in K_{L}</tex> вероятность быть корнем равна <tex dpi = "150">\frac{1}{m + n}</tex>: действительно, вероятность оказаться в корне в <tex>L</tex> до слияния равна <tex dpi = "150">\frac{1}{m}</tex>, вероятность того, что элемент останется корнем после слияния равна <tex dpi = "150">\frac{m}{m + n}</tex>; осталось применить правило умножения.
}}
{{Теорема
|statement= Если <tex>T</tex> {{---}} случайное бинарное дерево поиска, содержащее множество ключей <tex>K</tex>, тогда процедура delete(x, T) вернёт случайное бинарное дерево поиска <tex>T'</tex>, содержащее множество ключей <tex>K \ backslash \{x\}</tex>
|proof=
Если удаляемый элемент отсутствует в дереве, то теорема верна.
Пусть <tex>x \in T</tex> (дерево не пусто), <tex>n</tex> {{---}} размер <tex>T</tex>. Докажем теорему по индукции по <tex>n</tex>. Для <tex>n = 1</tex> теорема очевидным образом верна. Пусть <tex>n > 1</tex>, и предположим, что теорема верна для всех деревьев размера меньше <tex>n</tex>.
Возможно два случая: если <tex>x</tex> {{---}} корень <tex>T</tex>, то по лемме, после удаления получим случайное бинарное дерево поиска; если же <tex>x</tex> {{---}} не корень <tex>T</tex>, то <tex>x</tex> рекурсивно удаляется из поддерева исходного дерева, и по предположению индукции после удаления получаем случайное BST. Осталось лишь показать, что для любого <tex>y \in T, y \neq x</tex> вероятность оказаться корнем после удаления равна <tex dpi = "150">\frac{1}{n - 1}</tex>.
Введём обозначения:
<tex>A \Longleftrightarrow y</tex> {{---}} корень <tex>T'</tex>;
<tex>B \Longleftrightarrow x</tex> был корнем <tex>T</tex>;
<tex>C \Longleftrightarrow y</tex> стал корнем <tex>T'</tex> после операции merge.
<tex>D \Longleftrightarrow y</tex> был корнем <tex>T</tex>;
Тогда:
<tex>P[A] = P[A|B] \times P[B] + P[A|\neg B] \times P[\neg B] = P[C] \times 1/n + P[D|\neg B] \times (n - 1)/n = </tex>
<tex dpi = "150">\frac{1}{n - 1} \times \frac{1}{n} + \frac{1}{n - 1} \times \frac{n - 1}{n} = \frac{1}{n - 1}</tex>.
}}
== Литература ==
* Martínez, Conrado; Roura, Salvador (1997), "Randomized binary search trees", Journal of the ACM 45 (2): 288–323
* Seidel, Raimund; Aragon, Cecilia R. [http://people.ischool.berkeley.edu/~aragon/pubs/rst96.pdf «Randomized Search Trees»], 1996 г.
* [http://www.cs.uiuc.edu/class/sp09/cs473/notes/08-treaps.pdf Randomized binary search trees]. Lecture notes from a course by Jeff Erickson at UIUC. Despite the title, this is primarily about treaps and [[skip list]]s; randomized binary search trees are mentioned only briefly.