Сортировки целых чисел, порядковые статистика, V.E.B. (8 октября 2024)
- Забытое с прошлой пары: Сравнение трёх решений задачи о пересечении множеств
- Решение хеш-таблицей: Θ(n), доппамять, большая константа
- Сортировка + бинпоиск: O(sort) + O(nlogn),
sort, lower_bound
, минимум кода
- Два указателя: O(sort) + O(n), малая константа
- [20 минут] Quick-Sort (повторение, доппамять)
- Сколько памяти? Версия с O(logn) доп памяти в худшем случае.
- [10 минут] Повторение оценки времени #1: мы считаем среднее время = сумма по всем рандомам = сумма по всем парам
- [5 минут] Повторение оценки времени #2: напоминаем историю про интеграл
- [20 минут] Порядковые статистика за O(n)
- QSort = get x + partition x + QSort + QSort, избавимся от одной ветки
- [10 минут] Одноветочный QuickSort. Время работы. Простая версия, дающая асимптотику; сложная с константой 4, как упражнение.
- [10 минут] Детерминированный partition.
C++
: nth_element, partition
− Перерыв −
- [5 минут] Целочисленные сортировки
- Почему вообще числа можно сортировать быстрее?
- 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))
− Перерыв −
- [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