Алгоритмы и структуры данных 2016
Содержание
О курсе
Лектор: Объедков Сергей Александрович
Лекции
13 января: Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой. Θ- и O-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.
16 января: О-, o-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.
20 января: Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. (Конспект.)
23 января: Выбор порядковой статистики за время O(n): рандомизированный и детерминированный алгоритмы.
27 января: Быстрое возведение в степень по модулю. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.
30 января: Поиск ближайшей пары точек за время O(nlog n). Задача о планировании взвешенных интервалов: рекурсивное решение.
3 февраля: Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: рекурсивное решение с мемоизацией.
6 февраля: Лекция отменяется из-за болезни преподавателя, но будет компенсирована 11 апреля.
10 февраля: Вычисление редакционного расстояния и выравнивание последовательностей.
12 февраля: Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.
17 февраля: Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и глубину, поиска компонент связности в неориентированных графах. Связность в ориентированных графах, алгоритм проверки сильной связности ориентированного графа.
20 февраля: Топологическая сортировка. Вычисление компонент сильной связности в ориентированном графе.
24 февраля: Поиск кратчайших путей во взвешенном графе: алгоритмы Беллмана – Форда и Флойда – Уоршелла.
27 февраля: Выполнимость 2-КНФ и компоненты сильной связности. Перемножение матриц, поиск пути через промежуточную точку и алгоритм Флойда – Уоршелла.
3 марта: Лекция переносится на 11 апреля.
6 марта: Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов; (3) составление плана работ с заданными продолжительностями и крайними сроками выполнения, минимизирующего максимальную задержку. Различные методы доказательства корректности жадных алгоритмов.
10 марта: Алгоритм Дейкстры.
13 марта: Структуры данных. Массив с операциями инициализации, чтения и записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).
17 марта: Реализация приоритетной очереди при помощи двоичной кучи.
20 марта: Минимальные основные деревья. Алгоритмы Крускала, Прима и Reverse-Delete.
31 марта: Система непересекающихся множеств.
3 апреля: Сжатие путей в системе непересекающихся множеств. Кластеризация и алгоритм Крускала.
7 апреля: Жадный алгоритм на матроиде.
10 апреля: Максимальный поток. Алгоритм Форда – Фалкерсона.
11 апреля: Алгоритм Эдмондса – Карпа.
14 апреля: Двойственность задач о максимальном потоке и минимальном разрезе. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке.
17 апреля: Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.
21 апреля: Рандомизированный алгоритм поиска минимального разреза (алгоритм Каргера). Простой рандомизированный алгоритм для вычисления означивания переменных, максимизирующего число истинных дизъюнктов в 3-КНФ: случайное означивание гарантирует истинность 7/8 всех дизъюнктов в среднем.
24 апреля: Хеш-таблицы. Разрешение коллизий при помощи цепочек. Открытая адресация.
28 апреля: Сбалансированные деревья поиска. Красно-черные деревья.
12 мая: Самоорганизующиеся списки и конкурентный анализ онлайн-алгоритмов.
15 мая: Конечные автоматы. Регулярные языки. Эквивалентность детерминированных и недетерминированных автоматов. Замкнутость регулярных языков относительно регулярных операций.
19 мая: Регулярные выражения. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.
22 мая: Доказательство леммы о накачке и ее использование для доказательства нерегулярности языков. Полиномиальные сведения. Задачи о вершинном покрытии графа, покрытии множества и независимом множестве.
26 мая: Классы P и NP. Понятие NP-полной задачи. Теорема Кука – Левина, идея доказательства. Доказательство NP-полноты задачи о независимом множестве сведением к ней задачи о выполнимости 3-КНФ.
29 мая: Приближенные алгоритмы. 2-аппроксимация минимального вершинного покрытия и кратчайшего циклического маршрута. Существование задач, для которых константная аппроксимация возможна, только если P = NP (максимальное независимое множество, максимальная клика). PTAS для задачи о рюкзаке.
Домашние задания
Задание 1
Необходимо сдать все 6 задач в данном контесте. На выполнение задания даётся 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.
Задание 2
Контест. В домашнем задании пять задач, из которых нужно решить три, назначенные преподавателем, ведущим семинарские занятия в вашей группе. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Дорешивание.
Задание 3
Контест. В домашнем задании пять задач. Они разделены на два варианта, помеченные римскими цифрами I и II. Свой вариант нужно узнать у семинариста. Третья задача — общая для двух вариантов; ее решение необходимо снабдить доказательством корректности алгоритма. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.
Задание 4
Контест. В домашнем задании четыре задачи. Обязательны первые три. Вместо одной из первых трёх можно сделать последнюю (только для первых 10 решивших 4-ую!). На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы.
Задание 5
Контест. На выполнение задания даётся примерно 2 недели (см. точное время окончания в контесте). Условия ревью определяют семинаристы. Также до 25 июня необходимо решить задачи и прислать решение своему семинаристу и его учебному ассистенту.
Контрольная работа
Контрольная работа состоится 11 апреля в 13:40 – 15:00 в ауд. 622. Примеры задач (и решений)].
Контрольная работа на получение зачёта по программистской части экзамена
Что будет на контрольной?
- Будет одна задача на программирование.
- Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.
Как будет проходить контрольная?
- Контрольная пройдёт на последнем семинаре по АиСД. Продолжительность: 1 час 20 минут, продлеваться НЕ будет. Форма: контест.
- Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.
- Запрещается использовать телефоны, планшеты и другие мобильные устройства.
- Можно писать на своём ноутбуке.
- На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com, python.org
- Тесты будут открыты.
Что будет, если я её напишу?
- Если решение получило OK в контесте, студент получает зачёт по программистской части, которая составляет 20% от оценки за экзамен. На экзамене будут даны другие задачи на программирование. В отличие от контрольной, алгоритм напоминаться НЕ будет, поэтому проще сдать задачу на контрольной.
Что будет, если я её не напишу?
- Вам придётся решать задачу на программирование на экзамене. Вы также сможете получить за неё максимальное число баллов (2).
Какие правила? Чем можно пользоваться?
- Работа индивидуальная.
- Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.
- Можно писать на своём ноутбуке.
- Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com, python.org
- За первое нарушение указанных правил работа аннулируется.
- Если по какой-то причине вам необходимо воспользоваться почтой, телефоном,.. поднимите руку и спросите/предупредите семинариста.
Советы?
- Подготовьтесь к занятию, повторите все пройденные алгоритмы.
- Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.
- Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время во время контрольной.
Семинары
Подгруппа 101-1.
Подгруппа 101-2.
Подгруппа 102-1.
Подгруппа 102-2.
Подгруппа 103-1.
Подгруппа 105-1.
Подгруппа 106-1.
Подгруппа 106-2.
Подгруппа 107-1.
Подгруппа 107-2.
Рекомендуемая литература
- Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ (3-е изд., 2-е изд., 1-е изд.)
- Дасгупта, Пападимитриу, Вазирани. Алгоритмы (оригинал | купить)