ДЕКАРТОВО ДЕРЕВО дерево+пирамида = дерамида, дерево+куча = дуча tree+heap = treap Двоичные деревья поиска Binary search tree • Главное преимущество двоичных деревьев – большинство операций можно выполнить за O(log2N) • Проблема – дерево может быть разбалансированным Виды сбалансированных двоичных деревьев • 1) Декартово дерево • 2) Красно-черное дерево • 3) АВЛ-дерево • 4) B-дерево • 5) 2-3-дерево • и т.д. • Плюс дерамиды: относительная простота реализации всех операций, все операции выражаются через 2 функции: Split и Merge Структура дерамиды • Каждая вершина – это пара чисел X и Y, причем по Х имеем дерево поиска, а по Y пирамиду. Структура Treap Операция Split • Делит дерево на две части по некоторому ключу Реализация Split Операция Merge • Объединяет два дерева в одно • Главное условие – ключи(Х) первого дерева должны быть меньше ключей второго Реализация Merge Операция Insert • Добавляет в дерево новую вершину с заданным ключом X, приоритет Y выбирается случайно • 1) Делим дерево по ключу X на деревья L и R • 2) Создаем дерево M из одной вершины с ключом X • 3) Объединяем три дерева L, M, R Реализация Insert Операция Erase • Удаляет из дерева вершины с ключом равным X • 1) Делим дерево по ключу X-1 на L и R • 2) Делим R по ключу X на M и R • 3) Объединяем L и R, все удаляемые остались в M Реализация Erase Операция и реализация Find • Возвращает указатель на вершину в дереве с ключом, равным X, ничем не отличается от обычного дерева поиска Размеры поддеревьев • Добавим в структура новое поле – size • Функция getSize будет возвращать размер дерева • Функция recalc будет пересчитывать размер дерева Получение k-ого по порядку элемента Сумма на поддереве • Добавим в структуру два поля: • cost – значение в вершине • sum – сумма значений в дереве • В recalc добавим пересчет суммы • getSum реализуется аналогично getSize Изменение на поддереве • Добавим переменную add в структуру • Применим метод отложенного обновления • Будем вызывать push перед рекурсивными вызовами в split и merge Литература • • • • 1) http://habrahabr.ru/post/101818/ 2) http://habrahabr.ru/post/102006/ 3) http://habrahabr.ru/post/102364/ 4) http://e-maxx.ru/algo/treap Задачи • 1) http://acm.timus.ru/problem.aspx?space=1&num=2014 • 2) http://acm.timus.ru/problem.aspx?space=1&num=1890 • 3) http://ipc.susu.ac.ru/210-2.html?problem=2040 • 4) http://ipc.susu.ac.ru/210-2.html?problem=1969