Изменения

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

B+-дерево

1298 байт добавлено, 20:46, 31 марта 2018
Нет описания правки
=== Удаление ===
Поскольку все ключи находятся в листах, для удаления в первую очередь необходимо найти листовой узел, в котором он находится. Если узел содержит не менее <tex>t - 1</tex> ключей, где <tex>t</tex> {{---}} это степень дерева, то удаление завершено. Иначе необходимо выполнить попытку перераспределения элементов, то есть добавить в узел элемент из левого или правого брата (не забыв обновить информацию в родителе). Если это невозможно, необходимо выполнить слияние с братом и удалить ключ, который указывает на удалённый узел. Объединение может распространяться на корень, тогда происходит уменьшение высоты дерева.Так как мы считаем, что в дереве не может находиться 2 одинаковых ключей, то <tex>delete</tex> будет возвращать был ли удален ключ.   '''bool''' delete(T: '''BPlusTree''', key: '''int'''): leaf = find_key(T, key) pos = 0 '''while''' pos < leaf.key_num '''and''' leaf.key[pos] < key ++pos '''if''' pos == leaf.key_num '''or''' leaf.key[pos] <tex>\neq</tex> key '''return false''' '''else''' delete_in_node(leaf, key) '''return true'''  '''void''' delete_in_node(tec: '''Node''', key: '''int'''): pos = 0 '''while''' pos < tec.key_num '''and''' tec.key[pos] < key ++pos '''if''' pos == tec.key_num '''or''' tec.key[pos] <tex>\neq</tex> key '''return''' '''for''' i = pos '''to''' tec.key_num - 1 tec.key[i] = tec.key[i+1] '''for''' i = pos + 1 '''to''' tec.key_num tec.pointers[i] = tec.pointer[i+1] --tec.key_num '''if''' leaf.key_num < t - 1 right_sibling = tec.right left_sibling = tec.left '''if''' left_sibling <tex>\neq</tex> null '''and''' left_sibling.key_num <tex>\small{\geqslant}</tex> t - 1 '''return true'''
== Примeчания ==
<references/>
286
правок

Навигация