Деревья поиска (9 апреля 2021)
- BST
- Определение, хранение
- find, add, время работы = глубина
- Симметричный обход и сортировка. Нижняя оценка через сортировку.
- Обработка равных ключей (сделать разными, хранить в вершине count/list, ≤ и <)
- next, prev, применение, как итератор в set.
- Добавляем возможности списка (прошивка, предыдущий и следующий за O(1))
- Добавляем возможности хеш-таблицы (find за O(1)).
- Удаление через ленивость (del = find + O(1))
- Честный del за O(глубины)
- Пишем 3 версии добавления (обычная, персистентная, указатели).
- [skipped] [практика] Прямой обход
- AVL (1962 Adelson-Velsky and Landis)
- Определение, ограничение на высоту, связь высоты и размера
- Малые и большие вращения (single/double). Большое через два малых.
- Перебалансировка после add
- Доказательство леммы "не более одного вращения на add"
- [skipped] [практика] del, merge, split
− Перерыв −
- Дерево по неявному ключу
- Поддержка размеров поддеревьев.
- Новые запросы (всё ешё явный ключ):
getIndex(x)
, getValue(i)
, insert(i, x)
.
- STL :
pbds::tree
. Почему такое не умеет set
?
- Неявный ключ, массив с операциями
insert(i, x)
, erase(i)
, get(i)
, set(i, x)
за O(logn).
- STL :
rope
- Другие деревья
- B-tree : мотивация про жёсткий диск, добавление, время работы
- Оценка logk(n)×log(k) = log(n) для B-tree (find, insert, erase). Число обращений к диску = logk.
- B*-tree, B+-tree − храним не массив, а дерево, храним ключи и в промежуточных вершинах тоже.
- 2-3-tree
- 2-3-4-tree, RB-tree, AA-tree : применение AA-tree (set)
- [skipped] [практика] Операции на отрезке в дереве по неявному ключу со split и merge
- [skipped] [практика] Sum, Min, +=, =, reverse
- [skipped] [практика] rotate(a, a+k, a+n) за O(logn)