Сбалансированные деревья, часть 1 (9 февраля)
- [35 минут] Не сбалансированное дерево (1960, Windley + Booth + Colin + Hibbard)
- Определения: BST = Binary Search Tree. Глубина вершины. Balanced BST.
- Хранение: бинарное (left,right,parent), произвольное (left,next,parent), хранение в файле, генерация: упорядочить вершины и хранить только отца
- Код insert (три версии: return Node*; return void; персистентная)
- Операции find, rightmost, leftmost, next, previous
- Прошивка дерева. Rightmost, leftmost, next, previous за O(1) в худшем = дерево + двусвязный список + ссылки на rightmost и leftmost.
- Удаление
- Обходы дерева: симметричный (сортированный массив), прямой (хранение и восстановление дерева)
- Сортировка деревом, LowerBound на вставку O(logn).
- Вывод. Можно просто вывести сортированный массив. Дерево → 2D-картинка. Корень справа или корень сверху. Код для случая "корень справа".
- Добавляем хеш-таблицу и ленивость. Insert и LowerBound O(h), Del за O(1), Find за O(1)
- Как удалить вершину, которую вернул за O(1) Find? Ссылки на предков.
- Модификации дерева =
set<int>
: multiset<int>
, map<int,int>
- [30 минут] AVL (1962, Adelson-Velsky + Landis)
- Определение, инвариант высот. Оценки на size[h], h[size].
- single/double rotation (малое/большое вращение), insert, выражение double rotation через две опреации single rotation
- Док-во корректноти insert, оценка количества вращений при insert: O(1).
- Красивый пример на доске из ~10 последовательных добавлений.
- Удаление. Максимальное количество вращений равно 0.5*h.
- [25 минут] Персистентное дерево (persistent tree)
- Определение персистентной структуры данных: любая операция изменения, например insert, не меняет старую и возвращает новую структуру данных
- Персистентное дерево поиска. Массив корней и ацикличный граф. Копирование пути от корня до вершины. Картинка для добавления нового элемента.
- Персистентное AVL дерево: все функции вместо того, чтобы менять старые вершина, создают новые. Персистентный код добавления.
- Оценка времени: не поменялось. Оценка памяти: O(nlogn) после n операций.
- Персистентный массив
- Примитивная структура: персистентный массив с O(1) на обращение и O(n) на модификацию
- Примитивная структура: персистентный массив с O(n) на обращение и O(1) на модификацию
- Массив →
map<int,int>
→ персистентное AVL-дерево