Декартово дерево — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
'''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: treap (tree+heap) и дерамида (дерево+пирамида).
+
'''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: <tex>treap (tree+heap)</tex> и дерамида (дерево+пирамида).
  
Более строго, это структура данных, которая хранит пары (X,Y) в виде бинарного дерева таким образом, что она является бинарным деревом поиска по x и бинарной пирамидой по y. Предполагая, что все X и все Y являются различными, получаем, что если некоторый элемент дерева содержит (X0,Y0), то у всех элементов в левом поддереве X < X0, у всех элементов в правом поддереве X > X0, а также и в левом, и в правом поддереве имеем: Y < Y0.
+
Более строго, это структура данных, которая хранит пары <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

Декартово дерево — это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: [math]treap (tree+heap)[/math] и дерамида (дерево+пирамида).

Более строго, это структура данных, которая хранит пары [math] (X,Y) [/math] в виде бинарного дерева таким образом, что она является бинарным деревом поиска по [math]x[/math] и бинарной пирамидой по [math]y[/math]. Предполагая, что все [math]X[/math] и все [math]Y[/math] являются различными, получаем, что если некоторый элемент дерева содержит [math](X_0,Y_0)[/math], то [math]у[/math] всех элементов в левом поддереве [math]X \lt X_0[/math], у всех элементов в правом поддереве [math] X \gt X_0[/math], а также и в левом, и в правом поддереве имеем: [math] Y \lt Y_0[/math].

Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г.

Операция split

Тут будет split

Операция merge

А тут будет merge

Операция add

Операция [math]Add(T, k)[/math] добавляет в дерево [math]T[/math] элемент [math]k[/math].

Наивная реализация: 1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть [math]split(T, k, T1, T2)[/math]. 2) Сливаем первое дерево с новым элементом, то есть [math]merge(T1, T1, k)[/math]. 3) Сливаем получившиеся дерево со вторым. то есть [math]merge(T, T1, T2)[/math].


Операция remove