Декартово дерево — различия между версиями
| Строка 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) Сливаем получившиеся дерево со вторым. то есть .