12.4. BST: анализ сложности
Высота BST
Высота BST критически влияет на эффективность всех операций. В зависимости от порядка вставки ключей, высота может варьироваться от логарифмической до линейной. Для гарантированной логарифмической высоты используются АВЛ-деревья и красно-чёрные деревья.
Худший случай
Теорема
В худшем случае высота BST с $n$ вершинами равна $n - 1$.
В вырожденном дереве все операции (поиск, вставка, удаление) работают за $\Theta(n)$.
Лучший случай
Теорема
В лучшем случае высота BST с $n$ вершинами равна $\lfloor \log_2 n \rfloor$.
Средний случай
Теорема
Математическое ожидание высоты случайного BST (при случайном порядке вставки $n$ ключей) есть $O(\log n)$.
Сложность операций
Свойства
Сложность основных операций BST:
| Операция | Лучший случай | Средний случай | Худший случай |
|---|---|---|---|
| Поиск | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
| Минимум/Максимум | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
| Последователь/Предшественник | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
| Вставка | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
| Удаление | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Рандомизированное BST
Чтобы гарантировать логарифмическую сложность в среднем, можно использовать рандомизированный подход.
Идея
Вместо того чтобы вставлять ключи в заданном порядке, можно рандомизировать структуру дерева:
-
Случайная вставка: при вставке ключа $x$ в дерево размера $n$, с вероятностью $\frac{1}{n+1}$ делаем $x$ новым корнем, иначе рекурсивно вставляем в левое или правое поддерево.
-
Случайное удаление: при удалении узла с двумя детьми, выбор между заменой на предшественника или последователя делается случайно.
Теорема
В рандомизированном BST математическое ожидание высоты есть $O(\log n)$, а все операции работают в среднем за $O(\log n)$.
Сравнение с другими структурами данных
Сравнение с хеш-таблицей
| Критерий | BST | Хеш-таблица |
|---|---|---|
| Поиск | $O(\log n)$ среднее | $O(1)$ среднее |
| Вставка | $O(\log n)$ среднее | $O(1)$ среднее |
| Удаление | $O(\log n)$ среднее | $O(1)$ среднее |
| Минимум/Максимум | $O(\log n)$ | $O(n)$ |
| Последователь/Предшественник | $O(\log n)$ | $O(n)$ |
| Упорядоченный обход | $O(n)$ | $O(n \log n)$ |
| Гарантии в худшем случае | Нет (если не сбалансировано) | Нет |
BST предпочтительнее, когда:
- Нужен упорядоченный обход
- Нужно находить минимум/максимум
- Нужны операции поиска следующего/предыдущего элемента
- Ключи сложно хешировать
Сравнение с отсортированным массивом
| Критерий | BST | Отсортированный массив |
|---|---|---|
| Поиск | $O(\log n)$ | $O(\log n)$ бинарный поиск |
| Вставка | $O(\log n)$ среднее | $O(n)$ |
| Удаление | $O(\log n)$ среднее | $O(n)$ |
| Минимум/Максимум | $O(\log n)$ или $O(1)$ с кэшированием | $O(1)$ |
| Память | $O(n)$ с указателями | $O(n)$ |
| Кэш-локальность | Низкая | Высокая |
Отсортированный массив предпочтительнее, когда:
- Данные статические (редко меняются)
- Важна кэш-локальность
- Нужен минимальный расход памяти
Выбор структуры данных
Резюме
Свойства
Преимущества BST:
- Поддержка упорядоченных операций
- Простая реализация
- Гибкость в выборе типа ключей
Недостатки BST:
- Нет гарантий в худшем случае без балансировки
- Высокая константа из-за указателей
- Плохая кэш-локальность
Чтобы гарантировать логарифмическую сложность в худшем случае, используются сбалансированные деревья поиска: АВЛ-деревья, красно-чёрные деревья и другие, которые будут рассмотрены в следующих разделах.