Декартово дерево — различия между версиями
| Строка 13: | Строка 13: | ||
== Операция add== | == Операция add== | ||
| − | Операция <tex> | + | Операция <tex>add(T, k)</tex> добавляет в дерево <tex>T</tex> элемент <tex>k</tex>. |
| − | Наивная реализация: | + | ===Наивная реализация:=== |
| − | <p>1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть <tex>split(T, | + | <p>1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть <tex>split(T, T_1, T_2, k)</tex>.</p> |
| − | <p>2) Сливаем первое дерево с новым элементом, то есть <tex>merge( | + | <p>2) Сливаем первое дерево с новым элементом, то есть <tex>merge(T_1, T_1, k)</tex>.</p> |
| − | <p>3) Сливаем получившиеся дерево со вторым | + | <p>3) Сливаем получившиеся дерево со вторым, то есть <tex>merge(T, T_1, T_2)</tex>. </p> |
== Операция remove == | == Операция remove == | ||
| + | Операция <tex>remove(T, k)</tex> удаляет из дерева <tex>T</tex> элемент <tex>k</tex>. | ||
| + | |||
| + | ===Наивная реализация:=== | ||
| + | <p>1) Разбиваем наше дерево по ключу, который мы хотим удалить, то есть <tex>split(T, T_1, T_2, k)</tex>.</p> | ||
| + | <p>2) Теперь отделяем от (первого, второго) дерева элемент <tex>k</tex>, опять таки разбивая по ключу <tex>k</tex>, то есть <tex>Split(T_1, T_1, T_3, k+1)</tex>.</p> | ||
| + | <p>3) Сливаем первое дерево со третьим, то есть <tex>merge(T, T_1, T_3)</tex>. </p> | ||
Версия 00:38, 6 апреля 2011
Декартово дерево — это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: и дерамида (дерево+пирамида).
Более строго, это структура данных, которая хранит пары в виде бинарного дерева таким образом, что она является бинарным деревом поиска по и бинарной пирамидой по . Предполагая, что все и все являются различными, получаем, что если некоторый элемент дерева содержит , то всех элементов в левом поддереве , у всех элементов в правом поддереве , а также и в левом, и в правом поддереве имеем: .
Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г.
Содержание
Операция split
Тут будет split
Операция merge
А тут будет merge
Операция add
Операция добавляет в дерево элемент .
Наивная реализация:
1) Разбиваем наше дерево по ключу, который мы хотим добавить, то есть .
2) Сливаем первое дерево с новым элементом, то есть .
3) Сливаем получившиеся дерево со вторым, то есть .
Операция remove
Операция удаляет из дерева элемент .
Наивная реализация:
1) Разбиваем наше дерево по ключу, который мы хотим удалить, то есть .
2) Теперь отделяем от (первого, второго) дерева элемент , опять таки разбивая по ключу , то есть .
3) Сливаем первое дерево со третьим, то есть .