Сбалансированные деревья (3 мая 2017)
- Интерфейс Rope: insert(i, x), erase(i), get(i), split, merge, rotatel
- Возможные быстрые реализации: treap, AVL, RB, 2-3, skip-list, splay, корневая
- Skip-list
- List: умеет делать Add и Del за O(1), если уже известно место; сложности с Find.
- Добавим несколько уровней: ссылки вперёд на 2, на 4, на 8 и т.д.
- Если мы вставим 1 элемент всё передвинется... поэтому будем хитрее: каждый элемент есть на уровне выше с вероятностью 1/2
- Не забыть: (а) фиктивный элемент, общий для всех списков; (б) мы не храним индексы, храним только длины рёбер
- Splay-tree
- Собственно дерево: add и del, splay = zig-zig + zig-zag + last one.
- Вращения: zig-zag = double = 2 signle, zig-zig = 2 single в другом порядке.
- Теорема об амортизированном времени работы. Потенциал = ∑ log(Sv) (Sv − размер поддерева)
- Finger-теорема: ∑ ti = O(∑ ki log(n/ki)) ≤ O(n log n).
− Перерыв −
- SQRT-decomposition
- Версия с sqrt(n) кусками массива и минимум на отрезке.
- Что делать, если нужно вставлять и удалять элементы? Два решения: split/merge; rebuild.
- Версия только со split и rebuild.
- Отложенные операции: сортированный массив + добавление новых элементов + число элементов от x до y. Концепция: есть казалось бы неизменяемая структура.. сделаем её изменяемой.
- Persistent
- Peristent Array: "Дерево отрезков" vs RBST
- Offline
- Persistent Queue/Deque
- Статическая оптимальность
- Формулировка задачи с вероятностями и матожиданием
- Решение Кнутом за O(n2)
− Перерыв −
- Chinese tree: деревья, которые следят за "размер внука не более половины меня"
- Динамическая оптимальность. Гипотеза: splay tree is dynamic optimal.