12.5. АВЛ-деревья
АВЛ-дерево (названо в честь изобретателей Адельсона-Вельского и Ландиса, 1962) — это первое самобалансирующееся двоичное дерево поиска. Оно гарантирует высоту $O(\log n)$ для любых операций. АВЛ-дерево строится на основе операций BST, дополненных вращениями для поддержания баланса.
Определение и условие балансировки
Определение
АВЛ-дерево — это двоичное дерево поиска, в котором для каждой вершины высоты её левого и правого поддеревьев различаются не более чем на 1.
Определение
Баланс-фактор вершины $v$ — это разность высот правого и левого поддеревьев:
$$ >BF(v) = h(v.\text{right}) - h(v.\text{left}) >$$В АВЛ-дереве баланс-фактор каждой вершины принимает значения из множества $\{-1, 0, 1\}$.
Оценка высоты АВЛ-дерева
Теорема
АВЛ-дерево с $n$ вершинами имеет высоту $h < c \log_2 n$, где $c \approx 1.44$. Точнее:
$$ >h < \frac{\log_2(n+1)}{\log_2 \phi} \approx 1.44 \log_2(n+1) >$$где $\phi = \frac{1+\sqrt{5}}{2}$ — золотое сечение.
Следствие
Все операции в АВЛ-дереве (поиск, вставка, удаление) работают за $O(\log n)$.
Структура узла
Вращения
Для восстановления баланса используются вращения — локальные операции, меняющие структуру дерева без нарушения свойства BST.
Правое вращение (LL-случай)
Применяется, когда баланс-фактор узла равен -2, а баланс-фактор левого ребёнка ≤ 0.
graph TD
subgraph "После: правое вращение"
X2((x)) --> A2((A))
X2 --> Y2((y))
Y2 --> B2((B))
Y2 --> C2((C))
style X2 fill:#E8F8F5,stroke:#27AE60
style Y2 fill:#D6E4F0,stroke:#004E8C
style A2 fill:#FEF9E7,stroke:#E67E22
style B2 fill:#FEF9E7,stroke:#E67E22
style C2 fill:#FEF9E7,stroke:#E67E22
end
subgraph "До"
Y1((y)) --> X1((x))
Y1 --> C1((C))
X1 --> A1((A))
X1 --> B1((B))
style Y1 fill:#FDEDEC,stroke:#C0392B
style X1 fill:#D6E4F0,stroke:#004E8C
style A1 fill:#FEF9E7,stroke:#E67E22
style B1 fill:#FEF9E7,stroke:#E67E22
style C1 fill:#FEF9E7,stroke:#E67E22
end
Текстовая схема:
Левое вращение (RR-случай)
Применяется, когда баланс-фактор узла равен 2, а баланс-фактор правого ребёнка ≥ 0.
Двойные вращения
LR-случай (баланс-фактор узла = -2, баланс-фактор левого ребёнка = 1):
Сначала левое вращение вокруг $y$, затем правое вокруг $z$.
RL-случай (баланс-фактор узла = 2, баланс-фактор правого ребёнка = -1):
Сначала правое вращение вокруг $y$, затем левое вокруг $z$.
Вставка
Удаление
Полная реализация
Сложность операций
Свойства
Сложность операций в АВЛ-дереве:
| Операция | Время |
|---|---|
| Поиск | $O(\log n)$ |
| Минимум/Максимум | $O(\log n)$ |
| Вставка | $O(\log n)$ |
| Удаление | $O(\log n)$ |
| Память | $O(n)$ |
Теорема
Вставка: для восстановления баланса достаточно не более одного вращения (или одного двойного вращения). После вращения высота поддерева восстанавливается, и перебалансировка выше не нужна.
Удаление: вращение на одном уровне может уменьшить высоту поддерева, вызывая дисбаланс выше. В худшем случае требуется $O(\log n)$ вращений — по одному на каждом уровне от удалённого узла до корня. Это важное отличие от вставки.
Преимущества и недостатки
Свойства
Преимущества АВЛ-деревьев:
- Гарантированная высота $O(\log n)$
- Более строго сбалансированы, чем красно-чёрные деревья
- Лучший поиск (меньшая высота)
Недостатки:
- Больше вращений при вставке/удалении
- Дополнительная память для хранения высоты
- Более сложная реализация
АВЛ-деревья предпочтительны, когда операции поиска преобладают над модификациями.