Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопрос 33-48.docx
Скачиваний:
1
Добавлен:
25.09.2019
Размер:
265.16 Кб
Скачать

Вопрос 47. В-деревья

В-дерево – структура данных, дерево поиска. Каждый элемент представляет собой массив значений, отсортированных в нужном порядке.

Пусть t – порядок дерева.

  1. В каждой вершине количество записей не превышает 2t.

  2. В дереве не должно быть пустых вершин. Для всех вершин, кроме корневой количество записей должно быть больше либо равно t. В корневой вершине должна быть как минимум 1 запись.

  3. Все терминальные вершины (листы) располагаются на 1 уровне.

  4. Если вершина содержит m элементов и не является терминальной, то количество потомков равно m+1.

Вопрос 48. Операции в в-деревьях

Поиск элемента:

Если элемент содержится в корне, то он найден. Иначе необходимо определить интервал и идти к соответствующему потомку. Повторяем, пока не дойдем до листа.

Добавление ключа

Будем называть деревом потомков некоего узла поддерево, состоящее из этого узла и его потомков.

Вначале определим функцию, которая добавляет ключ K к дереву потомков узла x. После выполнения функции во всех пройденных узлах, кроме, может быть, самого узла x, будет меньше  , но не меньше  , ключей.

  1. Если х - не лист,

    1. Определяем интервал, где должен находиться K. Пусть y - соответствующий сын.

    2. Рекурсивно добавляем K к дереву потомков y.

    3. Если узел y полон, то есть содержит   ключей, расщепляем его на два. Узел   получает первые   из ключей y и первые   его потомков, а узел   - последние   из ключей y и последние   его потомков. Медианный из ключей узла y попадает в узел х, а указатель на y в узле x заменяется указателями на узлы  и  .

  2. Если x - лист, просто добавляем туда ключ K.

Теперь определим добавление ключа K ко всему дереву. Буквой R обозначается корневой узел.

  1. Добавим K к дереву потомков R.

  2. Если R содержит теперь   ключей, расщепляем его на два. Узел   получает первые   из ключей R и первые   его потомков, а узел   - последние   из ключей R и последние   его потомков. Медианный из ключей узла R попадает вo вновь созданный узел, который становится корневым. Узлы   и   становятся его потомками.

Удаление ключа

Если корень одновременно является листом, то есть в дереве всего один узел, мы просто удаляем ключ из этого узла. В противном случае сначала находим узел, содержащий ключ, запоминая путь к нему. Пусть этот узел -  .

Если   - лист, удаляем оттуда ключ. Если в узле   осталось не меньше   ключей, мы на этом останавливаемся. Иначе мы смотрим на количество ключей в следующем, а потом в предыдущем узле. Если следующий узел есть, и в нём не менее   ключей, мы добавляем в   ключ-разделитель между ним и следующим узлом, а на его место ставим первый ключ следующего узла, после чего останавливаемся. Если это не так, но есть предыдущий узел, и в нём не менее   ключей, мы добавляем в   ключ-разделитель между ним и предыдущим узлом, а на его место ставим последний ключ предыдущего узла, после чего останавливаемся. Наконец, если и с предыдущим ключом не получилось, мы объединяем узел   со следующим или предыдущим узлом, и в объединённый узел перемещаем ключ, разделяющий два узла. При этом в родительском узле может остаться только  ключей. Тогда, если это не корень, мы выполняем аналогичную процедуру с ним. Если мы в результате дошли до корня, и в нём осталось от 1 до   ключей, делать ничего не надо, потому что корень может иметь и меньше   ключей. Если же в корне не осталось ни одного ключа, исключаем корневой узел, а его единственный потомок делаем новым корнем дерева.

Если   - не лист, а K - его  -й ключ, удаляем самый правый ключ из поддерева потомков  -го сына  , или, наоборот, самый левый ключ из поддерева потомков  -го сына  . После этого заменяем ключ K удалённым ключом. Удаление ключа происходит так, как описано в предыдущем абзаце.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]