Структуры данных (25 сентября 2017)
- [20 минут] Избавляемся от амортизации
- Вектор. Ленивое копирование: когда переполнились начинаем копировать по одному элементу
- Вектор. Ленивое копирование: заранее начинаем копировать по одному элементу и выделять память
- Хеш-таблица. Ленивое копирование.
- Очередь с минимумом на двух стеках. Реализация через два динамических массива.
- [25 минут] Куча
- Интерфейс: add, del, extractMin, decreaseKey.
- Бинарная куча: реализация на массиве через siftUp → decreaseKey, add; siftDown → extractMin, del
- Бинарная куча: build за O(n) (док-во sum k/2k уже было в практике)
- Обратные ссылки (пример: массив с операциями a[i]=x, min на всём массиве)
- Min = Max (+1 на -1, меньше на больше)
- heapsort = build + ExtractMin*n
- Преобразование операций: decreaseKey = del + add; del = decreaseKey + exractMin
− Перерыв −
- [30 минут] Аллокация памяти:
- сложность задачи, пример мощного решения: heap + hash_table
- стек + рекурсия; c++: рекурсия с финализатором и пример рекурсивной функции
- список + куски одного размера (пример: хеш-таблица на списках) + кеширование
- в с++ : new = наш аллокатор, delete = empty
- [15 минут] Пополняемые структуры данных
- Find → Del. Удалить X из структуры, умеющей только Find : пометить, как удалённый
- Ничего → Del. Хранить отдельно две структуры: добавленные элементы, удалённые.
- Add → Merge. Сливаемые структуры: меньшее к большему (учим кучи и хеш-таблицы сливаться)
- Пополняемый массив: добавить X, посчитать количество X от L до R.
- Предподсчёт за O(nlogn), запрос за O(logn). Добавление нового элемента = корневая.
- Предподсчёт за O(nlogn), запрос за O(logn). Добавление нового элемента = пополняемые структуры.
- Удалить X из структуры с аддитивным запросом (хранить две структуры = добавленные элементы + удалённые)
- [skipped] [10 минут] Два указателя и ответы на запросы в offline
- [skipped] Число различных чисел на отрезке li ≤ li+1, ri ≤ ri+1. O(n+m).
- [skipped] Отрезки произвольны. Алгоритм Мо. O(nm1/2).