Алгоритмы и структуры данных 5SE 2020-2021 — различия между версиями
Материал из CSC Wiki
Smal (обсуждение | вклад) (→Осень) |
Smal (обсуждение | вклад) (→Весна) |
||
(не показано 6 промежуточных версий 3 участников) | |||
Строка 38: | Строка 38: | ||
* '''15 декабря.''' Нахождение кратчайших путей из одной вершины в графах, в которых есть рёбра отрицательного веса, алгоритм Беллмана-Форда, проверка наличия цикла отрицательного веса. Кратчайшие пути в ациклических ориентированных графах. Кратчайшие пути между всеми парами вершин: алгоритм Флойда-Уоршолла. | * '''15 декабря.''' Нахождение кратчайших путей из одной вершины в графах, в которых есть рёбра отрицательного веса, алгоритм Беллмана-Форда, проверка наличия цикла отрицательного веса. Кратчайшие пути в ациклических ориентированных графах. Кратчайшие пути между всеми парами вершин: алгоритм Флойда-Уоршолла. | ||
+ | |||
+ | ==== Весна ==== | ||
+ | * '''9 февраля.''' Задачи RMQ и LCA. Динамическая задача RMQ/RSQ: оценка <math>O(\log n)</math> для запросов суммы/минимума и изменения элемента. Дерево отрезков. Статический вариант задачи RMQ: полное предвычисление (<math>O(n^2)</math> на предобработку, <math>O(1)</math> на запрос), метод разреженной таблицы (<math>O(n \log n)</math> на предобработку, <math>O(1)</math> на запрос). Задача LCA: эйлеров обход дерева, сведение к задаче RMQ. | ||
+ | |||
+ | * '''16 февраля.''' Деревья поиска. Корневое дерево: бинарное дерево, дерево с произвольным ветвлением, представление "левый ребёнок — правый сосед". Дерево поиска: поиск, вставка, удаление, поиск следующего и предыдущего элемента за время, пропорциональное высоте. АВЛ-дерево: верхняя оценка <math>O(\log n)</math> на высоту, сохранение свойства при помощи малых и больших вращений. | ||
+ | |||
+ | * '''2 марта.''' Splay-дерево. Splay-дерево: дерево, которое остаётся сбалансированным в среднем и при этом не хранит никакой дополнительной информации в вершинах; реализация основных операций через операцию splay. Верхняя оценка <math>O(\log n)</math> на учётную стоимлость операции splay. | ||
+ | |||
+ | * '''9 марта.''' Декартово дерево. Декартово дерево: построение декартова дерева за линейное время (при предварительно отсортированных ключах), реализация операций вставки и удаления через split и merge. Дуча: верхняя оценка <math>O(\log n)</math> на мат. ожидание глубины. Использование неявного ключа, rope. | ||
+ | |||
+ | * '''16 марта'''. Хеширование. Прямая адресация. Коллизии. Разрешение коллизий методом цепочек, методом последовательных проб и методом двойного хеширования. Гипотеза равномерного хеширования. Оценка времени поиска в хеш-таблице при использовании метода цепочек для гипотезы равномерного хеширования. | ||
+ | |||
+ | * '''23 марта'''. Универсальные семейства хеш-функций. Построение универсального семейства для целочисленных ключей. Оценка времени поиска в хеш-таблице при использовании метода цепочек для универсального семейства. Совершенное хеширование с помощью универсального семейства хеш-функций. | ||
+ | |||
+ | * '''30 марта'''. Числовые алгоритмы. Cложение, умножение, деление длинных чисел. Арифметика по модулю: сложение, умножение, возведение в степень, алгоритм Евклида, расширенный алгоритм Евклида, деление. Проверка чисел на простоту. Генерация случайных простых чисел. Криптография: схемы с закрытым ключом, RSA. | ||
+ | |||
+ | * '''6 апреля'''. Быстрое преобразование Фурье. Быстрое вычисление значений многочлена в точках: два способа задания многочленов — коэффициентами и значениями в точках; вычисление значений многочлена в точках методом "разделяй и властвуй"; дискретное преобразование Фурье; быстрое преобразование Фурье. Интерполяция: интерполяция в терминах матриц; матрица Вандермонда; интерполяция как домножение на обратную матрицу. | ||
+ | |||
+ | * '''13 апреля'''. Задача линейного программирования и симплекс-метод. Линейное программирование: общий вид задачи, матричная форма и сведение между различными представлениями. | ||
+ | |||
+ | * '''20 апреля'''. Линейное программирование: двойственность. Нахождение начальной точки. Задача о максимальном потоке. Теорема о минимальном разрезе и максимальном потоке. Алгоритм Форда-Фалкерсона. Задача о паросочетании в двудольном графе. | ||
+ | |||
+ | * '''27 апреля'''. Поиск подстроки в строке. Наивный алгоритм. Алгоритм Рабина-Капра. z-функция, префикс функция, алгоритм Кнута-Морриса-Пратта. | ||
+ | |||
+ | * '''4 мая'''. Суффиксный массив: определение, поиск подстроки. Построение за <math>O(n\log(n))</math>. | ||
+ | |||
+ | * '''11 мая'''. NP-полные задачи. Определение классов P и NP. NP-полнота задачи выполнимости булевой схемы. Сведение CircuitSAT к SAT. Сведение SAT к 3SAT. Сведение 3SAT к IndependentSet. Сведение IndependentSet к VertexCover и Clique. | ||
+ | |||
+ | * '''18 мая'''. Приближенные алгоритмы для NP-полных задач. 2-приближенный алгоритм для вершинного покрытия. 2-приближенный алгоритм для метрического коммивояжера. <math>\log(n)</math>-приближенный алгоритм для покрытия множествами. | ||
=== Литература === | === Литература === | ||
Строка 53: | Строка 82: | ||
== Практика == | == Практика == | ||
− | [[Медиа:Itmo_20_algo_fall.pdf| Условия задач]] | + | [[Медиа:Itmo_20_algo_fall.pdf| Условия задач, осень]] |
+ | |||
+ | [[Медиа:Itmo_21_algo_spring.pdf| Условия задач, весна]] | ||
Telegram-чат для обсуждений лекций и практик: https://t.me/joinchat/AgI1lFXil8U6VnPofgfOdA | Telegram-чат для обсуждений лекций и практик: https://t.me/joinchat/AgI1lFXil8U6VnPofgfOdA | ||
− | [https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit?usp=sharing Таблица с результатами.] | + | [https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit?usp=sharing Таблица с результатами, осень.] |
+ | |||
+ | [https://docs.google.com/spreadsheets/d/1HxD8e9Ndy-3WJtY04muh4p6LAVt6XMoJiNFdTO73CJ8/edit?usp=sharing Таблица с результатами, весна.] | ||
[[Медиа:Algo_hw_tex_template.zip| TeX-шаблон для домашек]] | [[Медиа:Algo_hw_tex_template.zip| TeX-шаблон для домашек]] | ||
Строка 75: | Строка 108: | ||
[https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit#gid=474070739 Таблица с результатами, осень] | [https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit#gid=474070739 Таблица с результатами, осень] | ||
+ | |||
+ | [https://docs.google.com/spreadsheets/d/1HxD8e9Ndy-3WJtY04muh4p6LAVt6XMoJiNFdTO73CJ8/edit#gid=474070739 Таблица с результатами, весна] | ||
<h3>Алексей Лапенок</h3> | <h3>Алексей Лапенок</h3> | ||
Строка 86: | Строка 121: | ||
Дедлайны по теоретическому ДЗ: | Дедлайны по теоретическому ДЗ: | ||
− | + | * жесткий дедлайн - до начала занятия (19:40 понедельника). | |
− | * жесткий дедлайн - до начала занятия ( | + | |
+ | [https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit#gid=2066017135 Таблица с баллами, осень] | ||
− | [https://docs.google.com/spreadsheets/d/ | + | [https://docs.google.com/spreadsheets/d/1HxD8e9Ndy-3WJtY04muh4p6LAVt6XMoJiNFdTO73CJ8/edit#gid=1907176771 Таблица с баллами, весна] |
− | <h3>Владислав Кораблинов</h3> | + | <!--<h3>Владислав Кораблинов</h3> |
[https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit#gid=1211943617 Таблица с результатами] | [https://docs.google.com/spreadsheets/d/1MvAzmg1upCisleowK-t1nVVksBiZV_lU3EhMFoBG8_Q/edit#gid=1211943617 Таблица с результатами] | ||
Строка 100: | Строка 136: | ||
* <code>vladislav.korablinov+itmo_20_algo@gmail.com</code> | * <code>vladislav.korablinov+itmo_20_algo@gmail.com</code> | ||
− | * Telegram: <code>ladine0n</code> | + | * Telegram: <code>ladine0n</code>--> |
Правила сдачи: | Правила сдачи: |
Текущая версия на 15:15, 13 апреля 2021
Содержание
Лекции
Лектор: Александр Смаль
Контакты:
avsmal[at]gmail.com
- Telegram: avsmal
Рабочая программа
Осень
- 8 сентября. Введение. Алгоритм. Модель вычисления RAM-машина. Память и время как ресурсы. Вычисление чисел Фибоначчи: экспоненциальный рекурсивный алгоритм, полиномиальный алгоритм, более детальный анализ. O-символика как инструмент оценки ресурсов, различные асимптотики (логарифм, полином, экспонента).
- 15 сентября. Элементарные структуры данных. Массивы переменного размера: аддитивная и мультипликативная схемы аллокации. Односвязный список, двусвязный список. Абстрактные типы данных, интерфейс и реализация. Стек, очередь, дек; моделирование на основе массива. Моделирование очереди с помощью двух стеков. Анализ учётных стоймостей операций при помощи функция потенциала, истинные и учётные стоимости.
- 22 сентября. Рекуррентные соотношения. Метод ”разделяй и властвуй“. Умножение n-битовых чисел: простой рекурсивный алгоритм, улучшенный рекурсивный алгоритм. Рекуррентные соотношения: основная теорема. Двоичный поиск. Сортировка слиянием: с рекурсией и без. Нижняя оценка для сортировки сравнениями.
- 29 сентября. Алгоритмы сортировки. Квадратичные сортировки. Сортировка с помощью кучи: очередь с приоритетами, построение кучи за линейное время, частичная сортировка.
- 6 октября. Быстрая сортировка: понятие вероятностного алгоритма, время работы в среднем, анализ средней глубины рекурсии, элиминация хвостовой рекурсии, IntroSort. Быстрая сортировка: анализ среднего времени работы, массивы с малым количеством различных элементов, QuickSort3.
- 13 октября Частичная сортировка. Сортировка подсчётом, стабильность. Цифровая сортировка. Bucket sort для равномерно распределённых вещественных чисел. Порядковые статистики, нахождение за линейное в среднем время. Медиана медиан.
- 20 октября. Динамическое программирование. Общие принципы динамического программирования. Наибольшая возрастающая подпоследовательность: подзадачи, порядок на подзадачах, граф подзадач, сравнение с рекурсивным алгоритмом; нахождение не только длины, но и самой подпоследовательности. Кратчайшие пути в ациклических ориентированных графах. Дискретная задача о рюкзаке.
- 27 октября. Динамическое программирование (продолжение). Дискретная задача о рюкзаке. Умножение матриц. Независимые множества максимального веса в деревьях. Редакционное расстояние: граф на подзадачах, нахождение кратчайшего пути в данном графе; нахождение оптимального выравнивания с использованием линейной памяти.
- 3 ноября. Жадные алгоритмы. Покрытие точек единичными отрезками. Непрерывный рюкзак. Задача о выборе заявок. Максимальные независимые множества в деревьях. Код Хаффмена.
- 10 ноября. Минимальное покрывающее дерево: свойство разреза, жадная стратегия, алгоритм Прима, алгоритм Краскала.
- 17 ноября. Система непересекающихся множеств. Представление множеств с помощью деревьев, эвристика сжатия путей, верхняя оценка на время работы m операций. Анализ учётных стоймостей операций: метод ростовщика.
- 24 ноября Альтернативные модели вычисления. Модель внешней памяти. Сортировка слиянием в модели внешней памяти. Модель cache-oblivios. Модель PRAM, вычисление максимума за константу. Модель BSP. Сортировка методом регулярного сэмплирования.
- 1 декабря. Способы хранения графов: матрица смежности, списки смежности, матрица инцидентности. Поиск в глубину. Графы и способы их представления, способы использования графов. Поиск в глубину в неориентированных графах, выделение компонент связности. Поиск в глубину в ориентированных графах: ориентированные ациклические графы, топологическая сортировка вершин. Выделение компонент сильной связности в орграфах.
- 8 декабря. Кратчайшие пути в графах. Нахождение кратчайших путей из одной вершины в невзвешенных графах, поиск в ширину. Нахождение кратчайших путей из одной вершины в графах с положительными весами, алгоритм Дейкстры, оценка времени работы при различных реализациях очереди с приоритетами (массивом, двоичной кучей, d-ичной кучей).
- 15 декабря. Нахождение кратчайших путей из одной вершины в графах, в которых есть рёбра отрицательного веса, алгоритм Беллмана-Форда, проверка наличия цикла отрицательного веса. Кратчайшие пути в ациклических ориентированных графах. Кратчайшие пути между всеми парами вершин: алгоритм Флойда-Уоршолла.
Весна
- 9 февраля. Задачи RMQ и LCA. Динамическая задача RMQ/RSQ: оценка для запросов суммы/минимума и изменения элемента. Дерево отрезков. Статический вариант задачи RMQ: полное предвычисление ( на предобработку, на запрос), метод разреженной таблицы ( на предобработку, на запрос). Задача LCA: эйлеров обход дерева, сведение к задаче RMQ.
- 16 февраля. Деревья поиска. Корневое дерево: бинарное дерево, дерево с произвольным ветвлением, представление "левый ребёнок — правый сосед". Дерево поиска: поиск, вставка, удаление, поиск следующего и предыдущего элемента за время, пропорциональное высоте. АВЛ-дерево: верхняя оценка на высоту, сохранение свойства при помощи малых и больших вращений.
- 2 марта. Splay-дерево. Splay-дерево: дерево, которое остаётся сбалансированным в среднем и при этом не хранит никакой дополнительной информации в вершинах; реализация основных операций через операцию splay. Верхняя оценка на учётную стоимлость операции splay.
- 9 марта. Декартово дерево. Декартово дерево: построение декартова дерева за линейное время (при предварительно отсортированных ключах), реализация операций вставки и удаления через split и merge. Дуча: верхняя оценка на мат. ожидание глубины. Использование неявного ключа, rope.
- 16 марта. Хеширование. Прямая адресация. Коллизии. Разрешение коллизий методом цепочек, методом последовательных проб и методом двойного хеширования. Гипотеза равномерного хеширования. Оценка времени поиска в хеш-таблице при использовании метода цепочек для гипотезы равномерного хеширования.
- 23 марта. Универсальные семейства хеш-функций. Построение универсального семейства для целочисленных ключей. Оценка времени поиска в хеш-таблице при использовании метода цепочек для универсального семейства. Совершенное хеширование с помощью универсального семейства хеш-функций.
- 30 марта. Числовые алгоритмы. Cложение, умножение, деление длинных чисел. Арифметика по модулю: сложение, умножение, возведение в степень, алгоритм Евклида, расширенный алгоритм Евклида, деление. Проверка чисел на простоту. Генерация случайных простых чисел. Криптография: схемы с закрытым ключом, RSA.
- 6 апреля. Быстрое преобразование Фурье. Быстрое вычисление значений многочлена в точках: два способа задания многочленов — коэффициентами и значениями в точках; вычисление значений многочлена в точках методом "разделяй и властвуй"; дискретное преобразование Фурье; быстрое преобразование Фурье. Интерполяция: интерполяция в терминах матриц; матрица Вандермонда; интерполяция как домножение на обратную матрицу.
- 13 апреля. Задача линейного программирования и симплекс-метод. Линейное программирование: общий вид задачи, матричная форма и сведение между различными представлениями.
- 20 апреля. Линейное программирование: двойственность. Нахождение начальной точки. Задача о максимальном потоке. Теорема о минимальном разрезе и максимальном потоке. Алгоритм Форда-Фалкерсона. Задача о паросочетании в двудольном графе.
- 27 апреля. Поиск подстроки в строке. Наивный алгоритм. Алгоритм Рабина-Капра. z-функция, префикс функция, алгоритм Кнута-Морриса-Пратта.
- 4 мая. Суффиксный массив: определение, поиск подстроки. Построение за .
- 11 мая. NP-полные задачи. Определение классов P и NP. NP-полнота задачи выполнимости булевой схемы. Сведение CircuitSAT к SAT. Сведение SAT к 3SAT. Сведение 3SAT к IndependentSet. Сведение IndependentSet к VertexCover и Clique.
- 18 мая. Приближенные алгоритмы для NP-полных задач. 2-приближенный алгоритм для вершинного покрытия. 2-приближенный алгоритм для метрического коммивояжера. -приближенный алгоритм для покрытия множествами.
Литература
- Дасгупта С., Пападимитриу Х., Вазирани У. Алгоритмы.
- Т.Кормен, Ч.Лейзерсон, Р.Ривест, К.Штайн - Алгоритмы. Построение и анализ.
- А. Шень. Программирование: теоремы и задачи.
- М. А. Бабенко, М. В. Левин. Введение в теорию алгоритмов и структур данных.
Онлайн-курсы
- Алгоритмы: теория и практика. Методы
- Алгоритмы: теория и практика. Структуры данных
- Data Structures and Algorithms Specialization on Coursera
- Algorithmic Toolbox — часть специализации из предыдущего пункта
Практика
Telegram-чат для обсуждений лекций и практик: https://t.me/joinchat/AgI1lFXil8U6VnPofgfOdA
Таблица с результатами, осень.
Таблица с результатами, весна.
Условия зачёта
(предварительные)
0.85 * (количество обязательных задач в домашних заданиях)
0.75 * (количество задач в контестах)
Задачи
Александр Мишунин
Контакты: alexander.mishunin[at]gmail.com
Дедлайны по теоретическому ДЗ: до начала занятия для правок уже присланных ранее задач, и до начала суток, в которые будет занятие, для новых задач.
Алексей Лапенок
Контакты:
lapenok.aleksej@gmail.com
- Telegram:
@Aleksej_Lapenok
Правила сдачи:
- Решение нужно присылать в виде pfd-ки на почту, указанную выше. Рекомендуется использовать шаблон, которые лежит выше.
Дедлайны по теоретическому ДЗ:
- жесткий дедлайн - до начала занятия (19:40 понедельника).
Правила сдачи:
- Решения нужно присылать в виде pdf-ки на почту, указанную выше. Еще выше лежит ссылка на удобный и простой шаблон, рекомендую им пользоваться, если у вас нет собственных разработок.
Правила зачета:
- Для получения зачета по теоретическим задачам нужно набрать баллов, где -- сумма баллов за обязательные задачи -го домашнего задания, почти всегда равно 2.
Дедлайны по теоретическому ДЗ:
- мягкий дедлайн в воскресенье в 22:00, задачи, присланные до него, гарантированно проверяются как минимум 1 раз до жесткого дедлайна
- жёсткий дедлайн в среду в 23:59, после него до начала занятия можно присылать только исправления по задачам, по которым было написано что-то разумное (в ваших интересах прислать пораньше, чтобы я успел посмотреть и было понятно, что исправлять)