Сортировки (5 октября 2016)
- [10 минут] Сравнение трёх решений задачи о пересечении множеств
- Решение хеш-таблицей: Θ(n), доппамять, большая константа
- Сортировка + бинпоиск: O(sort) + O(nlogn),
sort, lower_bound
, минимум кода
- Два указателя: O(sort) + O(n), малая константа
- [5 минут] Пополняемые структуры данных
- Find → Del. Удалить X из структуры с Find : пометить, как удалённый
- Ничего → Del. Хранить отдельно две структуры: добавленные элементы, удалённые.
- Add → Merge. Сливаемые структуры: меньшее к большему (учим кучи и хеш-таблицы сливаться)
- Пополняемый массив: добавить X, посчитать количество X от L до R.
- Предподсчёт за O(nlogn), запрос за O(logn). Добавление нового элемента = корневая.
- Предподсчёт за O(nlogn), запрос за O(logn). Добавление нового элемента = пополняемые структуры.
- Удалить X из стурктуры с аддитивным запросом (хранить две структуры = добавленные элементы + удалённые)
− Перерыв −
- [15 минут] Квадратичные сортировки
- Определения: число инверсий (мера упорядоченности), стабильность (через сортировку пар).
- Selection:
n2, n, -, 1
(число сравнений, числа присваиваний, стабильность)
- Insertion:
n+inv, inv, +, 1
- InsertionBS:
n+inv, min(inv,nlogn), +, 1
- Bubble:
n2, n2, +, 1
- [10 минут] Оценка снизу и сортировка подсчётом
- CountSort = O(n+m)
- Если доступны только сравнения, число сравнений: хотя бы log(n!) = Θ(nlogn)
- [20 минут] Merge Sort
- Рекурсивная сортировка, оценка. Пишем код, чтобы доппамять была в merge
- Число инверсий для каждого элемета.
- Нерекурсивная версия, избавляемся от копирования памяти
- STL:
stable_sort
, merge
, inplace_merge
- [10 минут] Quick Sort
- Собственно сортировка, пишем код partition на python
- Собственно сортировка, пишем код partition на c++
- Что такое время работы вероятностного алгоритма?