Декартово и Splay деревья (СПБГУ МатМех, весна 2013, спецкурс 344-й группы)
- Какие существуют структуры данных? [15 минут]
- Массив (vector, queue, dequeue)
- Stack на массиве: get(i) за O(1), set(i) за O(1), добавить/удалить в конец за O(1)
- Dequeue на циклическом массиве: get(i) за O(1), set(i) за O(1), добавить/удалить в начало/конец за O(1)
- Статитический массив. Динамический массив (удвоение).
- Сортированный массив: Find(x) и Count(L,R) за O(logN)
- Хештаблицы (hash_set, hash_map)
- Самая простая реализация List hashTable[]
- find(x), add(x), del(x) за O(1)
- При переполнении: удвоение
- iterate_all за O(k): прикрепленный список
- Куча (priority_queue, make_heap)
- get_min за O(1)
- add, del за O(logN)
- BST, Бинарное дерево поиска (set, map)
- find(x), add(x), del(x), lower_bound(x) за O(logN)
- iterate_all в отсортированном порядке за O(k)
- iterate(L, R) в отсортированном порядке за O(k)
- get_min и get_max за O(1)
- Решим задачу count(L,R), add(x), del(x)
- Решение1: O(n), O(1), O(1)
- Решение2: O(k), O(logN), O(logN)
- Решение3: O(√ n ), O(1), O(1)
- Декартово дерево по явному ключу [30-35 минут]
- Определение (Heap по y, BST по x)
- Единственность в случае, когда все x и y различны
- Оценка средней высоты случайного дерева (сумма по i, j: вероятность того, что i -- предок j)
- Основные операции декартова дерева: Split и Merge (определение)
- Add и Del через Split и Merge
- Split (вместе с кодом)
- Merge (вместе с кодом)
- Not read Add и Del, работающие в 3 раза быстрее (только 1 Split/Merge)
- Задачи на декартово дерево [15-20 минут]
- k-й элемент
- findNext, findPrev
- Count(L, R), Sum(L, R) MinZ(L, R)
- Покрасить отрезок [L..R] в цвет C
- Декартово дерево по неявному ключу [20 минут]
- Массив = декартово дерево пар (i, ai)
- Пусть мы храним size, перепишем split так, чтобы он вместо x использовал size
- Итог: ключ можно не хранить
- Новые операции: insert, delete, rotate, swap
- Not read Reverse на отрезке
- Splay-дерево [если останется время]
- Splay: v → root
- Add: обычный find + протолкнуть вершину в корень
- Merge, Split, Delete через Splay
- Малое вращение, два больших вращения -- zig-zig и zig-zag
- Выражение больших вращений через малые
- Splay: последовательность вращений. Время работы одного Splay = O(depthv)
- Основа оценки времени работы: оценка потенциальной функции ∑vlog(size[v])
- Формулировки теорем про время работы: Balance, Static Optimiality, Static Finger, Working Set