Дополнительные главы алгоритмов, часть 1
Санкт-Петербург, осень 2021
Описание
Это курс по алгоритмам для тех, кто уже что-то знает про алгоритмы. Мы постараемся поглубже разобраться как работают основные алгоритмы и структуры данных, а также изучим несколько алгоритмов посложнее.
Практика по курсу будет разбита на две части: решение теоретических задач и задач на программирование.
Для начала прохождения курса вы должны знать следующие темы:
- Анализ времени работы алгоритмов, амортизационный анализ
- Базовые структуры данных: двоичная куча, дерево отрезков, дерево поиска
- Базовые алгоритмы на графах: обход в глубину, обход в ширину
- Базовые алгоритмы на строках: КМП, хеши
Примерное содержание курса:
- Cтруктуры данных: кучи, дерево отрезков, дерево поиска
- Запросы на деревьях
- Декомпозиция графа
- Кратчайшие пути в графах
- Игры на графах
- Потоки, паросочетания
- Алгоритмы на строках
- Быстрое преобразование Фурье
Оценка будет складываться из:
- Теоретические задачи (50%)
- Задачи на программирование (50%)
Преподаватели
Список лекций
Двоичная куча
Левосторонняя куча
Биномиальная куча
Фибоначчиева куча
Запросы на массиве. Полуинтервал $[\ell;r)$.
sum(l, r)
— сумма на отрезке, префиксные суммы.Дерево отрезков
sum(l, r)
иset(i, x)
, идея, реализация на указателях.Что можно вместо
sum
? Достаточное условие — ассоциативность операции и наличие нуля. Определение моноида. Полугруппа, как получить из полугруппы моноид. Дерево отрезков работает на полугруппе. Примеры:а) абелева группа ($+$, $\times_{\mathbb R\setminus{0}}$, $\oplus$, $+_{\mathbb R[x]}$, сложение и умножение можно по простому модулю, а иногда и не простому);
б) абелев моноид ($+_{\mathbb N_0}$, $\times$, $\times_{\mathbb R[x]}$, $\wedge$, $\vee$, $\gcd$, $\mathrm{lcm}$);
в) абелева полугруппа (необратимые элементы абелевых моноидов: 1) явно выкинуть единицу: $+_{\mathbb N}$, $\wedge_{\mathbb N_0}$, $\vee_{\mathbb N}$; 2) идеал в любом кольце: чётные целые числа по умножению, многочлены, кратные какому-то многочлену, многочлены с чётным свободным членом);
г) группа (перестановки $S_n$, биективные преобразования множества, обратимые матрицы/линейные отображения $\mathrm{GL}(n, \mathbb R)$);
д) моноид (квадратные матрицы $\mathcal M_{n \times n}$, верхнетреугольные матрицы, все преобразования на множестве);
е) полугруппа (необратимые элементы моноидов: обратимые матрицы, небиективные отображения; отображение $a\cdot b=a$).
Массовые операции изменения. Две операции
sum(l, r)
иupdate(l, r, x)
, первая находит $\bigoplus\limits_{i=\ell}^{r-1}x_i$, вторая применяет $x_i:=x_i\otimes x$ для всех $i\in[\ell;r)$. Удобный случай: дистрибутивность $\oplus$ и $\otimes$: $(a\oplus b)\otimes c=(a\otimes c)\oplus(b\otimes c)$. Примеры: $(\min, P_2)$, $(\min, +)$, $(+, \cdot)$ (здесь $P_2(x, y)=y$).1) Почему нельзя сделать так, как в прошлом дереве отрезков?
2) Как понять изменение в вершине без вычисления изменений в детях? Дистрибутивность помогает.
3) Идея lazy propagation.
4) От некоторых условий можно избавляться. Можно избавиться от дистрибутивности, заменив её тем, что $\bigoplus\limits_{i=\mathrm{node}{.}\ell}^{\mathrm{node}{.}r-1}{x_i\otimes x}$ можно выразить через $\bigoplus\limits_{i=\mathrm{node}{.}\ell}^{\mathrm{node}{.}r-1}{x_i}$, $\mathrm{node}{.}\ell$, $\mathrm{node}{.}r$ и $x$.
5) Мы пользуемся декомпозируемостью $f(a, b, c)=g(g(a, b), c)$. От неё тоже можно избавиться.
Метод заметающей/сканирующей прямой, комбинация с деревом отрезков. Задача о плотнейшем покрытии прямоугольниками.
Персистентное дерево отрезков.
Дерево поиска. Инвариант АВЛ-дерева
Splay-дерево, операция
splay
, потенциалОперации
split
иmerge
в splay-деревеДерево по неявному ключу — концепция, реализация при помощи splay-дерева
Задача LCA поиска нижайшего общего предка двух вершин в подвешенном дереве. Решение с $\mathcal O(n\log n)$ препроцессинга и памяти, $\mathcal O(1)$ на запрос: двоичные подъёмы.
Задача RMQ поиска минимума на подотрезках массива. Сведение LCA к RMQ за $\mathcal O(n)$: эйлеров обход.
LCA и RMQ с $\mathcal O(n)$ препроцессинга и памяти, $\mathcal O(\log n)$ на запрос: дерево отрезков.
LCA и RMQ с $\mathcal O(n\log n)$ препроцессинга и памяти, $\mathcal O(1)$ на запрос: разреженная таблица.
LCA и частный случай RMQ с $\mathcal O(n)$ препроцессинга и памяти, $\mathcal O(1)$ на запрос: алгоритм Фараха-Колтона, Бендера.
Лекция
О факторкольце и факторполе по натуральному и простому модулю
Полная и приведённая система вычетов
Теорема Эйлера, малая теорема Ферма
Обратный по модулю при известном $\varphi(m)$. $\varphi(p)=p-1$
Алгоритм Евклида. Расширенный алгоритм Евклида, линейное представление НОДа, обратный по произвольному модулю
Решето Эратосфена, факторизующее решето Эратосфена
Тест простоты Ферма. Числа Кармайкла
Тест Миллера-Рабина
$\rho$-алгоритм Полларда для факторизации
$p-1$-алгоритм Полларда для факторизации
Первообразный корень по модулю
Дискретный логарифм по модулю
Квадратный корень по модулю