B-дерево — различия между версиями
Borisov (обсуждение | вклад) (→См. также) |
Borisov (обсуждение | вклад) |
||
Строка 28: | Строка 28: | ||
# Если удаление происходит из листа, смотрим на количество ключей в нем. Если ключей больше <tex>t - 1</tex>, то просто удаляем ключ. В противном случае, если существует соседний лист, который содержит больше <tex>t - 1</tex> ключа, удалим ключ из исходного узла, на его место поставим ключ-разделитель между исходным узлом и его соседом, а на его место поставим первый, если сосед правый, или последний, если сосед левый, ключ соседа. Если все соседи содержат по <tex>t - 1</tex> ключу, то объединяем узел с каким-либо из соседей, удаляем ключ и добавляем ключ-разделитель между узлами в объединенный узел. Если в родительском узле осталось меньше <tex>t - 1</tex> ключа, аналогичным образом добавляем в него ключи из соседей или объединяем узел в ними. | # Если удаление происходит из листа, смотрим на количество ключей в нем. Если ключей больше <tex>t - 1</tex>, то просто удаляем ключ. В противном случае, если существует соседний лист, который содержит больше <tex>t - 1</tex> ключа, удалим ключ из исходного узла, на его место поставим ключ-разделитель между исходным узлом и его соседом, а на его место поставим первый, если сосед правый, или последний, если сосед левый, ключ соседа. Если все соседи содержат по <tex>t - 1</tex> ключу, то объединяем узел с каким-либо из соседей, удаляем ключ и добавляем ключ-разделитель между узлами в объединенный узел. Если в родительском узле осталось меньше <tex>t - 1</tex> ключа, аналогичным образом добавляем в него ключи из соседей или объединяем узел в ними. | ||
# Если удаление происходит не из листа, удаляем самый левый ключ из поддерева следующего дочернего узла или самый правый из поддерева предыдущего дочернего узла и ставим удаленный ключ на место удаляемого ключа в исходном узле. | # Если удаление происходит не из листа, удаляем самый левый ключ из поддерева следующего дочернего узла или самый правый из поддерева предыдущего дочернего узла и ставим удаленный ключ на место удаляемого ключа в исходном узле. | ||
+ | |||
+ | == Ссылки == | ||
+ | * T. H. Cormen «Introduction to Algorithms» third edition, Chapter 18 | ||
== См. также == | == См. также == |
Версия 15:38, 20 марта 2012
B-дерево — дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за
.B-дерево было впервые предложено Р. Бэйером и Е. МакКрейтом в 1970 году.
Содержание
Структура
B-дерево является идеально сбалансированным, то есть глубина всех его листьев одинакова.
Каждый узел B-дерева, кроме корня, содержит от
до ключей. Корень содержит от до ключей. — параметр дерева, не меньший . Ключи в каждом узле упорядочены.Каждый узел дерева, кроме листьев, содержащий ключи
, имеет сына. -й сын содержит ключи из отрезка .Назначение
B-деревья используются для хранения информации на жёстком диске. Время произвольного доступа к жёсткому диску очень велико, поэтому важно уменьшить количество узлов, просматриваемых при каждой операции, то есть высоту дерева, что достигается путём высокой ветвистости.
Поиск ключа
Если ключ содержится в текущем узле, возвращаем его. Иначе определяем интервал и переходим к соответствующему сыну. Повторяем пока ключ не найден или не дошли до листа.
Добавление ключа
Ищем лист, в который можно добавить ключ, совершая проход от корня к листьям. Если найденный узел не заполнен, добавляем в него ключ. Иначе разбиваем узел на два узла, в первый добавляем первые
ключей, во второй — последние ключей. Добавляем ключ в один из этих узлов. Оставшийся средний элемент добавляем в узел родителя, если он заполнен — повторяем пока не встретим не заполненный узел или не дойдем до корня. В последнем случае корень разбивается на два узла и высота дерева увеличивается.Удаление ключа
Находим ключ, который необходимо удалить
- Если удаление происходит из листа, смотрим на количество ключей в нем. Если ключей больше , то просто удаляем ключ. В противном случае, если существует соседний лист, который содержит больше ключа, удалим ключ из исходного узла, на его место поставим ключ-разделитель между исходным узлом и его соседом, а на его место поставим первый, если сосед правый, или последний, если сосед левый, ключ соседа. Если все соседи содержат по ключу, то объединяем узел с каким-либо из соседей, удаляем ключ и добавляем ключ-разделитель между узлами в объединенный узел. Если в родительском узле осталось меньше ключа, аналогичным образом добавляем в него ключи из соседей или объединяем узел в ними.
- Если удаление происходит не из листа, удаляем самый левый ключ из поддерева следующего дочернего узла или самый правый из поддерева предыдущего дочернего узла и ставим удаленный ключ на место удаляемого ключа в исходном узле.
Ссылки
- T. H. Cormen «Introduction to Algorithms» third edition, Chapter 18