|
Кружок обучения мастерству программирования при СПбГУ |
Лекции группы A0 - Лекция 04 - Про обычные деревья и Splay-дерево
Note: Звездочкой отмечены темы, на которые на лекции времени не хватило.
Краткий план лекции на тему "Про обычные деревья и Splay-дерево"
- Деревья от Олега Давыдова (AVL, RB, ...)
- Бинарные деревья поиска (все операции, которые можно просто делать за O(logn))
- Splay-tree
- Linking-Cutting trees
- MaxFlow за O(nmlogn)
Полный план лекции
- Деревья от Олега Давыдова
- AVL-tree (добавление - 2 случая = 2 разных вращения, удаление - спуск вниз, еще 1 случай)
- RB-tree (red-black)
- 2-3-tree, 2-3-4-tree
- AA-tree
- Бинарные деревья поиска
- Произвольные бинарные деревья поиска : Access, SiftUp
- SiftUp --> Split & Join
- Split & Join --> Insert & Delete
- Операции sum, min на отрезке
- K-е порядковое значение (храним size[v])
- Переход к неявному ключу, операции с массивами - вставка, поменять куски местами, переворот
- Путь в графе --> массив --> дерево поиска
- Splay-tree
- Операция Splay (root-case, zig-zig, zig-zag), Splay делает также SiftUp
- w[v], sum[v], rank[v] = log(sum[v]) (логарифмы все будут двоичными)
- Splay делает <= 1 + 3(rank[x'] - rank[x]) вращений. x = x' - начальная и конечная вершина
- m запросов работают за O(mlogn) (w[v] = 1)
- Linking-Cutting trees
- Постановка задачи : link, cut, addX, getMin
- Разбиение дерева на пути, каждый путь хранится как дерево поиска
- Операции explose & splice, выражение всех через explose
- Число splice-ов O(mlogn) => Исходная задача решается за O(m(logn)^2) произвольным деревом
- Применяя Splay-дерево, решаем исходную задачу за O(mlogn)
- MaxFlow за O(nmlogn)
- Алгоритм Диница, поиск блокирующего потока (напоминание)
- Построение дерева путей. Поиск блокирующего потока за O(mn)
- Поиск блокирующего потока за O(mlogn) с помощью Splay-tree