Изменения

Перейти к: навигация, поиск

Tango-дерево

130 байт убрано, 04:47, 9 июня 2014
Нет описания правки
===Поиск===
Поиск элемента в <tex>tango </tex> дереве схож с поиском в стандартном обычном дереве поиска.
Начинаем с поиска в жирном пути корня <tex>tango-</tex> дерева –- <tex>splay-</tex> дереве.
Если текущий жирный путь не содержит искомый элемент, то сделаем переход по вспомогательной ссылке(красная стрелка) и осуществим поиск останавливается на родителе корня поддерева, содержащего нужное значениев новом жирном пути(<tex>splay</tex> дереве).
Пройдем по вспомогательной ссылке(красная стрелка) и осуществим поиск в новом жирном пути(splay-дереве). Поиск в <tex>splay-</tex> дереве(синем) дереве = высота от количества вершин (количество вершин = длине жирного пути = <tex>log n</tex>) = <tex>log log n</tex>.
Поиск во всем дереве = <tex>(log log n)</tex> * число проходов по нежирному ребру.
===Перестройка дерева===
Для того, чтобы сохранить структуру <tex>tango </tex> дерева (<tex>splay </tex> дерево соответствует текущему жирному пути), мы должны обновлять дерево его каждый раз, когда жирные ребра изменяются в результате поиска.
После изменения жирного ребра верхняя часть жирного пути отделяется от нижней части (которая становится самостоятельным жирным путем) и присоединяется к другому жирному пути (который становится нижней частью).
Во-первых, мы должны хранить в запомнить для каждой вершине вершины нашего splay изначального дерева поиска дополнительную информацию: Dep <tex>minChild</tex> - глубину?? вершины , minDep - минимальное значение ребенка в поддереве текущей вершины, maxDep <tex>maxChild</tex> -- максимальное значение ребенка.Во-вторых, нам понадобятся операции split и merge, которые работают за O(log k), где k - число узлов в splay-деревеподдереве.
Пусть для тогоВо-вторых, чтобы найти вершину x, которая находилась в дереве Fнам понадобятся операции split и merge, мы прошли по тонкому ребру из вершины tкоторые работают за <tex>O(log k)</tex>, находящейся где <tex>k</tex> - число узлов в <tex>splay</tex> дереве A.Значит, нам нужно объединить деревья A и F и вырезать из дерева A подддерево B, в которое ведет жирное ребро из вершины t.
Пусть поддерево B - правоедля того, чтобы найти вершину <tex>x</tex>, которая находится в дереве <tex>F</tex>, мы прошли по тонкому ребру из вершины <tex>t</tex>, находящейся в дереве <tex>A</tex>. Для левого аналогичноЗначит, нам нужно объединить деревья <tex>A</tex> и <tex>F</tex> и вырезать из дерева <tex>A</tex> подддерево <tex>D</tex>, в которое ведет жирное ребро из вершины <tex>t</tex>.
1) Так как мы знаем интервал значений [l', r'] вершины t в ее правом поддереве B, сделаем по концам отрезка две операции split. Теперь мы можем отрезать Пусть поддерево B.2) Мы знаем, что все ключи дерева F меньше t(так как бинарное дерево поиска), поэтому выполним операцию split по максимальному значению, меньшему t.3) Выполним операцию merge деревьев F и С.4) Выполним операцию merge деревьев FC и <tex>D</tex> -- правое.5) Выполним операцию merge деревьев . и ..Для левого аналогично.
# Так как мы знаем интервал значений <tex>[l', r']</tex> вершины <tex>t</tex> в ее правом поддереве <tex>D</tex>, сделаем по концам отрезка две операции <tex>split</tex>. Теперь мы можем отрезать поддерево <tex>D</tex>.# Все ключи дерева <tex>F</tex> меньше <tex>t</tex>(так как бинарное дерево поиска), поэтому выполним операцию <tex>split</tex> по максимальному значению <tex>m</tex>, меньшему <tex>t</tex>.# Выполним операцию merge деревьев <tex>F</tex> и <tex>H</tex>.# Выполним операцию merge деревьев <tex>FH</tex> и <tex>G</tex>.# Выполним операцию merge деревьев <tex>FGH</tex> и <tex>E</tex>.# Проведем тонкое ребро от вершины <tex>t </tex> к дереву B<tex>D</tex>.
Таким образом,
перестройка = <tex>3 * split + 3 * merge</tex>, каждый из них за <tex>log log n = (O(1) + 3*O(log log n) + 3*O(log log n))</tex> * число изменений жирного ребра.
//Смотрим интервал в базовом дереве – какой диапазон ключей соответствует нашему сыну,
//вырезаем этот диапазон с помощью двух сплитов по <tex>r_{min}</tex> и по <tex>r_{max}</tex>.
//В новое независимое дерево ставим красный указатель на вершину.
====Пример====
170
правок

Навигация