285
правок
Изменения
B-дерево
,→Удаление ключа
=== Удаление ключа ===
<wikitex>Находим ключ, который необходимо удалить# Если удаление происходит из листа, смотрим на количество ключей в нем. Если ключей больше <tex>$t - 1</tex>$, то просто удаляем ключ. В противном случае, если существует соседний листс тем же родителем, который содержит больше <tex>$t - 1</tex> $ ключа, удалим выберем ключ -разделитель из соседа разделяющий оставшиеся ключи соседа и ключи исходного узла (то есть не больше всех из одной группы и не меньше всех из другой). Обозначим этот ключ как $k_1$. Выберем другой ключ из родительского узла, на его место поставим ключ-разделитель между исходным узлом разделяющий исходный узел и его соседомсоседа, а на его место поставим первыйкоторый был выбран ранее. Этот ключ обозначим $k_2$. Удалим из исходного узла лист, если сосед правыйкоторый нужно было удалить, или последнийспустим в этот узел $k_2$, если сосед левый, ключ соседаа вместо $k_2$ в родительском узле поставим $k_1$. Если все соседи содержат по <tex>$t - 1</tex> $ ключу, то объединяем узел с каким-либо из соседей, удаляем ключ , и добавляем ключ-разделитель между узлами из родительского узла, который был разделителем разделённых соседей, переместим в объединенный новый узел.# Рассмотрим удаление из внутреннего узла. Имеется внутренний узел$x$ и ключ, который нужно удалить, $k$. Если дочерний узел, предшествующий ключу $k$ содержит больше $t - 1$ ключа, то находим $k_1$ – предшественника $k$ в поддереве этого узла. Удаляем его. Заменяем $k$ в родительском исходном узле осталось меньше <tex>на $k_1$. Проделываем аналогичную работу, если дочерний узел, следующий за ключом $k$, имеет больше $t - 1</tex> $ ключа. Если оба (следующий и предшествующий дочерние узлы) имеют по $t - 1$ ключу, аналогичным образом добавляем в него ключи из соседей или то объединяем узел этих детей, переносим в ними.# Если удаление происходит не из листаних $k$, а далее удаляем самый левый ключ $k$ из поддерева следующего дочернего узла или самый правый из поддерева предыдущего дочернего нового узла . Если сливаются 2 последних потомка корня – то они становятся корнем, а предыдущий корень освобождается.Для удаления требуется время $O(t log_t n)$ и ставим удаленный ключ на место удаляемого ключа в исходном узлеO(h) дисковых операций.
== Вариации B-дерева ==