12.7. Б-деревья
Б-дерево (B-tree) — это сбалансированное дерево поиска, специально разработанное для работы с данными на внешних носителях (дисках). В отличие от бинарных деревьев, узлы Б-дерева могут содержать множество ключей и детей.
Мотивация: внешняя память
При работе с данными на диске время доступа к произвольной ячейке памяти (порядка миллисекунд) намного превышает время обращения к оперативной памяти (порядка наносекунд). Разница составляет около $10^6$ раз.
Поэтому при проектировании структур данных для внешней памяти нужно:
- Минимизировать количество дисковых обращений
- Считывать данные блоками (страницами)
- Использовать большие узлы, соответствующие размеру дисковой страницы
Определение
Дисковая страница — минимальная единица обмена данными между оперативной памятью и диском. Типичный размер: 4-64 КБ.
Определение Б-дерева
Определение
Б-дерево порядка $m$ (или $(m/2, m)$-дерево) — это корневое дерево со следующими свойствами:
- Каждый узел содержит не более $m - 1$ ключей и не более $m$ детей.
- Каждый внутренний узел (кроме корня) содержит не менее $\lceil m/2 \rceil - 1$ ключей и не менее $\lceil m/2 \rceil$ детей.
- Корень содержит не менее одного ключа (если дерево не пусто).
- Все листья находятся на одном уровне.
- Узел с $k$ ключами имеет $k + 1$ детей.
Определение
В узле с ключами $k_1 < k_2 < \ldots < k_n$ и детьми $c_0, c_1, \ldots, c_n$:
- Все ключи в поддереве $c_0$ меньше $k_1$
- Все ключи в поддереве $c_i$ ($1 \leq i < n$) находятся между $k_i$ и $k_{i+1}$
- Все ключи в поддереве $c_n$ больше $k_n$
Оценка высоты
Теорема
Высота $h$ Б-дерева порядка $m$ с $n$ ключами удовлетворяет неравенству:
$$ >h \leqslant \log_t \frac{n+1}{2} + 1 >$$где $t = \lceil m/2 \rceil$ — минимальная степень дерева.
Следствие
При $m = 1001$ (типичное значение для дисковых страниц) и $n = 10^9$ ключей высота Б-дерева не превышает 3. Это означает максимум 3-4 дисковых обращения для поиска любого ключа.
Структура узла
Поиск
Сложность поиска: $O(th) = O(t \log_t n)$ операций в памяти, но только $O(h) = O(\log_t n)$ дисковых обращений.
Вставка
Вставка в Б-дерево выполняется за один проход от корня к листьям. Чтобы избежать переполнения узлов, используется предварительное расщепление полных узлов.
Расщепление узла
Алгоритм вставки
Удаление
Удаление из Б-дерева сложнее вставки, так как нужно поддерживать минимальное количество ключей в узлах. Основные случаи:
- Ключ в листе: просто удаляем
- Ключ во внутреннем узле: заменяем на предшественника или последователя
- Ребёнок имеет минимум ключей: заимствуем у брата или объединяем
Подробная реализация удаления опускается ввиду сложности (см. Cormen, Chapter 18).
Варианты Б-деревьев
B+ дерево
Определение
B+ дерево — вариант Б-дерева, в котором:
- Все ключи хранятся в листьях
- Внутренние узлы содержат только копии ключей-разделителей
- Листья связаны в связный список для эффективного обхода
B+ деревья используются в большинстве систем управления базами данных.
B* дерево
Определение
B дерево* — вариант Б-дерева, в котором:
- Узлы заполнены минимум на $2/3$ (вместо $1/2$)
- При переполнении узла ключи перераспределяются между братьями
- Лишь при полном заполнении всех братьев происходит расщепление
B* деревья обеспечивают лучшее использование памяти, но требуют более сложных операций.
Сложность операций
Свойства
Сложность операций в Б-дереве порядка $m$ с $n$ ключами:
| Операция | Дисковые обращения | Вычисления в памяти |
|---|---|---|
| Поиск | $O(\log_t n)$ | $O(t \log_t n)$ |
| Вставка | $O(\log_t n)$ | $O(t \log_t n)$ |
| Удаление | $O(\log_t n)$ | $O(t \log_t n)$ |
где $t = \lceil m/2 \rceil$.
Применение
Свойства
Б-деревья используются в:
- Файловых системах (NTFS, HFS+, ext4)
- Системах управления базами данных (MySQL, PostgreSQL, Oracle)
- Ключ-значение хранилищах (LevelDB, RocksDB)
Следствие
Для типичных параметров ($m \approx 1000$, $n \approx 10^9$) любая операция требует не более 3-4 дисковых обращений, что делает Б-деревья исключительно эффективными для работы с большими объёмами данных.