Модификация.


Поиск.

Задача: найти запись со значением ключа v.

Алгоритм поиска пути от корня В–дерева к некоторому листу, в котором будет находится требуемая запись, если она существует. (рекурсивный алгоритм).

a) начало поиска от корня дерева. Устанавливаем текущий уровень дерева =1.

b) пусть рассматривается узел дерева с номером «i». Возможны две ситуации:

- i – лист (это легко проверяется подсчетом текущего уровня дерева от корня и сравнением этой величины полной длинной дерева). В этом случае проверим находится ли запись с ключом v в данном блоке (главного файла). Если да – успех, если нет – записи нет, конец алгоритма;

- i – не лист, следовательно, i → блок индекса. Определим, какое значение ключа в блоке В покрывает v (учитывая, что первая запись блока не содержит ключа и первое значение покрывает все значения ключей, меньших значения ключа во второй записи).

В блоке «i» для значения ключа, которое покрывает ключ v находим указатель на другой блок.

c) увеличиваем текущий уровень дерева на 1 и повторяем данный алгоритм с пункта b) для нового блока.

 

После поиска обработка ситуации:

a)нет записи;

b) хотя бы одно поле входит в ключ (запись удаляется из внешней памяти в оперативную память, где она модифицируется, а потом снова записывается в внешнюю память).

Включение.

Включить запись с ключом v.

a) найти блок «i» , к которому эта запись относится, если запись есть в блоке «i», то аварийный останов;

b) в блоке i нет записи с ключом V:

- если в блоке меньше, чем 2е-1 запись, то запись просто включается в блок в отсортированном порядке. Эта запись некогда не может быть самой левой в блоке, если только блок «i» не является самым левым листом, т.е. нет необходимости изменять предшественника блока «i» (в индексе). Но в этом случае предшественник по уровню не корректируется, т.к. первая запись блока индекса не имеет ключа;

- если в блоке 2е-1 записи (нет места) то создадим новый блок «i1». Разделим записи этого блока с добавляемой, между двумя блоками «i» и «i1», по «е» записей (было 2е-1 и добавляем 1 =2е).

Пусть теперь «j» - отец блока «i» (j- известен, т.к. при поиске мы построили путь от корня к «i»). Применим данную процедуру включения к блоку «j» рекурсивно, но с константой d (в блок «j» добавлена запись о блоке «i1»). Если многие предки блока «i» заполнены полностью (по 2d-1 записей), то процедура расширения распространяется на несколько уровней и может достигнуть корня дерева. Если и он заполнен полностью, то его необходимо расщепить на два блока и получив у OS еще один блок создать новый корень, в котором будет две записи (т.о. размер дерева увеличится на единицу). При этом в корне в корне может быть меньше d записей (если 2d-1>3).