Участник:Flanir1

Материал из Викиконспекты
Версия от 14:15, 10 мая 2015; Flanir1 (обсуждение | вклад) (Новая страница: «right|300px|thumb|Пример 2-3 дерева‎ ''' 2-3 дерево ''' — структура данных, пред...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Пример 2-3 дерева

2-3 дерево — структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. 2-3 дерево можно обобщить до B+-дерева.

Структура

  • Все данные хранятся в листьях, в вершинах хранится вспомогательная информация,необходимая для организации поиска по поддеревьям.
  • Сыновья упорядочены по значению максимума поддерева сына.
  • Нелистовые вершины содержат 1 или 2 ключа, указывающие на диапазон значений в их поддеревьях.
  • Если нелистовая вершина имеет двух сыновей, то вершина хранит минимум правого поддерева; если трех, то первый ключ равен минимуму среднего поддерева, а второй ключ равен минимуму правого поддерева.
  • 2-3 деревья сбалансированы, то есть каждое левое, правое, и центральное поддерево одинаковой высоты, и таким образом содержат равное (или почти равное) число данных.
  • Высота 2-3 дерева [math]O(\log{n})[/math], где [math] n [/math] - количество элементов в дереве, поэтому операции поиска, добавления, удаления, слияния выполняются за время [math]O(\log{n})[/math].

Операции

Поиск

Для поиска в 2-3 дереве необходимо последовательно просматривать ключи, хранящиеся во внутренних ячейках, спускаясь от корня к листьям. Вначале ключ искомого элемента сравнивается с первым ключом ячейки и, если искомый ключ меньше, то осуществляется переход в левое поддерево. Иначе, сравниваем искомый ключ со вторым ключом в ячейке (если второго ключа нет — поддерева всего два, то сразу переходим во второе поддерево) и если наш ключ не превосходит второй ключ, то осуществляется переход в среднее поддерево, а если превосходит, то идем в правое поддерево.

Вставка элемента

Есть два варианта вставки в 2-3 дерево.

1) Чтобы поместить новый ключ в узел, в котором содержится ровно один ключ, необходимо просто добавить его как второй ключ к узлу.

23treeadd3.png 23treeadd4.png

2) Если же в узле уже содержатся два ключа, делим его на два "одноключевых" узла и вставляем средний ключ в родительский узел.Это может привести к тому, что придется делить родительский узел. Тогда таким же образом проходим до корня дерева.

23treeadd1.png 23treeadd2.png

Удаление элемента

При удалении ключа из узла возникают три варианта.

1) Если после удаления ключа в узле содержится два ключа, то после удаления ничего не меняется.

2) Если же у ключа после удаления остался один элемент, то проверяем количество потомков второго ребенка того узла, ребенком которого является узел с удаляемым ключом. Если у него два ребенка, то присваиваем ему оставшийся один элемент. Вершину, оставшуюся без детей, удаляем рекурсивно.

23treedel1.png 23treedel2.png 23treedel5.png

3) Иначе у него три ребенка. Тогда присваиваем узлу с одним ключом один из этих ключей, таким образом получая два узла с двумя ключами.

23treedel3.png 23treedel4.png 23treedel6.png

Слияние двух деревьев

Возможно два варианта слияния двух деревьев.

1) Если два дерева одной высоты, то слияние представляет собой добавление общей вершины.

23treemerge1.png 23treemerge2.png

2) Если два дерева разной высоты, то при слиянии меньшее добавляем как поддерево к одной из вершин большего. Если возникает ситуация,когда у необходимого узла уже есть три ребенка, то делим его на два узла с двумя поддеревьями, переходим в родителя.Таким образом будем проходим по дереву вверх пока дерево не станет корректным.

23treemerge3.png 23treemerge4.png

Cсылки

См. также