B-дерево: описание

Литература о B-деревьях неоднородна по своей терминологии (Folk & Zoellick 1992).

Bayer&McCreight (1972), Comer (1979) и другие определяют порядок B-дерева как минимальное количество ключей в некорневом узле. Фолк и Зеллик (1992) указывают, что терминология неоднозначна, поскольку максимальное количество ключей не ясно. B-дерево порядка 3 может содержать максимум 6 ключей или максимум 7 ключей. Кнут (1998) избегает этой проблемы, определяя порядок как максимальное число дочерних элементов (что на один больше, чем максимальное количество ключей).

Термин "лист"(leaf) также противоречив. Bayer & McCreight (1972) рассматривали уровень листа как самый низкий уровень ключей, но Кнут считал уровень листа на один уровень ниже самых низких ключей (Folk & Zoellick 1992). Есть много возможных вариантов реализации. В некоторых проектах листья могут содержать всю запись данных; в других реализациях листья могут содержать только указатели на запись данных. Эти выборы не являются фундаментальными для идеи B-дерева.

Для простоты большинство авторов предполагают, что в узле есть фиксированное количество ключей. Основное предположение - фиксированный размер ключа и фиксированный размер узла. На практике могут использоваться ключи переменной длины (Folk & Zoellick 1992).

Определение

Согласно определению Кнута, B-дерево порядка m является деревом, которое удовлетворяет следующим свойствам:

  • Каждый узел имеет не более m детей.
  • Каждый неконечный узел (кроме корневого) имеет как минимум m/2 дочерних узлов.
  • Корень имеет по крайней мере два дочерних элемента, если это не листовой узел.
  • Нелистовый узел с k дочерними элементами содержит k - 1 ключ.
  • Все листья появляются на одном уровне и не несут никакой информации.

Ключи каждого внутреннего узла действуют как значения разделения, которые делят его поддеревья. Например, если внутренний узел имеет 3 дочерних узла (или поддерева), то он должен иметь 2 ключа: a1 и a2. Все значения в крайнем левом поддереве будут меньше, чем a1, все значения в среднем поддереве будут между a1 и a2, а все значения в крайнем правом поддереве будут больше, чем a2.

Внутренние узлы

Внутренние узлы - это все узлы, кроме листовых узлов и корневого узла. Они обычно представлены в виде упорядоченного набора элементов и дочерних указателей. Каждый внутренний узел содержит максимум U дочерних элементов и минимум L дочерних элементов. Таким образом, количество элементов всегда на 1 меньше количества дочерних указателей (количество элементов находится между L-1 и U-1). U должно быть либо 2L, либо 2L-1; поэтому каждый внутренний узел заполнен как минимум наполовину. Взаимосвязь между U и L подразумевает, что два наполовину полных узла могут быть объединены, чтобы сделать легальный узел, и один полный узел может быть разделен на два легальных узла (если есть место, чтобы вставить один элемент в родительский узел). Эти свойства позволяют удалять и вставлять новые значения в B-дерево и корректировать дерево для сохранения свойств B-дерева.

Корневой узел

Количество дочерних узлов корневого узла имеет тот же верхний предел, что и внутренние узлы, но не имеет нижнего предела. Например, когда во всем дереве меньше L-1 элементов, корень будет единственным узлом в дереве без дочерних элементов вообще.

Листовые узлы

В терминологии Кнута листовые узлы не несут никакой информации. Внутренние узлы, которые находятся на один уровень выше листьев, это то, что другие авторы назвали бы "листьями": в этих узлах хранятся только ключи (не более m-1 и не менее m/2-1, если они не являются корневыми) и указатели на узлы, не содержащие никакой информации.

B-дерево глубины n + 1 может содержать в U раз больше элементов, чем B-дерево глубины n, но стоимость операций поиска, вставки и удаления возрастает с глубиной дерева. Как и с любым сбалансированным деревом, стоимость растет гораздо медленнее, чем количество элементов.

Некоторые сбалансированные деревья хранят значения только в конечных узлах и используют разные виды узлов для конечных узлов и внутренних узлов. B-деревья сохраняют значения в каждом узле дерева, кроме листовых узлов.


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий