Алгоритмы и структуры данных
Околоуниверситетский курс с доказательствами и своей машиной в браузере.
~/courses/algoritmy $ ls
Алгоритмы обычно учат дважды и оба раза неудачно. В школе - как набор приёмов под задание с номером. На собеседовании - как список из тридцати задач, которые надо вспомнить. И в том, и в другом случае человек знает, что такое быстрая сортировка, но не может сказать, почему она быстрая и когда она перестаёт быть быстрой.
Этот курс устроен иначе. Каждый алгоритм здесь приходит с тремя вещами: почему он верен, сколько он стоит и когда его нельзя применять. Правильность доказывается инвариантом, а не проверкой на трёх примерах. Стоимость считается, а не угадывается. Границы называются прямо: у жадности есть условие, у Дейкстры есть требование к весам, у динамического программирования есть цена по памяти.
Практика идёт на машине в браузере. Она выполняет настоящий Python и честно берёт плату за каждую операцию, пропорциональную данным: поиск по списку стоит столько элементов, сколько просмотрел, сортировка стоит n·log n, снятие из начала списка стоит сдвиг хвоста. Поэтому разницу между квадратом и линией видно на замере собственной программы, а не в тексте урока. Рядом с замером печатается таблица роста: данных втрое больше - шагов во сколько раз?
Курс самодостаточен: всё, что нужно для входа, объясняется в нём самом. Достаточно уметь писать простые программы на любом языке. Первые три главы готовят к остальному: что такое алгоритм и как проследить работу программы по шагам, где Python ведёт себя не так, как другие языки, и та математика, которой курс пользуется с первых страниц, - степени и логарифмы, остатки, суммы, сочетания и логика условий. Всё остальное - индукция, вероятность, линейная алгебра - объясняется до первого применения, а не предполагается.
Разделы идут в том порядке, в каком приёмы опираются друг на друга: сначала как доказывать и как считать, потом структуры данных, потом четыре способа строить алгоритмы, потом предметные области - строки, числа, геометрия, - и в конце то, что делать с задачей, у которой быстрого решения нет и, скорее всего, не будет.
1. Алгоритм и его правильность
Что такое алгоритм, Python и математика, на которых стоит курс, что считается задачей, и как доказать, что программа делает то, что обещает, - инвариантом, а не тремя примерами.
-
1.1
Алгоритм и исполнитель
Отличишь алгоритм от инструкции, которая только похожа на него, и проследишь работу программы по таблице трассировки.
-
1.2
Python для курса
Прочитаешь и напишешь любую программу курса, не спотыкаясь там, где Python ведёт себя не так, как твой язык.
-
1.3
Математика и логика для курса
Прикинешь в уме логарифм, степень, число пар и вариантов, найдёшь остаток и честно отрицаешь условие цикла.
-
1.4
Задача и модель стоимости
Напишешь спецификацию задачи и объяснишь, за что мы платим в модели вычислителя.
-
1.5
Правильность и инвариант цикла
Докажешь правильность цикла инвариантом и найдёшь контрпример к неверному алгоритму.
-
1.6
Индукция и рекурсия
Свяжешь рекурсивный алгоритм с индукцией и докажешь его правильность по структуре самой рекурсии.
-
1.7
Конспект раздела
Соберёшь раздел в одну карту: спецификация, инвариант, мера убывания, индукция.
2. Анализ времени и памяти
Θ, O и Ω как определения, а не как значки; суммы и логарифмы; худший, средний и лучший случай; память рядом со временем.
-
2.1
Счёт операций и модель стоимости
Посчитаешь время алгоритма как функцию от размера входа и объяснишь, что считаешь.
-
2.2
Асимптотика: Θ, O, Ω и их правила
Дашь формальное определение O и докажешь принадлежность классу по определению.
-
2.3
Суммы, логарифмы и оценки сверху
Свернёшь ряд, встречающийся в анализе цикла, и оценишь его сверху интегралом.
-
2.4
Худший, средний, лучший случай и память
Отличишь средний случай от случая «в среднем по входам» и посчитаешь вспомогательную память.
-
2.5
Конспект раздела
Соберёшь раздел в таблицу порядков роста и правил обращения с ними.
3. Рекуррентности и амортизация
Три способа решить рекуррентность, главная теорема со всеми тремя случаями и амортизированный анализ, без которого динамический массив выглядит дорогим.
-
3.1
Рекуррентности - дерево и подстановка
Запишешь рекуррентность алгоритма, решишь её деревом и докажешь ответ подстановкой.
-
3.2
Главная теорема и её три случая
Применишь главную теорему во всех трёх случаях и распознаешь случай, к которому она неприменима.
-
3.3
Амортизированный анализ - три метода
Докажешь, что вставка в динамический массив стоит константу в среднем, методом потенциалов.
-
3.4
Конспект раздела
Соберёшь дерево решений «какая рекуррентность каким методом».
4. Массивы, списки и абстракции
Абстрактный тип данных против его реализации, и почему одна и та же очередь бывает дешёвой и дорогой.
-
4.1
Абстрактный тип и его реализация
Опишешь структуру набором операций и их стоимостью, не заглядывая внутрь.
-
4.2
Массив, динамический массив, связный список
Выберешь между массивом и списком по набору операций, а не по привычке.
-
4.3
Стек, очередь, дека и кольцевой буфер
Реализуешь очередь без сдвига хвоста и докажешь константу на операцию.
-
4.4
Конспект раздела
Соберёшь таблицу «операция - массив - список - дека».
5. Сортировки
Восемь сортировок, нижняя граница сравнений и то, что на самом деле стоит в стандартных библиотеках.
-
5.1
Вставками, выбором, пузырьком и Шелла
Объяснишь, почему сортировка вставками выигрывает на почти упорядоченных данных.
-
5.2
Слиянием и быстрая
Разберёшь разбиение Хоара и объяснишь, откуда у быстрой сортировки худший случай.
-
5.3
Пирамидальная сортировка
Построишь кучу за линию и отсортируешь на месте.
-
5.4
Нижняя граница сравнений и сортировки без сравнений
Докажешь границу n·log n деревом решений и обойдёшь её подсчётом.
-
5.5
Устойчивость, ключ и то, что стоит в библиотеках
Выберешь сортировку под данные и объяснишь, зачем нужна устойчивость.
-
5.6
Конспект раздела
Соберёшь таблицу сортировок по времени, памяти и устойчивости.
6. Поиск и порядковые статистики
Двоичный поиск во всех его границах и выбор k-го элемента без сортировки.
-
6.1
Двоичный поиск и его границы
Напишешь поиск левой и правой границы и докажешь обе инвариантом.
-
6.2
Выбор k-го элемента
Найдёшь медиану за линейное время в среднем и объяснишь медиану медиан.
-
6.3
Конспект раздела
Соберёшь шаблоны двоичного поиска, которые не ломаются на границе.
7. Хеширование
Как из ключа получается номер ячейки, что делать с коллизиями и почему словарь всё-таки не константа.
-
7.1
Хеш-функция и коллизии
Оценишь число коллизий и объяснишь, почему они неизбежны.
-
7.2
Цепочки и открытая адресация
Сравнишь два способа по числу проб при заданном заполнении.
-
7.3
Универсальное и идеальное хеширование
Объяснишь, что даёт случайный выбор хеш-функции и от чего он защищает.
-
7.4
Словарь настоящего языка и фильтр Блума
Прикинешь размер фильтра Блума под заданную долю ложных срабатываний.
-
7.5
Конспект раздела
Соберёшь дерево решений «когда словарь, когда дерево, когда фильтр».
8. Деревья поиска
От двоичного дерева поиска до красно-чёрного и B-дерева, и что именно делает вращение.
-
8.1
Двоичное дерево поиска и его вырождение
Реализуешь вставку и обход и покажешь вход, на котором дерево становится списком.
-
8.2
Вращения, АВЛ и красно-чёрное дерево
Объяснишь, какое свойство поддерживает баланс, и проследишь вращение по шагам.
-
8.3
2-3 деревья и B-деревья на диске
Посчитаешь высоту B-дерева и объяснишь, почему на диске выигрывает именно оно.
-
8.4
Декартово дерево, splay и списки с пропусками
Объяснишь, как случайность заменяет явную балансировку.
-
8.5
Дополненные деревья - порядковая статистика и интервалы
Добавишь к дереву поле и получишь новую операцию, не ломая старые.
-
8.6
Дерево отрезков и дерево Фенвика
Ответишь на запрос по диапазону и обновишь элемент - оба за логарифм, а не за n.
-
8.7
Конспект раздела
Соберёшь таблицу деревьев по гарантиям и цене операций.
9. Кучи и непересекающиеся множества
Структуры, которые умеют мало, но очень быстро, и от этого держат половину графовых алгоритмов.
-
9.1
Двоичная куча и очередь с приоритетами
Соберёшь очередь с приоритетами на куче и выберешь, чем закрыть уменьшение ключа.
-
9.2
Биномиальная куча, куча Фибоначчи, слияние
Объяснишь, зачем нужна дешёвая операция уменьшения ключа.
-
9.3
Непересекающиеся множества, ранг и сжатие пути
Реализуешь union-find и объяснишь, откуда берётся почти константа.
-
9.4
Конспект раздела
Соберёшь таблицу приоритетных структур и их применений.
10. Графы - представление и обход
Хранение графа, обход в глубину как инструмент доказательства и свойства, которые из обхода вычитываются: компоненты, мосты, двудольность, раскраска.
-
10.1
Как хранить граф и чем платить за выбор
Выберешь представление по плотности графа и набору операций.
-
10.2
Обход в глубину, времена входа и выхода
Классифицируешь рёбра по временам и найдёшь цикл.
-
10.3
Топологическая сортировка и компоненты сильной связности
Разложишь ориентированный граф на компоненты за два обхода.
-
10.4
Мосты, точки сочленения, двусвязность
Найдёшь ребро, разрыв которого разваливает сеть.
-
10.5
Раскраска, двудольность и планарность
Проверишь граф на двудольность обходом и оценишь, скольких цветов хватит в худшем случае.
-
10.6
Запросы к дереву - LCA, RMQ и разреженная таблица
Ответишь на запрос «наименьший общий предок» за логарифм после предподсчёта.
-
10.7
Конспект раздела
Соберёшь карту «что можно вытащить из одного обхода в глубину».
11. Кратчайшие пути и остовные деревья
Пять алгоритмов пути и три остовного дерева, и требование, при нарушении которого каждый из них врёт.
-
11.1
Поиск в ширину и алгоритм Дейкстры
Объяснишь, почему Дейкстре нужны неотрицательные веса, и покажешь контрпример.
-
11.2
Беллман-Форд, ДАГ и отрицательные циклы
Найдёшь отрицательный цикл и объяснишь, почему после него задача теряет смысл.
-
11.3
Все пары - Флойд-Уоршелл и Джонсон
Посчитаешь все расстояния и выберешь между двумя способами по плотности графа.
-
11.4
Эвристический поиск и A*
Объяснишь, что делает эвристику допустимой, и покажешь, что бывает без этого.
-
11.5
Минимальное остовное дерево - Прим, Крускал, Борувка
Докажешь свойство разреза и выведешь из него оба алгоритма разом.
-
11.6
Конспект раздела
Соберёшь дерево решений «какой алгоритм пути под какие веса».
12. Потоки, паросочетания и линейное программирование
Один общий язык для десятка непохожих задач и теорема, которая связывает поток с разрезом.
-
12.1
Максимальный поток и минимальный разрез
Найдёшь максимальный поток и предъявишь разрез, доказывающий, что больше нельзя.
-
12.2
Паросочетания и покрытия
Сведёшь задачу о назначениях к потоку и объяснишь, что даёт двудольность.
-
12.3
Линейное программирование, симплекс, двойственность
Запишешь задачу в виде ЛП и объяснишь смысл двойственной задачи.
-
12.4
Потоки минимальной стоимости
Найдёшь не просто максимальный поток, а самый дешёвый из максимальных.
-
12.5
Выпуклые потоки: модели, остаточная сеть и масштабирование
Построить разделимую выпуклую сетевую модель, различить целый и непрерывный оптимум, вычислить остаточные приращения и обосновать ремонт масштаба и число дополнений.
-
12.6
Обобщённые потоки: преобразования, леса и симплекс
Проверить баланс с множителями, вычислить поток и потенциалы хорошего дополненного леса, подтвердить двойственный сертификат и выполнить допустимый симплексный шаг с учётом вырождения.
-
12.7
Конспект раздела
Соберёшь список задач, которые сводятся к потоку или к ЛП.
13. Разделяй и властвуй
Схема, из которой выросли сортировка слиянием, Карацуба, Штрассен и быстрое преобразование Фурье.
-
13.1
Схема и её стоимость
Оценишь стоимость деления пополам и найдёшь, где выигрыш исчезает.
-
13.2
Карацуба, Штрассен и цена одного лишнего умножения
Объяснишь, почему экономия одного умножения меняет порядок роста.
-
13.3
Ближайшая пара точек
Разберёшь полосу вокруг разреза и объяснишь, почему в ней мало точек.
-
13.4
Быстрое преобразование Фурье
Умножишь два многочлена за n·log n и объяснишь, что здесь делают корни из единицы.
-
13.5
Конспект раздела
Соберёшь признаки задачи, которая поддаётся делению пополам.
14. Жадные алгоритмы
Приём, который чаще всего оказывается неверным, и два способа доказать, что в этот раз он верен.
-
14.1
Жадный выбор и доказательство обменом
Докажешь безопасность жадного шага обменным аргументом.
-
14.2
Расписания, Хаффман, покрытие множеств
Построишь код Хаффмана и объяснишь, почему он оптимален.
-
14.3
Матроиды - когда жадность работает всегда
Проверишь задачу на свойство матроида и предскажешь исход жадности.
-
14.4
Конспект раздела
Соберёшь чек-лист «можно ли здесь жадничать».
15. Динамическое программирование
Два условия применимости, порядок вычисления, восстановление ответа и цена по памяти.
-
15.1
Перекрытие подзадач и оптимальная подструктура
Проверишь задачу на оба условия и объяснишь, почему без второго ответ будет неверным.
-
15.2
Классика - рюкзак, LCS, расстояние редактирования
Составишь таблицу подзадач и восстановишь по ней сам ответ, а не только число.
-
15.3
Порядок вычисления, память и ДП по маскам
Сократишь память до одной строки таблицы и объяснишь, чем за это платишь.
-
15.4
Конспект раздела
Соберёшь порядок действий «от рекурсии к таблице» из пяти шагов.
16. Перебор и его сокращение
Когда перебор - единственный честный ответ, и как урезать его так, чтобы он всё-таки закончился.
-
16.1
Генерация комбинаторных объектов
Переберёшь подмножества, перестановки и сочетания без повторов и пропусков.
-
16.2
Поиск с возвратом и отсечения
Добавишь отсечение и измеришь, во сколько раз уменьшилось дерево перебора.
-
16.3
Ветви и границы
Построишь оценку снизу и отбросишь по ней ветку целиком.
-
16.4
Перебор в играх - минимакс и альфа-бета
Оценишь позицию минимаксом и объяснишь, что именно отсекает альфа-бета.
-
16.5
Конспект раздела
Соберёшь приёмы сокращения перебора по силе и цене.
17. Строки
Поиск подстроки от наивного до Ахо-Корасика, индексы над текстом и сжатие.
-
17.1
Наивный поиск, Рабин-Карп, КМП
Объяснишь, что запоминает префикс-функция и почему после неё не нужен откат.
-
17.2
Бойер-Мур и поиск конечным автоматом
Объяснишь, почему поиск может пропускать символы и когда это выгодно.
-
17.3
Много образцов сразу - бор и Ахо-Корасик
Построишь бор со ссылками отката и найдёшь все образцы за один проход.
-
17.4
Суффиксный массив, LCP и суффиксное дерево
Ответишь на запрос «есть ли такая подстрока» за log по готовому индексу.
-
17.5
Сжатие - RLE, Хаффман, LZ77, арифметическое
Сожмёшь строку и объяснишь, откуда берётся предел сжатия.
-
17.6
Контекстное моделирование, BWT и словарные методы
Развернёшь преобразование Барроуза-Уилера и объяснишь, почему после него текст жмётся лучше.
-
17.7
Изображения с потерями: JPEG и фрактальное сжатие
Посчитаешь искажение и квантование, разложишь JPEG на обратимые и необратимые шаги и объяснишь сходимость фрактального декодера.
-
17.8
Вейвлеты и JPEG 2000
Построишь многоуровневое разложение, восстановишь целые отсчёты lifting-преобразованием и различишь обратимое кодирование и обрезку битовых плоскостей.
-
17.9
Цвет, фильтры и область интереса
Обратишь целочисленное цветовое преобразование, вычислишь шаги9/7 с заданной нормировкой и выберешь коэффициенты для числовой ROI-маски.
-
17.10
Сжатие видео: движение, зависимости и формат
Выберешь блочное предсказание по ошибке и цене, восстановишь кадр в замкнутом контуре и обоснуешь порядок декодирования, задержку и совместимость потока.
-
17.11
Режимы видеопредсказания
Восстановишь skip и intra-блоки, различишь PB и B, построишь деформированную опору и сравнишь предсказание и преобразование по полям и кадру.
-
17.12
События сцены и зависимые слои видео
Проследишь событие до отрисованного кадра, восстановишь базовый и уточняющий слои и объяснишь обязанности описания содержания, синтеза и профиля.
-
17.13
Конспект раздела
Соберёшь таблицу «задача о строке - подходящий инструмент».
18. Числа и алгебра
Арифметика длинных чисел, модульная арифметика, простота, разложение и то, на чём стоит вся современная криптография.
-
18.1
Длинные числа и цена арифметики
Оценишь стоимость сложения и умножения через число разрядов, а не через одну операцию.
-
18.2
Модульная арифметика, НОД и обратный элемент
Найдёшь обратный элемент по модулю расширенным Евклидом.
-
18.3
Простота, решето и вероятностные тесты
Объяснишь, что именно проверяет тест Миллера-Рабина и с какой вероятностью ошибается.
-
18.4
RSA и обмен ключами
Разберёшь RSA до последнего шага и объяснишь, на какой трудной задаче он стоит.
-
18.5
Матрицы, системы уравнений и погрешность
Решишь систему методом Гаусса и покажешь, где накапливается ошибка.
-
18.6
Конспект раздела
Соберёшь список числовых приёмов и их стоимости.
19. Битовые приёмы
Слой, на котором работают структуры и компиляторы: маски, счёт единиц, арифметика без ветвлений, код Грея и биты дробных чисел.
-
19.1
Маски, сдвиги и множество на битах
Заменишь множество небольших чисел одним целым и переберёшь его подмножества.
-
19.2
Счёт единиц, младший бит, степень двойки
Посчитаешь единицы без цикла по битам и объяснишь приём.
-
19.3
Арифметика без ветвлений и деление на константу
Заменишь ветвление арифметикой, а деление на константу - умножением, и объяснишь, зачем это делает компилятор.
-
19.4
Код Грея, CRC и биты плавающей точки
Пройдёшь по коду Грея без повторов и вытащишь порядок прямо из битов дробного числа.
-
19.5
Необычные основания систем счисления
Переведёшь целые в отрицательное и комплексное основание, выведешь перенос из весов и проверишь выбор основания при заданной цене хранения.
-
19.6
Коды исправления ошибок: Хэмминг и SEC-DED
Построишь код Хэмминга и декодер SEC-DED, обоснуешь гарантии расстоянием и отличишь границу числа кодовых слов от точного оптимума.
-
19.7
Конспект раздела
Соберёшь справочник битовых приёмов с проверкой каждого.
20. Случайность как инструмент
Случайность не как источник ошибок, а как способ получить гарантию, которой детерминированно не добиться.
-
20.1
Вероятностный анализ и матожидание
Посчитаешь ожидаемое число операций через индикаторы.
-
20.2
Хвостовые оценки - Марков, Чебышёв, Чернов
Оценишь вероятность большого отклонения и поймёшь, когда трёх запусков достаточно.
-
20.3
Монте-Карло, Лас-Вегас и рандомизированный quicksort
Отличишь алгоритм, который может ошибиться, от того, который может задуматься.
-
20.4
Фильтр Блума, count-min, HyperLogLog
Обменяешь точность на память осознанно и посчитаешь цену обмена.
-
20.5
Потоковые алгоритмы и резервуарная выборка
Выберешь k случайных элементов из потока неизвестной длины за один проход.
-
20.6
Частые элементы и квантили в потоке
Найдёшь тяжёлых за один проход и назовёшь цену, которой платишь за точность.
-
20.7
Марковские цепи, случайные блуждания и MCMC
Найдёшь стационарное распределение и оценишь, за сколько шагов блуждание его достигает.
-
20.8
Непрерывная вероятность: плотности и время ожидания
Переведёшь плотность в вероятность интервала, вычислишь условное распределение и обоснуешь свойства равномерного и экспоненциального ожидания.
-
20.9
Потоки Пуассона и очереди в непрерывном времени
Построишь модель потока событий, разделишь её по типам и найдёшь распределение нагрузки в очередях M/M/1, M/M/1/K и M/M/∞.
-
20.10
Нормальное распределение, предельные законы и обучение смеси
Проверишь условия нормального приближения, построишь многомерную модель и генератор, выведешь оценки правдоподобия и выполнишь шаг EM с проверкой его ограничений.
-
20.11
Конспект раздела
Соберёшь карту «где случайность даёт выигрыш и чем он оплачен».
21. Что вообще вычислимо
Границы: что нельзя вычислить вовсе, что нельзя вычислить быстро и как доказывают и то, и другое.
-
21.1
Конечные автоматы и регулярные языки
Построишь автомат по регулярному выражению и покажешь язык, который автомату не по силам.
-
21.2
Контекстно-свободные языки и магазинные автоматы
Разберёшь выражение по грамматике и скажешь, чего КС-язык не умеет в принципе.
-
21.3
Машина Тьюринга и что считается вычислением
Объяснишь, зачем нужна формальная модель, если программы и так работают.
-
21.4
Проблема останова и неразрешимые задачи
Проведёшь доказательство неразрешимости и покажешь, где в нём диагональ.
-
21.5
P, NP, сведения и NP-полнота
Докажешь NP-полноту задачи сведением к уже известной.
-
21.6
Каталог NP-полных задач и как им пользоваться
Узнаешь в новой задаче переодетую известную и сошлёшься на неё.
-
21.7
Память как ресурс - PSPACE, L, NL и иерархии
Отличишь класс по времени от класса по памяти и объяснишь, зачем нужен второй.
-
21.8
Квантовая модель - кубит, интерференция, алгоритм Шора
Объяснишь, что квантовый компьютер ускоряет, а что нет.
-
21.9
Конспект раздела
Соберёшь карту классов и известных связей между ними.
22. Что делать со сложной задачей
Задача NP-полна - и её всё равно надо решать сегодня. Честные выходы, цена каждого и граница, за которую не пускает уже сама теория.
-
22.1
Приближённые алгоритмы - гарантия через нижнюю границу
Докажешь, что решение хуже оптимума не больше чем вдвое, ни разу не узнав самого оптимума.
-
22.2
Локальный поиск, отжиг, эвристики
Настроишь локальный поиск и объяснишь, что такое застревание в локальном минимуме.
-
22.3
Точные методы на практике - целочисленные программы и SAT-решатели
Решишь NP-полную задачу точно на входе, который встречается в жизни.
-
22.4
ЛП-округление и прямо-двойственный метод
Получишь приближение с доказанной гарантией из решения линейной релаксации.
-
22.5
Пределы приближения - PTAS, APX и почему дальше нельзя
Скажешь, у какой задачи схема приближения есть, а у какой её не будет никогда.
-
22.6
Онлайн-алгоритмы и конкурентный анализ
Оценишь решение, принимаемое без знания будущего, отношением к лучшему из возможных.
-
22.7
Параметризованные алгоритмы - FPT, дерево поиска, ядро
Отделишь размер входа от параметра и решишь NP-полную задачу быстро при малом параметре.
-
22.8
Древесная ширина, цветное кодирование и нижние границы
Посчитаешь ДП по древесному разложению и назовёшь, что запрещает гипотеза ETH.
-
22.9
Конспект раздела
Соберёшь дерево решений «что делать, если задача сложная».
23. Вычислительная геометрия
Поворот трёх точек и определитель окружности - и всё, что из них собирается: оболочка, пересечения, Вороной и Делоне, триангуляция многоугольника, поиск по диапазону. Предикаты считаем точно.
-
23.1
Точки, векторы, ориентация и пересечения
Определишь взаимное расположение отрезков без деления и без потери точности.
-
23.2
Выпуклая оболочка
Построишь оболочку за n·log n и объяснишь, что делает сортировка.
-
23.3
Заметающая прямая - пересечения отрезков и двойственность
Применишь заметающую прямую к задаче о пересечениях отрезков.
-
23.4
Локализация точки, kd-дерево, диаграмма Вороного
Ответишь на запрос «ближайший объект» быстрее полного перебора.
-
23.5
Триангуляция Делоне и её свойства
Построишь Делоне переворотами рёбер и объяснишь, чем она связана с Вороным.
-
23.6
Триангуляция многоугольника и задача о галерее
Разрежешь многоугольник на треугольники и оценишь, сколько нужно охранников.
-
23.7
Поиск по диапазону и BSP-деревья
Ответишь на запрос прямоугольником быстрее перебора точек.
-
23.8
Конспект раздела
Соберёшь набор геометрических примитивов и ловушек точности.
24. Параллельные и внешние алгоритмы
Что меняется, когда исполнителей много или когда данные не помещаются в память.
-
24.1
PRAM, работа и глубина
Оценишь параллельный алгоритм двумя числами вместо одного.
-
24.2
Префиксные суммы, слияние, сортирующие сети
Посчитаешь префиксные суммы за логарифмическую глубину.
-
24.3
Взаимное исключение и модели согласованности
Разберёшь замок Петерсона, проверишь протокол перебором состояний и объяснишь, зачем ему барьер памяти.
-
24.4
Разделяемая память - блокировки, CAS и линеаризуемость
Объяснишь, чем атомарные операции сильнее чтений и записей, и проверишь историю вызовов на линеаризуемость.
-
24.5
Коллективные операции и распределённая память
Оценишь цену рассылки и сборки на p узлах и поймёшь, откуда там логарифм.
-
24.6
Внешняя память, кеш и локальность
Объяснишь, почему одна и та же сортировка на диске ведёт себя иначе.
-
24.7
Конспект раздела
Соберёшь список величин, которые меняются при смене модели.
25. Структуры данных на практике
Что на самом деле лежит внутри списка, словаря и множества настоящего языка, и почему замер иногда спорит с асимптотикой.
-
25.1
Что внутри list, dict и set
Объяснишь поведение стандартных контейнеров через их устройство.
-
25.2
Timsort, introsort и почему в библиотеке гибрид
Объяснишь, зачем библиотечная сортировка склеена из трёх алгоритмов.
-
25.3
Память, локальность и честный замер
Замеришь две реализации так, чтобы результат что-то значил.
-
25.4
Персистентные структуры и ленивая амортизация
Сохранишь прежнюю версию структуры и посчитаешь амортизацию, которая переживает повторный доступ.
-
25.5
Неблокирующие структуры, консенсус и ABA
Соберёшь стек на CAS и поймаешь на нём ABA.
-
25.6
Конспект раздела
Соберёшь мост между асимптотикой и секундомером.
26. Как разрабатывать алгоритм
Порядок действий, когда задача новая: как её понять, где искать готовое и как не изобрести медленное.
-
26.1
Как читать задачу и как её переформулировать
Вытащишь из формулировки вход, выход и ограничения и оценишь допустимую сложность.
-
26.2
Как узнать задачу и найти готовое решение
Сведёшь новую задачу к известной и сошлёшься на известный результат.
-
26.3
Разборы: пять задач из практики
Пройдёшь путь от формулировки до выбора алгоритма на пяти чужих задачах.
-
26.4
Инженерия алгоритмов и проверка результата
Проверишь ответ независимо от алгоритма, который его выдал.
-
26.5
Конспект раздела
Соберёшь чек-лист разработки алгоритма из десяти вопросов.
27. Финальный проект
Своя пошаговая игра «Архипелаг» от техзадания до сервера: карта, путь, экономика, игроки и моды. Каждая механика - задача из курса со своей моделью, структурой, доказательством и замером; в конце - итоговая контрольная по всему курсу.
-
27.1
Техзадание: игра как набор задач
Разложишь игру на модули и для каждого запишешь спецификацию, бюджет хода и структуру данных до первой строки кода.
-
27.2
Карта мира: генерация, острова и путь
Построишь карту, на которой все острова связаны, и проведёшь по ней отряд кратчайшим путём в пределах бюджета хода.
-
27.3
Экономика: рецепты, склад, рынок и рейтинг
Посчитаешь сырьё по дереву рецептов, загрузишь трюм, найдёшь выгодный круг обмена и место игрока в рейтинге.
-
27.4
Игроки: соперники, чат, сохранения и ИИ
Подберёшь соперников, отфильтруешь чат за один проход, сравнишь сохранения по хешу и научишь компьютерного соперника смотреть на ходы вперёд.
-
27.5
Сборка: ход сервера целиком
Соберёшь решение, которое проходит и по правильности, и по числу шагов.
-
27.6
Итоговая контрольная
Проверишь курс целиком.
-
27.7
Конспект раздела
Соберёшь разбор финального проекта и типовых потерь.
28. Шпаргалка
Всё, ради чего в курс возвращаются через полгода, на одной странице.
-
28.1
Сводная шпаргалка
Найдёшь нужный алгоритм, его стоимость и его ограничение за полминуты.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий