Алгоритмы, работающие с Б-деревьями, хранят в оперативной памяти лишь небольшую часть всей информации (фиксированное число секторов).
Диск рассматривается как большой участок памяти, работа с которым происходит следующим образом: перед тем как работать с объектом , выполняется специальная операция-(чтение с диска). После внесения изменений в объект выполняется операция-(запись на диск).
Время работы программы в основном определяется количеством этих операций, так что имеет смысл читать/записывать как можно больше информации за один раз и сделать так, чтобы узел Б-дерева заполнял полностью один сектор диска. Таким образом, степень ветвления (число детей узла) определяется размером сектора.
Типичная степень ветвления Б-деревьев находится между и в зависимости от размера элемента. Увеличение степени ветвления резко сокращает высоту дерева, и тем самым число обращений к диску, при поиске. Например, Б-дерево степени и высоты может хранить более миллиарда ключей. Учитывая, что корень можно постоянно хранить в оперативной памяти, достаточно двух обращений к диску при поиске нужного ключа.
Считаем, что прикладная информация, связанная с ключом, хранится в том же узле дерева. На практике это не всегда удобно, и в реальном алгоритме узел может содержать лишь ссылку на сектор, где она хранится.
Определение Б-дерева. Б-деревом называют корневое дерево, устроенное следующим образом. Каждый узел содержит следующие поля:
Если— внутренний узел, то он содержит указатели на его детей в количестве.
Ключислужат границами, разделяющими значения ключей в поддеревьях. Точнее,
В случае, когда, у каждого внутреннего узла,или потомка, получается так называемое---дерево. Для эффективной работы с диском на практике выбирают достаточно большим. Число обращений к диску для большинства операций пропорционально высоте Б-дерева. Оценим сверху эту высоту.
Теорема 1.
Для всякого Б-дерева высоты, хранящегоключей, выполнено неравенство, где— минимальная степень узла.
Доказательство.
Число узлов в дереве высоты будет наименьшим, если степень каждого узла минимальна, то есть у корня потомка, а у внутренних узлов — по потомков. Следовательно узла будет на глубинеузлов — на глубинеузлов — на глубине и т.д. на глубине будетузлов. При этом в корне хранится один ключ, а во всех остальных узлах поключей. Таким образом, получаем неравенство
откуда следует утверждение теоремы.
Как и для красно-черных деревьев, высота Б-дерева с узлами есть, но основание логарифма для Б-деревьев гораздо больше, что примерно враз сокращает количество обращений к диску.
Основные операции с Б-деревьями. Корень Б-дерева размещают в оперативной памяти, при этом чтения с диска для корня никогда не требуется; однако всякий раз, когда изменяется корень, его сохраняют на диске. Все узлы, передаваемые как параметры, уже считаны с диска. Все процедуры обрабатывают дерево за один проход от корня к листьям.
Поиск в Б-дереве похож на поиск в двоичном дереве. Разница в том, что в каждом узле выбирается один вариант из , а не из двух. При поиске просматриваются узлы дерева от корня к листу. Поэтому число обращений к диску есть , где— высота дерева, а — количество ключей. Так как, то время вычислений равно.
Создание пустого Б-дереваосуществляется с помощью процедуры, которая находит место на диске для нового узла и размещает его. Это можно реализовать за время и не использовать операцию чтения с диска.
Добавление элемента в Б-деревоосуществляется с использованием процедуры разбиения полного (сключами) узла на два узла, имеющие поэлементов в каждом. При этом ключ-медианаотправляется к родителю узла и становится разделителем двух полученных узлов. Это возможно, если узел неполон. Если — корень, процедура работает аналогично. В этом случае высота дерева увеличивается на единицу.
Процедура добавления нового элемента проходит один раз от корня к листу, на это требуется времяи обращений к диску, где— высота дерева. По ходу дела разделяются встречающиеся на пути полные узлы. Заметим, что если полный узел имеет неполного родителя, то его можно разделить, так как в родителе есть место для дополнительного ключа, поэтому, поднимаясь вверх, доходим до неполного листа, куда и добавляем новый элемент.
Удаление элемента из Б-дерева происходит аналогично добавлению, хотя немного сложнее. Читателю предоставляется возможность разработать процедуру удаления, которая требуетобращений к диску для Б-дерева высоты , при этом вся процедура требуетвремени.
В заключение заметим, что сбалансированные деревья и Б-деревья обсуждаются в книгах Д.Кнута, А.Ахо, Дж.Хопкрофта и Дж.Ульмана. Подробный обзор Б-деревьев дан в книге Т.Кормена и др. Л.Гибас и Р.Седжвик рассмотрели связи между разными видами сбалансированных деревьев, включая красно-черные и 2-3-4-деревья.
В 1970 г. Дж. Хопкрофт предложил понятие 2-3-деревьев, которые явились предшественниками Б-деревьев и 2-3-4-деревьев. В этих деревьях каждая внутренняя вершина имеет 2 или 3 детей. Б-деревья были введены Д.Байером и Е.Мак-Крейтом в 1972 г.
<