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.
- Если в узле осталось меньше ключей.
- Если узел не является листом, удаляем из него ключ, а на его место ставим