Как ввести записи с ключами в изначально пустое дерево B +?

11

Показать результат ввода записей с ключами в порядке (1, 2, 3, 4, 5) в изначально пустое B + -дерево порядка m = 3. В случае переполнения разделить узел и не перераспределять ключи к соседям. Можно ли вводить записи с ключами в другом порядке, чтобы дерево было меньшей высоты?

Из внутренних данных реляционной СУБД, глава 5: Динамические древовидные структуры, стр. 50

Я не очень хорош в этом, я попытался сделать ≤ слева и> справа:

До вставки 1,2:

введите описание изображения здесь

Затем, поскольку мы должны разделить узел, а не перераспределять ключи между соседями (я понимаю это как son-узлы), я вставил только справа от ячейки с 2:

введите описание изображения здесь

И я продолжил делать то же самое с вставкой 5:

введите описание изображения здесь

Но это довольно странно, я никогда не видел пустых узлов, подобных этим ... И я не знаю, соблюдает ли он некоторые базовые свойства B-деревьев:

  • каждый узел имеет не более (m-1) ключей и не менее (⌈ (m / 2) ⌉-1) ключей, если только ключ не может быть пустым, и я понимаю ключ как «указатель».

Первая попытка: ошибка в заказе выявила неоднозначное дерево

Сначала я неправильно понял, что такое «порядок» (максимальное количество детей на узел). Поэтому я подумал, что узел может иметь три пробела (и, следовательно, 4 дочерних элемента. Я создавал дерево порядка 4, я думаю:

До вставки 1,2,3:

введите описание изображения здесь

Вставка 4, поскольку мы должны разделить узел, а не перераспределять ключи соседям (что кажется противоречивым), я бы оставил 1,2,3 и 4,5 на правом листе после 3:

B дерево порядка 3 после вставки 4 и 5

Революция для Моники
источник

Ответы:

6

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

Обратите внимание, что рост находится на вершине дерева, и это является внутренней характеристикой B-дерева, чтобы гарантировать важные свойства, что у него всегда есть все листья на одном уровне, и каждый узел, отличный от корня, по крайней мере 50% заполнено.

(Мой акцент.)

Из связанной книги:

Определение 5.1 AB – дерево порядка m (m ≥ 3) ... каждый узел содержит не более m - 1 ключей

Упражнение предназначено для m = 3, поэтому не более 2 ключей на узел.

Первые два ключа просты - они идут на первую страницу:

A:[1,2]

Я собираюсь использовать искусство ASCII. Я буду помечать каждую страницу в последовательности, которую они создали, и показывать ключи / указатели на странице. Таким образом, страница P, содержащая ключевые значения k1 и k2, будет P:[k1,k2].

Теперь ключ 3 приходит. Согласно Разделу 5.2.1 ... Вставка, первой задачей является поиск. Это определяет ключ 3 должен быть на странице A - единственная страница, которую мы имеем. Далее «если [этот узел] заполнен, он будет разбит на два узла». Страница заполнена, поэтому она должна быть разделена. Теперь у нас есть

A:[1,2]    B:[3, ]

Но это не дерево! Как написано в книге:

указатель на [новый узел], .. вставляется в родительский узел .. из [текущего узла], повторяя операцию вставки в этом узле [то есть в родительском узле]. Этот процесс разделения и перемещения может продолжаться, если необходимо, вплоть до корня, и, если он должен быть разделен, будет создан новый корневой узел.

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

Таким образом, мы должны поместить указатель на новую страницу (B) в отца текущей страницы (A). Должен быть новый корневой узел:

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

У меня есть указатели на неконечных страницах, указывающие на самое высокое значение в дочернем (сыновом) узле. Ваш связанный текст может сделать это по-другому, но результат будет эквивалентным.

Ключ значение 4 прибывает; следуя алгоритму, который мы ищем, чтобы найти, на какой странице он должен быть. Это должна быть страница B. Для этого есть место, поэтому мы обновляем эту страницу и указатель на странице C:

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

Затем мы вставляем ключ 5. Он должен перейти на страницу B, но он заполнен. Поэтому он раскалывается

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

Мы должны обновить узел отца. Он тоже полон, поэтому он разбивается:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Разделение распространяется вверх, и формируется новый корневой узел:

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

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


Что касается второй части - «Можно ли вводить записи с ключами в другом порядке, чтобы дерево было меньшей высоты?» С 5 ключами и двумя ключами на узел нам нужно как минимум 3 конечных узла для хранения всех значений и высоту 3 для формирования дерева. Так что мое расположение оптимально для заданных данных, последовательности и алгоритма.

В книге используется совершенно другое расположение указателей к тому, что я использую, и другое расположение разделенных страниц. Это будет важно, что приведет к частичным заполненным страницам. То, что на странице 42 есть раздел под названием «Загрузка данных», который показывает, насколько полные страницы могут быть достигнуты при загрузке из последовательности клавиш, что поддерживает мою догадку. Тем не менее, я надеюсь, что я дал вам достаточно указателей, и вы сможете использовать структуру указателей книги, чтобы решить это для себя.


Я сталкивался с этой интерактивной симуляцией того, как растет B-Tree.

Майкл Грин
источник