Сбалансированные деревья, часть 2
- Не сбалансированное дерево
- Операция на отрезке L ≤ x ≤ R: сумма x, сумма y, минимум по y.
- Как это делать через Split(L, R). Как это делать в AVL.
- Операция на отрезке L ≤ x ≤ R: увеличить все y на dy, присвоить всем y некоторое значение y0 (модификация на отрезке, проталкивание информации вниз)
- Treap по неявному ключу: rotate(a, a+k, a+n) за O(logn)
- Rope (интерфейс) = treap + reverse
- Skip-list
- Другие деревья
- 2-3-tree, k-tree, B-tree
- 2-3-4-tree, RB-tree, AA-tree
- B-tree, B*-tree, B+-tree, оценка h×log(k) = log(n) для B-tree (find, insert, erase)
- Применение RB-tree:
set<int>
, set<int>::iterator
− не меняется
- Интерфейсы
- Insert, Delete, Find : Хештаблица, BST (STL::unordered_set, STL::set)
- Insert, Delete, LowerBound : Сортированный массив + бинарный поиск + пополняемость, BST (STL::set)
- Insert, Delete, k-th element : BST (STL::tree)
- Rope : Дерево поиска с операциями split/merge + reverse (STL::rope)
- Персистентное
- В Offline, в online
- Garbage Collector
- Peristent stack and queue in O(1)
- RBST, пересистентное RBST (отличие от treap в том, что мы не храним y)
- Применение RBST: решение задачи "memory manager". Запрос "копировать память", обработка за O(logn).
- Оптимальность деревьев
- Статическая (определение, оптимальное дерево поиска за O(n2))
- Аналогия с Хаффменом
- Динамическая (определение, Tango Tree)