Сбаллансированные деревья поиска (13 марта 2014)
- Применения Splay дерева бее доказательства
- Бор
- Можно использовать массив, список, set, hash_table
- Если использовать Splay дерево, то время доступа к строке длины L будет L + log|Σ|
- Link-Cut tree
- Expose = подняться до корня и объединить все куски в путь, также отрезать то, что ниже
- MakeRoot = Expose + Reverse
- Get(a, b) = MakeRoot(a) + Expose(b) + GetRoot(v[a])→value
- Connected(a, b) = MakeRoot(a) + Expose(b) + [Expose(v[a]) =? Expose(v[b])]
- Link(a, b) = MakeRoot(a) + [GetRoot(v[a])→parent := b]
- Потенциал = количество тяжелых ребер, которые не лежат на путях
- Persistent
- Любую структуру данных можно сделать Persistent
- Любое дерево делается Persistent без overhead
- Любой массив = дерево отрезков ⇒ Persistent с overhead в logn раз
- Персистент структуры требуют в logn раз больше памяти
- Кодим: персистентный массив и персистентный СНМ (DSU)
- Персистентность в Offline (обход всех версий dfs-ом, кодим на примере персистентного массива) [code]
- Задача про количество точек в прямоугольниках: заметающая прямая [code]
- Кодим
- struct Tree, Фиктивная нулевая вершина, вывод дерева на экран (иначе как дебажить?) [code]
- Дерево поиска: вставка, поиск [code]
- Персистентная версия [code]
- Идея неявного ключа (меняем две строчки) [code]
- Дерево отрезков для того, чтобы хранить в нем массив [code]
- Вращения, отцы
- Малое вращение.
- Большое вращение из AVL (zig-zag), выражение через малые вращения
- Большое вращение из Splay (zig-zig), выражение через малые вращения