Декартово дерево (Treap): Сбалансированный симбиоз дерева и кучи
Обычные бинарные деревья поиска обладают отличным временем операций O(log N), но только если данные поступают в случайном порядке. Если загрузить в дерево уже отсортированный массив, оно выродится в длинную "макаронину", и время поиска деградирует до O(N). Строгие балансировщики (АВЛ-деревья или Красно-черные деревья) решают проблему, но их реализация требует сотен строк сложного кода с вращениями. Дискретная математика предлагает невероятно элегантную альтернативу — рандомизированное Декартово дерево (Treap).
Название Treap является слиянием слов Tree (дерево поиска) и Heap (куча). Каждый узел в этой структуре хранит не одно, а сразу два значения: Ключ (X) и Приоритет (Y).
Структура должна одновременно удовлетворять двум строгим математическим правилам:
- По ключу
Xэто правильное Бинарное дерево поиска: все ключи в левом поддереве меньше ключа узла, а в правом — больше. - По приоритету
Yэто правильная Бинарная куча (Max-Heap): приоритет любого родителя строго больше приоритета любого из его потомков.
Главный секрет Декартова дерева: ключи мы получаем от пользователя, а приоритеты Y мы генерируем абсолютно случайным образом! Математически доказано, что если мы строим дерево поиска, где элементы вставляются в порядке убывания случайно сгенерированных приоритетов, математическое ожидание высоты такого дерева составит строго O(log N). Вероятность того, что Treap выродится в линию, бесконечно мала.
Вся работа с Treap строится на двух базовых, очень простых в написании операциях:
- Split (Разрезание): берет дерево и ключ
K, и за O(log N) разрезает его на два дерева: в одном все ключи меньше K, в другом — больше или равны. - Merge (Слияние): берет два дерева (при условии, что все ключи первого меньше ключей второго) и объединяет их в одно за O(log N), просто сравнивая приоритеты корней, чтобы сохранить свойство кучи.
Добавление (Insert) и удаление (Delete) элементов выражаются буквально в пару строк через эти две операции. Более того, существует модификация "Декартово дерево по неявному ключу", в которой ключом X выступает не само значение, а индекс элемента в массиве. Такая структура позволяет за логарифмическое время вырезать кусок массива из середины и вставить его в начало (что невозможно сделать быстро ни в обычном массиве, ни в связанном списке), что делает Treap основой продвинутых текстовых редакторов (структура данных Rope).
Последнее от Александр
- Английский сленг: фразы и выражения на английском с переводом
- Промышленная безопасность - как теория вероятностей помогает прогнозировать аварии на ОПО
- Финансовая математика печати: как рассчитать реальную стоимость владения принтером
- Лучшие нейросети для написания текстов
- Гнеденко Борис Владимирович