B-дерево — различия между версиями
Mityada (обсуждение | вклад) (→Структура) |
Mityada (обсуждение | вклад) |
||
Строка 22: | Строка 22: | ||
Ищем лист, в который можно добавить ключ, совершая проход от корня к листьям. Если найденный узел не заполнен, добавляем в него ключ. Иначе разбиваем узел на два узла, в первый добавляем первые <tex>t - 1</tex> ключей, во второй — последние <tex>t - 1</tex> ключей. Добавляем ключ в один из этих узлов. Оставшийся средний элемент добавляем в узел родителя, если он заполнен — повторяем пока не встретим не заполненный узел или не дойдем до корня. В последнем случае корень разбивается на два узла и высота дерева увеличивается. | Ищем лист, в который можно добавить ключ, совершая проход от корня к листьям. Если найденный узел не заполнен, добавляем в него ключ. Иначе разбиваем узел на два узла, в первый добавляем первые <tex>t - 1</tex> ключей, во второй — последние <tex>t - 1</tex> ключей. Добавляем ключ в один из этих узлов. Оставшийся средний элемент добавляем в узел родителя, если он заполнен — повторяем пока не встретим не заполненный узел или не дойдем до корня. В последнем случае корень разбивается на два узла и высота дерева увеличивается. | ||
+ | |||
+ | == Удаление ключа == | ||
+ | |||
+ | # Находим узел, содержащий ключ, который необходимо удалить. | ||
+ | # Если узел является листом и корнем одновременно, удаляем из него ключ. | ||
+ | # Если узел является листом, удаляем из него ключ. | ||
+ | ## Если в узле осталось меньше <tex>t - 1</tex> ключей. | ||
+ | ### Если у узла есть следующий брат и в нем не менее <tex>t</tex> ключей, добавляем в узел ключ из родителя, находящийся между ним и следующим сыном, а на его место ставим первый ключ брата. | ||
+ | ### Если у узла есть предыдущий брат и в нем не менее <tex>t</tex> ключей, добавляем в узел ключ из родителя, находящийся между ним и предыдущим сыном, а на его место ставим последний ключ брата. | ||
+ | ### Если у братьев меньше <tex>t</tex> ключей, объединяем узел с предыдущим или следующим братом и добавляем в получившийся узел ключ из родителя, разделявший узлы. Если у родителя осталось менее <tex>t - 1</tex> ключей и родитель не является корнем, переходим к пункту 3.1. | ||
+ | # Если узел не является листом, удаляем из него ключ, а на его место ставим |
Версия 06:08, 17 мая 2011
B-дерево — дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за
.B-дерево было впервые предложено Р. Бэйером и Е. МакКрейтом в 1970 году.
Структура
B-дерево является идеально сбалансированным, то есть глубина всех его листьев одинакова.
Каждый узел B-дерева, кроме корня, содержит от
до ключей. Корень содержит от до ключей. — параметр дерева, не меньший . Ключи в каждом узле упорядочены.Каждый узел дерева, кроме листьев, содержащий ключи
, имеет сына. -й сын содержит ключи из интервала .Назначение
B-деревья используются для хранения информации на жёстком диске. Время произвольного доступа к жёсткому диску очень велико, поэтому важно уменьшить количество узлов, просматриваемых при каждой операции, то есть высоту дерева, что достигается путём высокой ветвистости.
Поиск ключа
Если ключ содержится в текущем узле, возвращаем его. Иначе определяем интервал и переходим к соответствующему сыну. Повторяем пока ключ не найден или не дошли до листа.
Добавление ключа
Ищем лист, в который можно добавить ключ, совершая проход от корня к листьям. Если найденный узел не заполнен, добавляем в него ключ. Иначе разбиваем узел на два узла, в первый добавляем первые
ключей, во второй — последние ключей. Добавляем ключ в один из этих узлов. Оставшийся средний элемент добавляем в узел родителя, если он заполнен — повторяем пока не встретим не заполненный узел или не дойдем до корня. В последнем случае корень разбивается на два узла и высота дерева увеличивается.Удаление ключа
- Находим узел, содержащий ключ, который необходимо удалить.
- Если узел является листом и корнем одновременно, удаляем из него ключ.
- Если узел является листом, удаляем из него ключ.
- Если в узле осталось меньше
- Если у узла есть следующий брат и в нем не менее ключей, добавляем в узел ключ из родителя, находящийся между ним и следующим сыном, а на его место ставим первый ключ брата.
- Если у узла есть предыдущий брат и в нем не менее ключей, добавляем в узел ключ из родителя, находящийся между ним и предыдущим сыном, а на его место ставим последний ключ брата.
- Если у братьев меньше ключей, объединяем узел с предыдущим или следующим братом и добавляем в получившийся узел ключ из родителя, разделявший узлы. Если у родителя осталось менее ключей и родитель не является корнем, переходим к пункту 3.1.
ключей.
- Если в узле осталось меньше
- Если узел не является листом, удаляем из него ключ, а на его место ставим