Изменения

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

AA-дерево

356 байт добавлено, 02:04, 20 декабря 2016
Нет описания правки
#'''Skew(T)''' {{---}} устранение левого горизонтального ребра.
[[Файл: Skew.png]]   '''function''' skew '''is''' '''input''': (T, a node representing an AA tree that needs to be rebalanced. '''output''': Another node representing the rebalanced AA tree. )
'''if''' T == NULL '''then'''
'''return''' NULL
'''return''' T
'''else''' '''if''' level(left(T)) == level(T) '''then'''
Swap the pointers of horizontal left links.<font color=green> //Меняем указатель горизонтального левого ребра</font>
L = left(T)
left(T) := right(L)
'''end''' '''function'''
[[Файл: Skew.png]]
#'''Split(T)''' {{---}} устранение двух последовательных правых горизонтальных ребер.
[[Файл: Split_rb.png]]  '''function''' split '''is''' '''input''': (T, a node representing an AA tree that needs to be rebalanced. '''output''': Another node representing the rebalanced AA tree. )
'''if''' nil(T) '''then'''
'''return''' Nil
'''return''' T
'''else''' '''if''' level(T) == level(right(right(T))) '''then'''
We have two horizontal right links<font color=green> //Существует два правых горизонтальных ребра. Take the middle nodeБерем центральную вершину, elevate it, and return it."поднимаем" ее и возвращаем указатель на нее</font>
R = right(T)
right(T) := left(R)
'''end''' '''if'''
'''end function'''
 
[[Файл: Split_rb.png]]
== Операции ==
Рекурсивная реализация. Спускаемся от корня вниз по дереву, сравнивая ключи; вставляем новую вершину; выходя из рекурсии и выполняем балансировку: skew и split для каждой вершины.
'''function''' insert '''is''' '''input''': (X, the value to be inserted, and T, the root of the tree to insert it into.) '''output''': A balanced version T including <font color=green>//X.- вставляемое значение, Т - корень дерева, в который вставляется вершина</font>
Do the normal binary tree insertion procedure. Set the result of the
recursive call to the correct child in case a new node was created or the
root of the subtree changes.
'''if''' nil(T) '''then'''
Create a new leaf node with X.
right(T) := insert(X, right(T))
'''end if'''
Note that the case of <font color=green>//Случай X == value(T) is unspecifiedне определен. As given, an insert will have no effectТ. The implementor may desire different behaviorе.вставка не будет иметь никакого эффекта, возможны различные варианты обработки, в зависимости от решаемой задачи</font>
Perform skew and then split. The conditionals that determine whether or
not a rotation will occur or not are inside of the procedures, as given
above.
T := skew(T)
T := split(T)
Чтобы сохранять баланс дерева необходимо делать skew, split и корректировку уровня для каждой вершины.
'''function''' delete '''is''' '''input''': (X, the value to delete, and T, the root of the tree from which it should be deleted.) '''output''': T<font color=green>//X - удаляемый элемент, balancedТ - корень дерева, without the value X.из которого он должен быть удален</font>
'''if''' nil(T) '''then'''
left(T) := delete(X, left(T))
'''else'''
If we're a leaf, easy, otherwise reduce to leaf case.
'''if''' leaf(T) '''then'''
'''return''' Nil
'''end if'''
'''end if'''
Rebalance the tree<font color=green>//Сбалансируем дерево. Decrease the level of all nodes in this level if necessaryЕсли необходимо, уменьшим поля "уровень" у вершин на данном уровне, and then и затем skew and и split all nodes in the new level.все вершины на новом уровне</font>
T := decrease_level(T)
T := skew(T)
'''end function'''
'''function''' decrease_level '''is''' '''input''': (T, a tree for which we want to remove links that skip levels. '''output''': T with its level decreased.)
should_be = min(level(left(T)), level(right(T))) + 1
== Эффективность ==
Скорость работы AA - дерева эквивалентна скорости работы красно-черного дерева. В среднем более простые алгоритмы на AA - дерева выполняются быстрее, но в красно-черном дереве делается меньше поворотов, что уравновешивает асимптотику.
 
== См. также ==
* [[B-дерево]]
* [[Splay-дерево]]
* [[АВЛ-дерево]]
* [[Декартово дерево]]
* [[Красно-черное дерево]]
 
 
== Источники информации ==
* [http://user.it.uu.se/~arnea/ps/simp.pdf {{---}} Balanced searched trees made simple]
* [https://en.wikipedia.org/wiki/AA_tree {{---}} AA - tree]
* [https://habrahabr.ru/post/110212/ {{---}} AA-Tree или простое бинарное дерево]
 
 
 
[[Категория:Дискретная математика и алгоритмы]]
[[Категория:Структуры данных]]
[[Категория:Деревья поиска]]
302
правки

Навигация