B-деревья
Метода поиска с помощью деревьев больше подходят для задачи внутреннего поиска, когда все данные хранятся в оперативной памяти, и нам почти ничего не стоит обращаться к ним много раз. Решение задачи внешнего поиска, когда данные хранятся на внешнем накопителе с дорогим доступом, требует чуть-чуть иных подходов.
Древовидные структуры и деревья всё еще удобны и для внешнего поиска. Надо только выбрать способ правильно представить дерева и максимально эффективно использовать оперативную память.
Давайте рассмотрим довольно простую идею, которая открывает нам практически безграничные просторы внешнего поиска. Место нашего поиска буду дальше называть диском. Вот пусть для поиска в диске мы используем бинарное дерево. Записей у нас . Если наше дерево идеально сбалансировано, то при поиске нам понадобится сделать обращений к диску.
Разделим наши данные в древесной структуре на страницы фиксированного размера, как на рисунке. Будем из диска запрашивать не по одному значению, а сразу по страницам. Тогда наш поиск ускорится в раз!
...
B-деревья
B-дерево порядка — сильноветвящиеся дерево, у которого
- у каждого узла максимум детей
- у каждого узла, кроме корня и листов, минимум детей
- корневой узел, если не является листом, имеет минимум ребенка
- все листья находятся на одном уровне
- любой узел с детьми содержит ключ
B-деревьев порядка не бывает, а B-деревья порядка — это простые бинарные деревья. Поэтому будем рассматривать только B-деревья порядка и больше, .
Каждый узел B-дерева можно представить как массив из элементов. На нечётных позициях стоят ссылки на детей. На чётных позициях находятся ключи.
Вообще, реальный способ хранения отличается от нашего логического представления, но нам удобнее думать так.
В узлах ключи упорядочены: , а каждая ссылка указывает на узел, в котором все ключи находятся между ключами и родительского узла.
Высота B-дерева
Ключевой характеристикой для B-дерева является высота. От нее зависит и временная сложность операций, и количество обращений к диску. Пусть в B-дереве хранится ключей. Оценим высоту дерева — .
В корне минимум ключ и минимум ребёнка. В остальных узлах минимум ключей и минимум детей. Получаем формулу для подсчёта минимального количества ключей в B-дереве высоты :
Аналогично, для максимального количества ключей
Тогда из общего неравенства
можно получить неравенство для высоты дерева
Поиск
В целом операция поиска в B-дереве аналогична операции поиска в бинарном дереве.
Пусть нам нужно найти ключ в B-дереве. Обращаемся к диску, получаем узел и сохраняем его в оперативную память. Ищем в этом узле ключ , или ссылку , где . Переходим по этой ссылке, получаем новый узел, и продолжаем наш поиск. Если мы дошли до листа и не нашли узел , значит его в B-дереве нет.
function search(node root, key) -> node:
...В целом нам потребуется максимум