Алгоритмы и структуры данных 2016 — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
 
(не показано 198 промежуточных версии 10 участников)
Строка 1: Строка 1:
 +
'''Лектор:''' [http://www.hse.ru/staff/obiedkov С. Объедков]
 +
 +
'''Расписание лекций:'''<br/>
 +
вторник 13:40 – 15:00, ауд. 622<br />
 +
четверг 10:30 – 11:50, ауд. 622
 +
 +
<big>28 и 30 апреля лекций не будет</big>
 +
 +
[http://www.hse.ru/data/2015/12/23/1082465930/Algo_2015-16_Obiedkov.doc Программа дисциплины]
 +
 
== Лекции ==
 
== Лекции ==
'''13 января:''' Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой.  Θ- и ''O''-обозначения. Оценка сложности алгоритмов. Рекуррентные соотношения.
 
  
'''16 января:''' ''О''-, ''o''-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях. Оптимальность сортировки слиянием. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой.
+
* '''[https://www.dropbox.com/s/ahteeosvziqau21/algo1-recursion.pdf?dl=0 12 января.]''' Структура курса, правила выполнения домашних заданий. Рекурсивные алгоритмы: задача о Ханойской башне. Оценка времени работы рекурсивного алгоритма при помощи рекуррентного соотношения. Доказательство оптимальности рекурсивного алгоритма.
  
'''20 января:''' Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Формулировка и интуитивное объяснение основной теоремы. [https://www.dropbox.com/s/6a0r410zjm9qwe7/algo-3-recurrences.pdf?dl=0 (Конспект.)]
+
* '''[https://www.dropbox.com/s/rsky27mkdca7prs/algo2-sorting.pdf?dl=0 14 января.]''' Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой. Θ- и O-обозначения. Оценка сложности алгоритмов.
  
== Семинары ==
+
* '''[https://www.dropbox.com/s/hwqdeifor0oybye/algo3-quicksort.pdf?dl=0 19 января.]''' ''О''-, ''o''-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях.
[[Алгоритмы и структуры данных. Подгруппа 101-1|Подгруппа 101-1.]]<br>
+
 
[[Алгоритмы и структуры данных. Подгруппа 105-1|Подгруппа 105-1.]]<br>
+
* '''[https://www.dropbox.com/s/z8o65cjl0txag2q/algo4-recurrences.pdf?dl=0 21 января.]''' Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой. Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Основная теорема.
[[Алгоритмы и структуры данных. Подгруппа 106-1|Подгруппа 106-1.]]<br>
+
 
 +
* '''26 января.''' Разбиение массива по опорному элементу на три части (элементы, меньшие опорного, равные опорному и большие опорного). Оптимальность сортировки слиянием. Выбор порядковой статистики за время ''O''(''n''): [http://en.wikipedia.org/wiki/Quickselect рандомизированный] и [http://en.wikipedia.org/wiki/Median_of_medians детерминированный] алгоритмы.
 +
 
 +
* '''[https://www.dropbox.com/s/s36zvavu0t09eok/algo6-closest-pair.pdf?dl=0 28 января.]''' Поиск ближайшей пары точек за время ''O''(''n'' log''n'').
 +
 
 +
* '''2 февраля.''' Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.
 +
 
 +
* '''4 февраля.''' Быстрое возведение в степень по модулю. Динамическое программирование: выравнивание абзаца по ширине (рекурсивное решение с мемоизацией).
 +
 
 +
* '''9 февраля.''' Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: итеративное решение. ([https://official.contest.yandex.ru/contest/2185/enter/ Контест])
 +
 
 +
* '''[https://www.dropbox.com/s/jef8ylpr1o1jira/algo10-alignment.pdf?dl=0 11 февраля.]''' Вычисление редакционного расстояния и выравнивание последовательностей.
 +
 
 +
* '''16 февраля.''' Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.
 +
 
 +
* '''[https://www.dropbox.com/s/3phw4r52y25n11o/algo12-graph-representation.pdf?dl=0 18 февраля.]''' Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и в глубину.
 +
 
 +
* '''25 февраля.''' Топологическая сортировка за линейное время: алгоритмы, основанные на удалении вершин без входящих ребер (с доказательством корректности) и на поиске в глубину (без доказательства корректности). Вычисление компонент сильной связности (с незаконченным доказательством корректности).
 +
 
 +
* '''1 марта.''' Оценка сложности алгоритма поиска компонент связности в неориентированных графах. Алгоритм проверки сильной связности ориентированного графа. Вычисление компонент сильной связности в ориентированном графе (завершение доказательства корректности алгоритма). Поиск путей возведением в степень матрицы смежности графа, алгоритм Флойда – Уоршелла.
 +
 
 +
* '''[https://www.dropbox.com/s/uig5x4kofsvnfji/algo15-shortest-paths.pdf?dl=0 3 марта.]''' Алгоритм Флойда – Уоршелла: формулировка в терминах динамического программирования, оценка сложности, оптимизация по памяти, обнаружение циклов с отрицательным весом, восстановление кратчайших путей. Алгоритм Беллмана – Форда для графов без циклов с отрицательным весом.
 +
 
 +
* '''10 марта.''' Приложения алгоритмов на графах: решение систем разностных ограничений при помощи алгоритма Беллмана – Форда, проверка выполнимости 2-КНФ на основе поиска компонент сильной связности.
 +
 
 +
* '''15 марта.''' Структуры данных. Массив с операциями инициализации, чтения и записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).
 +
 
 +
* '''17 марта.''' Хеш-таблицы. Методы задания хеш-функций. Разрешение коллизий при помощи цепочек. Открытая адресация.
 +
 
 +
* '''22 марта.''' Двухуровневое идеальное хеширование. Сбалансированные деревья поиска. Пример — красно-черные деревья.
 +
 
 +
* '''24 марта.''' Построение красно-черного дерева. [https://www.dropbox.com/s/ej1992i71f3yfj8/amortized-efficiency.pdf?dl=0 Самоорганизующиеся списки] и конкурентный анализ онлайн-алгоритмов.
 +
 
 +
* '''5 апреля.''' Деревья отрезков. Динамические порядковые статистики.
 +
 
 +
* '''7 апреля.''' Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов.
 +
 
 +
* '''12 апреля.''' Алгоритм Дейкстры.
 +
 
 +
* '''14 апреля.''' Реализация приоритетной очереди при помощи двоичной кучи.
 +
 
 +
* '''[https://www.dropbox.com/s/zsg5ex49vhmhhas/algo25-mst.pdf?dl=0 19 апреля.]''' Минимальные остовные деревья. Алгоритм Крускала, алгоритм Прима и алгоритм, удаляющий самые тяжелые ребра.
 +
 
 +
* '''21 апреля.''' Система непересекающихся множеств.
 +
 
 +
* '''28 и 30 апреля''' лекций не будет.
 +
 
 +
* '''10 мая.''' Жадный алгоритм на матроиде.
 +
 
 +
* '''12 мая.''' Конечные автоматы. Регулярные языки. Замкнутость регулярных языков по объединению. Минимизация конечного автомата.
 +
 
 +
* '''17 мая.''' Регулярные выражения. Недетерминированные конечные автоматы. Замкнутость регулярных языков относительно регулярных операций. Построение конечного автомата по регулярному выражению.
 +
 
 +
* '''19 мая.''' Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.
 +
 
 +
* '''24 мая.''' Контекстно-свободные грамматики. Автоматы с магазинной памятью.
 +
 
 +
* '''26 мая.''' Эквивалентность контекстно-свободных грамматик и автоматов с магазинной памятью. Построение автомата по грамматике. Лемма о накачке для контекстно-свободных языков.
 +
 
 +
* '''31 мая.''' Три подхода к реализации регулярных выражений: детерминированный автомат, поиск с возвратами в недетерминированном автомате, имитация детерминированного автомата по недетерминированному. Поиск подстрок при помощи конечного автомата. Разбор слов по контекстно-свободной грамматике: алгоритм динамического программирование для грамматики в нормальной форме Хомского.
 +
 
 +
* '''2 июня.''' Максимальный поток. Алгоритм Форда – Фалкерсона.
 +
 
 +
* '''7 июня.''' Алгоритм Эдмондса – Карпа. Двойственность задач о максимальном потоке и минимальном разрезе.
 +
 
 +
* '''9 июня.''' Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке. Устойчивые паросочетания и алгоритм Гейла – Шепли.
 +
 
 +
* '''14 июня.''' Минимальный разрез в неориентированном графе. Алгоритм Каргера. Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.
 +
 
 +
* '''16 июня.''' Приближенные алгоритмы. PTAS для задачи о рюкзаке.
 +
 
 +
== Домашние задания ==
 +
 
 +
===Первое домашнее задание===
 +
Первое домашнее задание стоит из двух частей.
 +
 
 +
К 15 февраля нужно решить три задачи на [https://www.dropbox.com/s/j82mgmhcrcbq4ra/asymptotic_homework.pdf?dl=0 асимптотику] (две — из пункта 1 и одну — из пункта 2) и две задачи на [https://www.dropbox.com/s/gwxvf34gg6nt4fe/recurrent_homework.pdf?dl=0 рекуррентные соотношения] (одну — из пункта 1 и одну — из пункта 2). Какие именно задачи нужно решить, уточните, пожалуйста, у преподавателя, ведущего практические занятия. Крайний срок выполнения задач может немного различаться в разных подгруппах.
 +
 
 +
К 20 февраля нужно решить две задачи из [https://official.contest.yandex.ru/contest/2183 контеста] (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.
 +
 
 +
===Второе домашнее задание===
 +
 
 +
Ко 2 марта (!) нужно решить две задачи из [https://official.contest.yandex.ru/contest/2191 контеста] (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. Начало контеста — 22 февраля, 20:00.
 +
 
 +
К 15 марта (!) нужно решить две задачи из [https://official.contest.yandex.ru/contest/2262 контеста] (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. Начало контеста — 4 марта, 20:00.
 +
 
 +
Разбор задачи B1 есть здесь: https://yadi.sk/i/9E41IqipqSF6h.
 +
 
 +
===Третье домашнее задание===
 +
 
 +
К 3 апреля нужно решить две задачи из [https://official.contest.yandex.ru/contest/2290 контеста] (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.
 +
 
 +
К 28 апреля (!) нужно решить две задачи из [https://official.contest.yandex.ru/contest/2370/enter/ контеста] (одну типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.
 +
 
 +
Обратите внимание, что, начиная с этого контеста, за неудачные посылки вы будете получать штраф. Изначально задача стоит 10 баллов, каждая из первых девяти неудачных попыток дает -1 балл. Посылки с ошибками компиляции или не прошедшие проверку стиля не штрафуются. Также не штрафуются посылки, не прошедшие тест из условия. Тщательно тестируйте свои решения, чтобы не получать штраф.
 +
 
 +
===Четвертое домашнее задание===
 +
 
 +
К 22 мая нужно решить задачи из [https://official.contest.yandex.ru/contest/2473 контеста] (по одной каждого типа; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. За каждую из четырех задач можно получить до трех баллов (но максимальная оценка за всю домашнюю работу — десять баллов).
 +
 
 +
Если к 22 мая вы не успели решить все задачи, то вы еще можете прислать решения до истечения 27 мая, однако за каждую задачу, решенную после 22 мая, можно получить лишь один балл.
 +
 
 +
===Пятое домашнее задание===
 +
К 6 (!) июня нужно решить четыре задачи на [https://www.dropbox.com/s/eo688wfmq9qg8a3/dfa.pdf?dl=0 конечные автоматы] (по одной из каждого пункта; какие именно, определяет преподаватель, ведущий практические занятия).
 +
 
 +
К 8 июня нужно решить одну задачу из [https://official.contest.yandex.ru/contest/2511 контеста] (какую именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.
 +
 
 +
К 16 июня нужно решить одну задачу из [https://official.contest.yandex.ru/contest/2512 контеста] (какую именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.
 +
 
 +
=== Проверка стиля ===
 +
 
 +
Используется следующий [https://yadi.sk/d/dfjB0N86rQrFn cpplint], флаги: --filter=-,+build/include,+build/include_alpha,+build/include_order,+build/include_what_you_use,+build/namespaces,+build/storage_class,
 +
+dangerous/digits_in_names,+dangerous/no_braces_for,
 +
+readability/braces,+readability/casting,+readability/fn_size,+readability/macros,+readability/preincrement,+readability/utf8,
 +
+restrictions/defines,+restrictions/forbidden_class_usage,
 +
+runtime/arrays,+runtime/casting,
 +
+whitespace/blank_line,+whitespace/blank_line_between_globals,+whitespace/braces,+whitespace/comma,+whitespace/comments,
 +
+whitespace/empty_loop_body,+whitespace/end_of_line,+whitespace/ending_newline,+whitespace/forcolon,+whitespace/indent,
 +
+whitespace/line_length,+whitespace/newline,+whitespace/operators,+whitespace/parens,+whitespace/semicolon,+whitespace/tab.
 +
 
 +
Набор запрещенных классов зависит от пройденных тем. На данный момент это std::set, std::map (а также их multi версии) и std::priority_queue.
 +
 
 +
UPD 04.06.16: разрешены все классы.
 +
 
 +
== Контрольная работа ==
 +
'''Что будет на контрольной?'''
 +
# Будет одна задача на программирование.
 +
# Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.
 +
'''Как будет проходить контрольная?'''
 +
# Контрольная пройдёт на одном из последних семинаров по АиСД. Продолжительность: 1 час 20 минут, продлеваться НЕ будет. Форма: контест.
 +
# Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.
 +
# Запрещается использовать телефоны, планшеты и другие мобильные устройства.
 +
# Можно писать на своём ноутбуке.
 +
# На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com.
 +
# Тесты будут открыты.
 +
 
 +
'''Какие правила? Чем можно пользоваться?'''
 +
# Работа индивидуальная.
 +
# Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.
 +
# Можно писать на своём ноутбуке.
 +
# Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com.
 +
# За первое нарушение указанных правил работа аннулируется.
 +
# Если по какой-то причине вам необходимо воспользоваться почтой, телефоном и т.п., поднимите руку и спросите/предупредите семинариста.
 +
'''Советы'''
 +
# Подготовьтесь к занятию, повторите все пройденные алгоритмы.
 +
# Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.
 +
# Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время.
 +
 
 +
== Экзамен ==
 +
 
 +
Экзамен включает в себя ответ по билету, состоящему из одного вопроса по [[#Лекции|темам лекций]] и одной задачи. На подготовку ответа дается один час. При подготовке ответа можно пользоваться любыми бумажными материалами, но нельзя пользоваться электронными устройствами. При ответе по билету можно пользоваться только конспектом, составленным во время подготовки ответа. После того как студент ответит по билету, ему могут быть заданы дополнительные задачи и вопросы по темам курса, не вошедшим в билет. При ответе на дополнительные вопросы нельзя пользоваться никакими материалами, если только это не будет явным образом разрешено экзаменатором.
  
 
== Рекомендуемая литература ==
 
== Рекомендуемая литература ==
# [http://e-maxx.ru/bookz/files/cormen.pdf Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ]
+
# Кормен, Лейзерсон, Ривест, Штайн. ''Алгоритмы: построение и анализ''
# [https://dl.dropboxusercontent.com/u/829163/draft.pdf Дасгупта, Пападимитриу, Вазирани. Алгоритмы] ([http://beust.com/algorithms.pdf оригинал] | [http://biblio.mccme.ru/node/5066/shop купить])
+
# [http://biblio.mccme.ru/node/5066/shop Дасгупта, Пападимитриу, Вазирани. ''Алгоритмы'']
 +
 
 +
 
 +
==Преподаватели и ассистенты==
 +
{| class="wikitable"
 +
|-
 +
! Подгруппа !! Преподаватель !! Учебные ассистенты !! Семинары !! Консультации
 +
|-
 +
| 152-1 || [http://www.hse.ru/org/persons/134305048 Михаил Нокель] || Андрей Атанов || ||
 +
|-
 +
| 152-2 || [http://www.hse.ru/staff/obiedkov Сергей Объедков] || Андрей Климкин || [[Алгоритмы_и_структуры_данных_семинары_152-2| Страница семинаров]] || Понедельник, 10:30 – 11:50, ауд. 511
 +
|-
 +
| 154-1 || [http://www.hse.ru/staff/iamakarov Илья Макаров] || Владимир Гончаров || ||
 +
|-
 +
| 154-2 || [http://www.hse.ru/org/persons/141880775 Алексей Умнов] || Павел Белов || [[Алгоритмы_и_структуры_данных_семинары_154-2_156-2| Страница семинаров]] || Четверг, 13:40 - 15:00
 +
|-
 +
| 155-1 || [http://www.hse.ru/org/persons/138215687 Михаил Дектярев] || Александр Тиунов || ||
 +
|-
 +
| 155-2 || [http://www.hse.ru/org/persons/137640601 Павел Мельничук] || Александр Тиунов || [[Алгоритмы_и_структуры_данных_семинары_155-2| Страница семинаров]] ||
 +
|-
 +
| 156-1 || [http://www.hse.ru/org/persons/165212910 Филипп Синицын] || Максим Сабянин || ||
 +
|-
 +
| 156-2 || [http://www.hse.ru/org/persons/141880775 Алексей Умнов] || Павел Белов || [[Алгоритмы_и_структуры_данных_семинары_154-2_156-2| Страница семинаров]] || Четверг, 9:00 - 10:20
 +
|-
 +
| 157-1 || [http://www.hse.ru/org/persons/133408680 Михаил Густокашин] || Андрей Климкин || ||
 +
|-
 +
| 157-2 || Яна Кашинская || Андрей Атанов || || Понедельник, 10:30 – 11:50
 +
|-
 +
| 158-1 || Николай Субоч || Максим Сабянин || ||
 +
|-
 +
| 158-2 || Денис Симагин || Владимир Гончаров ||  [[Алгоритмы_и_структуры_данных,_семинар_ группы_158-2 | Страница семинаров]] ||
 +
|-
 +
|}
 +
 
 +
== Учебные контесты ==
 +
 
 +
[https://official.contest.yandex.ru/contest/2007/enter/ Сортировки]
 +
 
 +
[https://official.contest.yandex.ru/contest/2155/enter/ Разделяй и властвуй + длинная арифметика]
 +
 
 +
[https://official.contest.yandex.ru/contest/2185/enter/ Динамическое программирование]
 +
 
 +
[https://official.contest.yandex.ru/contest/2218/enter/ Обход в глубину]
 +
 
 +
[https://official.contest.yandex.ru/contest/2243/enter/ Обход в ширину]
 +
 
 +
[https://official.contest.yandex.ru/contest/2210/enter/ Число путей]
 +
 
 +
[https://official.contest.yandex.ru/contest/2270/enter/ Кратчайшие расстояния]
 +
 
 +
[https://official.contest.yandex.ru/contest/2333/enter/ Хеширование]
 +
 
 +
[https://official.contest.yandex.ru/contest/2381/enter/ Красно-черные деревья]
 +
 
 +
[https://official.contest.yandex.ru/contest/2464/enter/ Минимальные остовные деревья]
 +
 
 +
[https://official.contest.yandex.ru/contest/2531/enter/ Максимальный поток]

Текущая версия на 17:47, 9 мая 2017

Лектор: С. Объедков

Расписание лекций:
вторник 13:40 – 15:00, ауд. 622
четверг 10:30 – 11:50, ауд. 622

28 и 30 апреля лекций не будет

Программа дисциплины

Лекции

  • 12 января. Структура курса, правила выполнения домашних заданий. Рекурсивные алгоритмы: задача о Ханойской башне. Оценка времени работы рекурсивного алгоритма при помощи рекуррентного соотношения. Доказательство оптимальности рекурсивного алгоритма.
  • 14 января. Сортировка вставкой и слиянием. Использование инварианта цикла при доказательстве корректности сортировки вставкой. Θ- и O-обозначения. Оценка сложности алгоритмов.
  • 19 января. О-, o-, Ω-, ω-, Θ-обозначения. Быстрая сортировка, время работы в худшем, лучшем и среднем случаях.
  • 21 января. Сортировка при помощи двоичного дерева поиска и ее связь с быстрой сортировкой. Примеры решения рекуррентных соотношений: решение с использованием дерева рекурсии и методом подстановки. Основная теорема.
  • 26 января. Разбиение массива по опорному элементу на три части (элементы, меньшие опорного, равные опорному и большие опорного). Оптимальность сортировки слиянием. Выбор порядковой статистики за время O(n): рандомизированный и детерминированный алгоритмы.
  • 28 января. Поиск ближайшей пары точек за время O(n logn).
  • 2 февраля. Алгоритм Карацубы для умножения целых чисел. Алгоритм Штрассена для умножения матриц.
  • 4 февраля. Быстрое возведение в степень по модулю. Динамическое программирование: выравнивание абзаца по ширине (рекурсивное решение с мемоизацией).
  • 9 февраля. Динамическое программирование. Задача о планировании взвешенных интервалов: рекурсивное решение с мемоизацией и итеративное решение. Свойства задач, эффективно решаемых при помощи динамического программирования: наличие полиномиального числа подзадач, выразимость исходной задачи в терминах подзадач, сводимость больших подзадач к полиномиальному числу меньших подзадач. Выравнивание абзаца по ширине: итеративное решение. (Контест)
  • 11 февраля. Вычисление редакционного расстояния и выравнивание последовательностей.
  • 16 февраля. Графы: обход в глубину и в ширину, поиск компонент связности в неориентированных графах.
  • 18 февраля. Способы представления графов: матрица смежности и списки смежности. Оценка сложности алгоритмов поиска в ширину и в глубину.
  • 25 февраля. Топологическая сортировка за линейное время: алгоритмы, основанные на удалении вершин без входящих ребер (с доказательством корректности) и на поиске в глубину (без доказательства корректности). Вычисление компонент сильной связности (с незаконченным доказательством корректности).
  • 1 марта. Оценка сложности алгоритма поиска компонент связности в неориентированных графах. Алгоритм проверки сильной связности ориентированного графа. Вычисление компонент сильной связности в ориентированном графе (завершение доказательства корректности алгоритма). Поиск путей возведением в степень матрицы смежности графа, алгоритм Флойда – Уоршелла.
  • 3 марта. Алгоритм Флойда – Уоршелла: формулировка в терминах динамического программирования, оценка сложности, оптимизация по памяти, обнаружение циклов с отрицательным весом, восстановление кратчайших путей. Алгоритм Беллмана – Форда для графов без циклов с отрицательным весом.
  • 10 марта. Приложения алгоритмов на графах: решение систем разностных ограничений при помощи алгоритма Беллмана – Форда, проверка выполнимости 2-КНФ на основе поиска компонент сильной связности.
  • 15 марта. Структуры данных. Массив с операциями инициализации, чтения и записи, выполняемыми за время O(1). Три подхода к амортизационному анализу: групповой анализ, банковский метод и метод потенциалов (на примере двоичного счетчика).
  • 17 марта. Хеш-таблицы. Методы задания хеш-функций. Разрешение коллизий при помощи цепочек. Открытая адресация.
  • 22 марта. Двухуровневое идеальное хеширование. Сбалансированные деревья поиска. Пример — красно-черные деревья.
  • 5 апреля. Деревья отрезков. Динамические порядковые статистики.
  • 7 апреля. Жадные алгоритмы. Примеры: (1) выбор максимального подмножества непересекающихся интервалов; (2) разбиение множества интервалов на минимальное число подмножеств непересекающихся интервалов.
  • 12 апреля. Алгоритм Дейкстры.
  • 14 апреля. Реализация приоритетной очереди при помощи двоичной кучи.
  • 19 апреля. Минимальные остовные деревья. Алгоритм Крускала, алгоритм Прима и алгоритм, удаляющий самые тяжелые ребра.
  • 21 апреля. Система непересекающихся множеств.
  • 28 и 30 апреля лекций не будет.
  • 10 мая. Жадный алгоритм на матроиде.
  • 12 мая. Конечные автоматы. Регулярные языки. Замкнутость регулярных языков по объединению. Минимизация конечного автомата.
  • 17 мая. Регулярные выражения. Недетерминированные конечные автоматы. Замкнутость регулярных языков относительно регулярных операций. Построение конечного автомата по регулярному выражению.
  • 19 мая. Эквивалентность регулярных выражений и конечных автоматов. Нерегулярные языки. Лемма о накачке.
  • 24 мая. Контекстно-свободные грамматики. Автоматы с магазинной памятью.
  • 26 мая. Эквивалентность контекстно-свободных грамматик и автоматов с магазинной памятью. Построение автомата по грамматике. Лемма о накачке для контекстно-свободных языков.
  • 31 мая. Три подхода к реализации регулярных выражений: детерминированный автомат, поиск с возвратами в недетерминированном автомате, имитация детерминированного автомата по недетерминированному. Поиск подстрок при помощи конечного автомата. Разбор слов по контекстно-свободной грамматике: алгоритм динамического программирование для грамматики в нормальной форме Хомского.
  • 2 июня. Максимальный поток. Алгоритм Форда – Фалкерсона.
  • 7 июня. Алгоритм Эдмондса – Карпа. Двойственность задач о максимальном потоке и минимальном разрезе.
  • 9 июня. Сведение задачи о максимальном паросочетании в двудольном графе к задаче о максимальном потоке. Устойчивые паросочетания и алгоритм Гейла – Шепли.
  • 14 июня. Минимальный разрез в неориентированном графе. Алгоритм Каргера. Задача о назначениях (поиск совершенного паросочетания с минимальным весом во взвешенном двудольном графе). Алгоритм, последовательно находящий самые дешевые увеличивающие пути.
  • 16 июня. Приближенные алгоритмы. PTAS для задачи о рюкзаке.

Домашние задания

Первое домашнее задание

Первое домашнее задание стоит из двух частей.

К 15 февраля нужно решить три задачи на асимптотику (две — из пункта 1 и одну — из пункта 2) и две задачи на рекуррентные соотношения (одну — из пункта 1 и одну — из пункта 2). Какие именно задачи нужно решить, уточните, пожалуйста, у преподавателя, ведущего практические занятия. Крайний срок выполнения задач может немного различаться в разных подгруппах.

К 20 февраля нужно решить две задачи из контеста (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.

Второе домашнее задание

Ко 2 марта (!) нужно решить две задачи из контеста (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. Начало контеста — 22 февраля, 20:00.

К 15 марта (!) нужно решить две задачи из контеста (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. Начало контеста — 4 марта, 20:00.

Разбор задачи B1 есть здесь: https://yadi.sk/i/9E41IqipqSF6h.

Третье домашнее задание

К 3 апреля нужно решить две задачи из контеста (одну — типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.

К 28 апреля (!) нужно решить две задачи из контеста (одну типа A и одну — типа B; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.

Обратите внимание, что, начиная с этого контеста, за неудачные посылки вы будете получать штраф. Изначально задача стоит 10 баллов, каждая из первых девяти неудачных попыток дает -1 балл. Посылки с ошибками компиляции или не прошедшие проверку стиля не штрафуются. Также не штрафуются посылки, не прошедшие тест из условия. Тщательно тестируйте свои решения, чтобы не получать штраф.

Четвертое домашнее задание

К 22 мая нужно решить задачи из контеста (по одной каждого типа; какие именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности. За каждую из четырех задач можно получить до трех баллов (но максимальная оценка за всю домашнюю работу — десять баллов).

Если к 22 мая вы не успели решить все задачи, то вы еще можете прислать решения до истечения 27 мая, однако за каждую задачу, решенную после 22 мая, можно получить лишь один балл.

Пятое домашнее задание

К 6 (!) июня нужно решить четыре задачи на конечные автоматы (по одной из каждого пункта; какие именно, определяет преподаватель, ведущий практические занятия).

К 8 июня нужно решить одну задачу из контеста (какую именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.

К 16 июня нужно решить одну задачу из контеста (какую именно, определяет преподаватель, ведущий практические занятия). Решение необходимо снабдить описанием алгоритма, обоснованием корректности и анализом асимптотической сложности.

Проверка стиля

Используется следующий cpplint, флаги: --filter=-,+build/include,+build/include_alpha,+build/include_order,+build/include_what_you_use,+build/namespaces,+build/storage_class, +dangerous/digits_in_names,+dangerous/no_braces_for, +readability/braces,+readability/casting,+readability/fn_size,+readability/macros,+readability/preincrement,+readability/utf8, +restrictions/defines,+restrictions/forbidden_class_usage, +runtime/arrays,+runtime/casting, +whitespace/blank_line,+whitespace/blank_line_between_globals,+whitespace/braces,+whitespace/comma,+whitespace/comments, +whitespace/empty_loop_body,+whitespace/end_of_line,+whitespace/ending_newline,+whitespace/forcolon,+whitespace/indent, +whitespace/line_length,+whitespace/newline,+whitespace/operators,+whitespace/parens,+whitespace/semicolon,+whitespace/tab.

Набор запрещенных классов зависит от пройденных тем. На данный момент это std::set, std::map (а также их multi версии) и std::priority_queue.

UPD 04.06.16: разрешены все классы.

Контрольная работа

Что будет на контрольной?

  1. Будет одна задача на программирование.
  2. Задача будет или на написание известного (вам) алгоритма, или на небольшую модификацию.

Как будет проходить контрольная?

  1. Контрольная пройдёт на одном из последних семинаров по АиСД. Продолжительность: 1 час 20 минут, продлеваться НЕ будет. Форма: контест.
  2. Задача выдается в начале пары, её сразу же можно начать решать, а для тех, кто не знает нужный алгоритм, семинарист параллельно на доске рассказывает идею алгоритма.
  3. Запрещается использовать телефоны, планшеты и другие мобильные устройства.
  4. Можно писать на своём ноутбуке.
  5. На время пары, возможно, будет ограничен доступ к интернету, будeт доступен только Яндекс.Contest, cppreference.com.
  6. Тесты будут открыты.

Какие правила? Чем можно пользоваться?

  1. Работа индивидуальная.
  2. Нельзя пользоваться никакими ресурсами, в том числе книгами (электронными или нет), pdf-ками, презентациями, распечатками, конспектом, своим старым кодом (в том числе в Яндекс.Contest) и пр.
  3. Можно писать на своём ноутбуке.
  4. Можно открывать только следующие сайты: Яндекс.Contest, cppreference.com.
  5. За первое нарушение указанных правил работа аннулируется.
  6. Если по какой-то причине вам необходимо воспользоваться почтой, телефоном и т.п., поднимите руку и спросите/предупредите семинариста.

Советы

  1. Подготовьтесь к занятию, повторите все пройденные алгоритмы.
  2. Заранее выпишите свои логин-пароль от Яндекс.Контеста, возможно, мы отключим интернет и у вас не будет доступа к ресурсу, где они сохранены.
  3. Зайдите в класс пораньше, включите компьютер и залогиньтесь, чтобы не терять время.

Экзамен

Экзамен включает в себя ответ по билету, состоящему из одного вопроса по темам лекций и одной задачи. На подготовку ответа дается один час. При подготовке ответа можно пользоваться любыми бумажными материалами, но нельзя пользоваться электронными устройствами. При ответе по билету можно пользоваться только конспектом, составленным во время подготовки ответа. После того как студент ответит по билету, ему могут быть заданы дополнительные задачи и вопросы по темам курса, не вошедшим в билет. При ответе на дополнительные вопросы нельзя пользоваться никакими материалами, если только это не будет явным образом разрешено экзаменатором.

Рекомендуемая литература

  1. Кормен, Лейзерсон, Ривест, Штайн. Алгоритмы: построение и анализ
  2. Дасгупта, Пападимитриу, Вазирани. Алгоритмы


Преподаватели и ассистенты

Подгруппа Преподаватель Учебные ассистенты Семинары Консультации
152-1 Михаил Нокель Андрей Атанов
152-2 Сергей Объедков Андрей Климкин Страница семинаров Понедельник, 10:30 – 11:50, ауд. 511
154-1 Илья Макаров Владимир Гончаров
154-2 Алексей Умнов Павел Белов Страница семинаров Четверг, 13:40 - 15:00
155-1 Михаил Дектярев Александр Тиунов
155-2 Павел Мельничук Александр Тиунов Страница семинаров
156-1 Филипп Синицын Максим Сабянин
156-2 Алексей Умнов Павел Белов Страница семинаров Четверг, 9:00 - 10:20
157-1 Михаил Густокашин Андрей Климкин
157-2 Яна Кашинская Андрей Атанов Понедельник, 10:30 – 11:50
158-1 Николай Субоч Максим Сабянин
158-2 Денис Симагин Владимир Гончаров Страница семинаров

Учебные контесты

Сортировки

Разделяй и властвуй + длинная арифметика

Динамическое программирование

Обход в глубину

Обход в ширину

Число путей

Кратчайшие расстояния

Хеширование

Красно-черные деревья

Минимальные остовные деревья

Максимальный поток