Необходимое процессорное время равно O(th) = O(t log
t
n). Поскольку в
TBTree.InsertNonFull использована оконечная рекурсия, ее можно реализовать
итеративно с помощью цикла while, наглядно показывающего, что количество
страниц, которые должны находиться в оперативной памяти, в любой момент
времени равно O(1).
3.1.2. Операция удаления ключа.
Удаление ключа из В-дерева, хотя и аналогично вставке, представляет собой
более сложную задачу. Это связано с тем, что ключ может быть удален из любого
узла, а не только из листа, а удаление из внутреннего узла требует определенной
перестройки дочерних узлов. Как и в случае вставки, мы должны обеспечить,
чтобы при выполнении операции удаления не были нарушены свойства В-дерева.
Аналогично тому, как мы имели возможность убедиться, что узлы не
слишком сильно заполнены для вставки нового ключа, нам предстоит убедиться,
что узел не становится слишком мало заполнен в процессе удаления ключа (за
исключением корневого узла, который может иметь менее t-1 ключей, хотя и не
может иметь более 2t-1 ключей).
При удалении ключа могут возникнуть следующие случаи:
1. Если ключ k находится в узле x и x является листом — удаляем k из x.
2. Если ключ k находится в узле x и x является внутренним узлом, выполняем
следующие действия:
1) Если дочерний по отношению к x узел y, предшествующий ключу k в
узле x, содержит не менее t ключей, то находим k` — предшественника k
в поддереве, корнем которого является y. Рекурсивно удаляем k` и
заменяем k в x ключом k`. (Поиск ключа k` и удаление его можно
выполнить в процессе одного нисходящего прохода.)
2) Ситуация, симметричная ситуации а) если дочерний по отношению к x
узел z, следующий за ключом k в узле x, содержит не менее t ключей, то
15