Декартово дерево — различия между версиями
Строка 1: | Строка 1: | ||
+ | ''Эта статья про Курево'' | ||
+ | |||
'''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: <tex>treap (tree+heap)</tex> и дерамида (дерево+пирамида). | '''Декартово дерево''' {{---}} это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название: <tex>treap (tree+heap)</tex> и дерамида (дерево+пирамида). | ||
Строка 13: | Строка 15: | ||
== Операция add== | == Операция add== | ||
− | Операция <tex>add(T, k)</tex> добавляет в дерево <tex>T</tex> элемент <tex>k</tex>, где <tex>k.x</tex> - ключ, а <tex>k.y</tex>- приоритет. | + | Операция <tex>add(T, k)</tex> добавляет в дерево <tex>T</tex> элемент <tex>k</tex>, где <tex>k.x</tex> {{---}} ключ, а <tex>k.y</tex>{{---}} приоритет. |
===Реализация №1:=== | ===Реализация №1:=== | ||
− | + | # Разбиваем наше дерево по ключу, который мы хотим добавить, то есть <tex>split(T, T_1, T_2, k.x)</tex>. | |
− | + | # Сливаем первое дерево с новым элементом, то есть <tex>merge(T_1, T_1, k)</tex>. | |
− | + | #Сливаем получившиеся дерево со вторым, то есть <tex>merge(T, T_1, T_2)</tex>. | |
Строка 29: | Строка 31: | ||
===Реализация №1:=== | ===Реализация №1:=== | ||
− | + | ||
− | + | # Разбиваем наше дерево по ключу, который мы хотим удалить, то есть <tex>split(T, T_1, T_2, x)</tex>. | |
− | + | # Теперь отделяем от второго дерева элемент <tex>x</tex>, опять таки разбивая по ключу <tex>x</tex>, то есть <tex>split(T_2, T_2, T_3, x)</tex>. | |
+ | # Сливаем первое дерево со третьим, то есть <tex>merge(T, T_1, T_3)</tex>. | ||
===Реализация №2:=== | ===Реализация №2:=== | ||
Спускаемся по дереву (как в обычном бинарном дереве поиска по <tex>x</tex>), ища удаляемый элемент. Найдя элемент, мы просто вызываем <tex>merge</tex> его левого и правого сыновей, и возвращаемое ею значение ставим на место удаляемого элемента, то есть <tex>merge(T,T.l,T.r)</tex>. | Спускаемся по дереву (как в обычном бинарном дереве поиска по <tex>x</tex>), ища удаляемый элемент. Найдя элемент, мы просто вызываем <tex>merge</tex> его левого и правого сыновей, и возвращаемое ею значение ставим на место удаляемого элемента, то есть <tex>merge(T,T.l,T.r)</tex>. |
Версия 09:34, 6 апреля 2011
Эта статья про Курево
Декартово дерево — это структура данных, объединяющая в себе бинарное дерево поиска и бинарную кучу (отсюда и второе её название:
и дерамида (дерево+пирамида).Более строго, это структура данных, которая хранит пары
в виде бинарного дерева таким образом, что она является бинарным деревом поиска по и бинарной пирамидой по . Предполагая, что все и все являются различными, получаем, что если некоторый элемент дерева содержит , то всех элементов в левом поддереве , у всех элементов в правом поддереве , а также и в левом, и в правом поддереве имеем: .Дерамиды были предложены Сиделем (Siedel) и Арагоном (Aragon) в 1996 г.
Содержание
Операция split
Тут будет split
Операция merge
А тут будет merge
Операция add
Операция
добавляет в дерево элемент , где — ключ, а — приоритет.Реализация №1:
- Разбиваем наше дерево по ключу, который мы хотим добавить, то есть .
- Сливаем первое дерево с новым элементом, то есть .
- Сливаем получившиеся дерево со вторым, то есть .
Реализация №2:
Сначала спускаемся по дереву (как в обычном бинарном дереве поиска по
), но останавливаемся на первом элементе, в котором значение приоритета оказалось меньше . Мы нашли позицию, куда будем вставлять наш элемент. Теперь вызываем от найденного элемента (от элемента вместе со всем его поддеревом), и возвращаемые ею и записываем в качестве левого и правого сына добавляемого элемента.
Операция remove
Операция
удаляет из дерева элемент с ключом .Реализация №1:
- Разбиваем наше дерево по ключу, который мы хотим удалить, то есть .
- Теперь отделяем от второго дерева элемент , опять таки разбивая по ключу , то есть .
- Сливаем первое дерево со третьим, то есть .
Реализация №2:
Спускаемся по дереву (как в обычном бинарном дереве поиска по
), ища удаляемый элемент. Найдя элемент, мы просто вызываем его левого и правого сыновей, и возвращаемое ею значение ставим на место удаляемого элемента, то есть .