Алгоритмы и структуры данных. Предполагаемая программа дисциплины на 4 модуля. 1. Вводная лекция. Структура курса и оргвопросы. Введение в теорию вероятностей (конечные вероятностные пространства). 2. Введение в теорию вероятностей (математическое ожидание, пример анализа алгоритмов). 3. Модель вычислений. Методы анализа алгоритмов, примеры доказательства корректности и оценки времени работы. 4. Эффективные алгоритмы сортировки сравнениями: сортировка слиянием, быстрая сортировка. Оценка снизу на сложность сортировки сравнениями. Поиск порядковой статистики. Метод бинарного поиска. Алгоритмы сортировки, обращающиеся к непосредственным значениям элементов: сортировка подсчётом, цифровая сортировка, корзинная сортировка. 5. Сортировка случайных данных. Модель вычислений с использованием внешней памяти. Сортировка во внешней памяти. 6. Простые структуры данных: односвязный и двусвязный списки, стек, очередь, дек. Двоичные и k-ичные кучи. Биномиальные кучи. 7. Амортизационный анализ. Метод кредитов и метод потенциалов. Динамический массив и сливание двоичных куч. 8. Фибоначчиевы кучи. 9. Хеширование. Постановка задачи, парадокс дней рождений. Полиномиальный хеш. 10. Хеш-таблицы с открытой и закрытой адресацией. Стратегии удаления элементов и масштабирования таблиц. Фильтр Блума. 11. Бинарные деревья поиска. Сбалансированные деревья. Декартово дерево. 12. 2-3 деревья и B-деревья. 13. Задачи на отрезках. Частичные суммы, разреженные таблицы, деревья отрезков. Метод сканирующей прямой. 14. Задачи на корневых деревьях, LCA и LA. Сведение LCA к RMQ и наоборот. Метод четырёх русских. 15. Персистентность и персистентные структуры данных. 1 16. Перебор комбинаторных объектов. Методы асимптотических и эвристических оптимизаций перебора. 17. Эффективный перебор в играх с нулевой суммой. Альфа-бета отсечение. 18. Динамическое программирование. Генерация комбинаторных объектов. Динамическое программирование на ацикличных графах, подотрезках, поддеревьях и подмножествах. Метод meet-in-the-middle. 19. Ускорение вычислений с помощью битовых операций. Эффективное использование памяти в задачах динамического программирования. 20. Теория графов. Обходы в глубину и ширину, топологическая сортировка, поиск цикла, компоненты сильной связности. Задача 2-выполнимости. 21. Мосты и точки сочленения. Компоненты рёберной и вершинной двусвязности. 22. Кратчайшие пути во взвешенных графах. Алгоритмы Форда-Беллмана, Флойда-Уоршелла и Дейкстры. Потенциалы Джонсовна, оптимизация А*. 23. Задача о минимальном остове. Лемма о безопасном ребре. Алгоритмы Прима, Борувки и Краскалла. Критерии оптимальности остовного дерева. 24. Система непересекающихся множеств. 25. Графы во внешней памяти. Задача ранжирования списка. 26. Паросочетания в двудольном графе. Алгоритм Куна. Теорема Кёнига-Эгервари. 27. Задача о максимальном потоке. Теорема Форда-Фалкерсона. 28. Полиномиальные алгоритмы решения задачи о максимальном потоке. Алгоритм ЭдмондсаКарпа, техника масштабирования, алгоритм Диница. 29. Стоимостной поток. Определения и жадный алгоритм. Алгоритм Дейкстры с потенциалами Джонсона. 30. Задача поиска шаблона в тексте. Префикс-фукнция и z-функция. Автомат префикс-функции. 31. Префиксное дерево и сжатое префиксное дерево. Алгоритм Ахо-Корасик. 32. Суффиксный массив и lcp. 33. Алгоритм Укконена. 34. Формальные языки. Иерархия языков. Определения РВ, ДКА, НКА, eps-НКА. Лемма о накачке. Эквивалентность РВ, ДКА, НКА. 35. Алгоритмы минимизации ДКА. 36. Проблема P = NP, теорема Кука-Левина. NP-полнота некоторых задач. 37. Классы задач L, P, NP, co-NP, NPC, co-NPC, PSPACE, EXPTIME, BPP, ZP, RP. Некоторые соотношения данных классов. 2 38. Введение в теоретико-числовые алгоритмы. Быстрое возведение в степень, расширенный √ алгоритм Евклида, решето Эратосфена и линейное решето, факторизация за O( n). Первообразный корень и дискретное логарифмирование. 39. Тест на простоту Миллера-Рабина и шифрование RSA. 40. Алгоритм Карацубы. Быстрое умножение матриц. Метод деревьев рекурсии и основная теорема. 41. Быстрое преобразование Фурье. 42. Эвристические методы оптимизации: локальные оптимизации, имитация отжига, генетические алгоритмы. 43. Численные методы интегрирования. Метод Монте-Карло. 44. Численные методы оптимизации. Троичный поиск, градиентный и покоординатный спуск, метод Ньютона. 45. Вычислительная геометрия. Основные примитивы (точка, прямая, окружность) и базовые действия с ними. Алгоритм Грэхема построения выпуклой оболочки. Быстрая проверка принадлежности точки выпуклому многоугольнику. 46. Триангуляция невыпуклого многоугольника. Задача поиска двух ближайших точек. Задача поиска двух наиболее удалённых точек. Пересечение полуплоскостей. Многомерная выпуклая оболочка. 47. Задача point location, k-d дерево. 48. Линейное программирование, постановка задачи. Двойственная задача. 49. Симплекс-метод. 50. Приближённые алгоритмы. Константные приближения в некоторых задачах. Дерандомизация. 51. Задача о покрытии множества. Алгоритм Каргера-Штайна. 52. Построение приближённых алгоритмов с помощью задачи линейного программирования. 53. Стриминговые алгоритмы. Задача heavy-hitters, приближённое вычисление порядковых статистик и суммы к окне. 54. Стриминговые алгоритмы. Подсчёт количества различных элементов, count-sketch. 3