Декартово дерево — различия между версиями
Строка 1: | Строка 1: | ||
− | '''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: treap (tree+heap) и дерамида (дерево+пирамида). | + | '''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: <tex>treap (tree+heap)</tex> и дерамида (дерево+пирамида). |
− | Более строго, это структура данных, которая хранит пары (X,Y) в виде бинарного дерева таким образом, что она является бинарным деревом поиска по x и бинарной пирамидой по y. Предполагая, что все X и все Y являются различными, получаем, что если некоторый элемент дерева содержит ( | + | Более строго, это структура данных, которая хранит пары <tex> (X,Y) </tex> в виде бинарного дерева таким образом, что она является бинарным деревом поиска по <tex>x</tex> и бинарной пирамидой по <tex>y</tex>. Предполагая, что все <tex>X</tex> и все <tex>Y</tex> являются различными, получаем, что если некоторый элемент дерева содержит <tex>(X_0,Y_0)</tex>, то <tex>у</tex> всех элементов в левом поддереве <tex>X < X_0</tex>, у всех элементов в правом поддереве <tex> X > X_0</tex>, а также и в левом, и в правом поддереве имеем: <tex> Y < Y_0</tex>. |
Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г. | Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г. | ||
Строка 12: | Строка 12: | ||
А тут будет merge | А тут будет merge | ||
− | == Операция add == | + | == Операция add== |
+ | Операция <tex>Add(T, k)</tex> добавляет в дерево <tex>T</tex> элемент <tex>k</tex>. | ||
+ | |||
+ | Наивная реализация: | ||
+ | 1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть <tex>split(T, k, T1, T2)</tex>. | ||
+ | 2) Сливаем первое дерево с новым элементом, то есть <tex>merge(T1, T1, k)</tex>. | ||
+ | 3) Сливаем получившиеся дерево со вторым. то есть <tex>merge(T, T1, T2)</tex>. | ||
+ | |||
== Операция remove == | == Операция remove == |
Версия 00:19, 6 апреля 2011
Декартово дерево — это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название:
и дерамида (дерево+пирамида).Более строго, это структура данных, которая хранит пары
в виде бинарного дерева таким образом, что она является бинарным деревом поиска по и бинарной пирамидой по . Предполагая, что все и все являются различными, получаем, что если некоторый элемент дерева содержит , то всех элементов в левом поддереве , у всех элементов в правом поддереве , а также и в левом, и в правом поддереве имеем: .Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г.
Операция split
Тут будет split
Операция merge
А тут будет merge
Операция add
Операция
добавляет в дерево элемент .Наивная реализация: 1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть
. 2) Сливаем первое дерево с новым элементом, то есть . 3) Сливаем получившиеся дерево со вторым. то есть .