Сортировки и порядковые статистика (9 октября 2017)
- [10 минут] Забытое на прошлой паре
- Сравнение трёх решений задачи о пересечении множеств
- Ленивое удаление из кучи:
while isDeleted(heap.getMin()) do heap.extractMin()
- [10 минут] Quick-Sort
- Версия с O(logn) доп памяти в худшем случае
- [10 минут] Оценка времени #1: мы считаем среднее время = сумма по всем рандомам = сумма по всем парам
- [20 минут] Порядковые статистика за O(n)
- QSort = get x + partition x + QSort + QSort, избавимся от одной ветки
- [10 минут] Одноветочный QuickSort. Время работы. Простая версия, дающая асимптотику, и, как упражнение, сложная с константой 4.
- [10 минут] Детерминированный partition.
- C++:
nth_element, partition
− Перерыв −
- [40 минут] Целочисленные сортировки
- Почему вообще числа можно сортировать быстрее?
- Напоминание: Count Sort за O(n+m). Замечание: стабильность.
- [15 минут] Radix sort.
- Сортируем пары подсчётом за O(n+m)
- Сортируем вектора за O(n×len)
- Сортируем числа за O(nlognm)
- [20 минут] Bucket Sort
- Алгоритм:
if (Min != Max)
разбить на n бакетов, вызваться для каждого
- Вариации: для каждого вызваться рекурсивно (BB), для каждого вызвать insertion sort (BI)
- Lm #0: MAX-MIN ≤ n ⇒ BI = Θ(n), BB = Θ(n)
- Lm #1: на равномерном распределении матожидание времние BI работает за O(n). Оценим ∑ki2
- Lm #2: BB работает в худшем за O(n log(MAX-MIN))
- [20 минут] Sort: Kirkpatrick за loglogC
- Записать общую рекурсивную функцию
- Показать, где хеш-таблицы,
- Главная оптимизация: не передаём максимум вектора в рекурсию
− Перерыв −
- [15 минут] V.E.B за loglogC
- Сформулируем задачу: heap для целых чисел от 0 до C-1. C = 22k (чисел битовой длины 2k).
- Интерфейс Min = O(1), Add и Del = O(k) = O(loglogC).
- Случаи: size = 0, size = 1, size ≥ 2,
struct Heapk: { Heapk-1 a; u_map<int,Heapk-1> b; int min, size; }
.
- Реализуем Add, пересчёт Min
- Реализуем Del