Теория алгоритмов и структуры данных
Структуры данных и алгоритмы: строгость доказательства корректности плюс асимптотика и практическая производительность.
1. Карта курса
- Сортировки, поиск, деревья, кучи, хеш-структуры.
- Графовые алгоритмы (BFS, DFS, кратчайшие пути).
- Динамическое программирование и восстановление ответа.
- Анализ асимптотики и амортизированной сложности.
1.1. Лекционный маршрут и выходные компетенции
- Недели 1-3: формализация задачи, выбор структур данных и инвариантов.
- Недели 4-6: доказательство корректности и асимптотический анализ.
- Недели 7-10: оптимизация производительности, профилирование и тестирование.
- Недели 11-14: масштабирование, параллелизм и надёжность реализации.
2. Теоретический каркас
Здесь ключевая компетенция — построение корректных и масштабируемых алгоритмов. Математическая строгость сочетается с инженерной дисциплиной: тесты, профилирование, анализ сложности и архитектурные решения.
2.1. Строгий минимум раздела
- Доказывать корректность алгоритма через инварианты цикла и разбор граничных случаев.
- Явно выделять асимптотику по времени и памяти для худшего и среднего сценариев.
- Перед оптимизацией фиксировать профиль производительности и метрики качества.
- Покрывать критические ветки тестами регрессии и негативными сценариями.
3. Ключевые формулы и зависимости
| Концепт | Формула / интерпретация |
|---|---|
| Временная сложность | \(T(n)\in O(f(n))\) |
| Пространственная сложность | \(M(n)\in O(g(n))\) |
| Амортизированная оценка | \(\bar T = \frac{1}{m}\sum_{i=1}^m T_i\) |
| Ускорение | \(S=\frac{T_{base}}{T_{opt}}\) |
| Рекурсия divide-and-conquer | \(T(n)=T(n/2)+O(1)\Rightarrow O(\log n)\) |
| Релаксация ребра | \(dist[v]=\min(dist[v],dist[u]+w(u,v))\) |
| Операции кучи | \(O(\log n)\) на вставку и извлечение |
4. Методика решения типовых задач
- Фиксировать инварианты структуры данных и проверять их после операций.
- Сначала добиваться корректности, затем оптимизировать горячие участки.
- Использовать профилирование вместо предположений о bottleneck.
- Тестировать крайние случаи и случайные входы (fuzz/property-based).
- Сравнивать несколько реализаций на одном наборе бенчмарков.
- Документировать интерфейс и асимптотику публичных методов.
4.1. Формат эталонного решения
- Записать функциональные требования и ограничения по памяти/времени.
- Доказать корректность через инварианты и разбор крайних случаев.
- Оценить сложность и проверить оценку экспериментально.
- Добавить тесты на случайные и adversarial-входы.
- Профилированием подтвердить, что оптимизация улучшила нужный участок.
5. Разбор прикладного кейса
Кейс: shortest path для больших графов
При неотрицательных весах выбирается Дейкстра с приоритетной очередью. Для разреженных графов используется adjacency list; отдельно сравнивается реализация через binary heap и Fibonacci heap с учетом констант.
5.1. Углубление кейса
Усиленный разбор алгоритмического кейса включает архитектурные ограничения: модель памяти, конкурентный доступ, стоимость коммуникаций и накладные расходы абстракций. Это позволяет избежать «академически верного, но медленного» решения.
- Сравнить две структуры данных на одинаковом наборе бенчмарков.
- Проверить корректность на случайных и adversarial-входах.
- Описать, какие инварианты защищают код от скрытых регрессий.
6. Типичные ошибки
- Оптимизация без измерений.
- Неправильная асимптотическая оценка из-за скрытых вложенных операций.
- Утечки ресурсов и гонки данных в параллельном коде.
- Использование неподходящей структуры данных.
- Отсутствие тестов регрессии после рефакторинга.
6.1. Диагностика ошибок
- Исключать ложные оптимизации без измерений до и после изменений.
- Проверять отсутствие регрессий после рефакторинга структуры данных.
- В параллельных задачах отслеживать гонки и ложное разделение cache line.
- Контролировать корректность при пустых и предельных входах.
7. Практикум (3 уровня)
Уровень A: базовая техника
- Решить 12-15 стандартных задач с полной записью решения.
- Для каждой задачи указать примененный метод и почему он корректен.
- Проверить 3 задачи альтернативным методом.
Уровень B: продвинутая отработка
- Решить 8 задач с параметрами и анализом вырожденных случаев.
- Оценить погрешность/устойчивость результата на вариациях входа.
- Подготовить короткий отчёт с выводами (1-2 страницы).
Уровень C: мини-проект
- Реализовать вычислительный прототип по теме курса.
- Сравнить минимум 2 метода и обосновать выбор лучшего.
- Подготовить репродуцируемый notebook с графиками и выводами.
8. Экзаменационный минимум и литература
Минимум к экзамену
- Все базовые определения курса в строгой формулировке.
- Ключевые теоремы/критерии и условия их применимости.
- Алгоритм решения типовой задачи каждого раздела.
- Умение объяснить источник ошибки и устойчивость метода.
- Интерпретация результата в прикладном контексте.
Рекомендуемая литература
- Кормен и др. Алгоритмы; Скиена С. Алгоритмический дизайн
- Материалы семинаров и практикумов кафедры.
- Набор задач повышенной сложности (подготовка к экзамену).
Тренажер билетов
- Докажите корректность выбранного алгоритма и укажите, где используется инвариант.
- Оцените асимптотику и объясните, когда доминируют константы реализации.
- Разберите trade-off между скоростью, памятью и читаемостью API.
- Покажите, как диагностировать узкое место и подтвердить улучшение измерениями.
План повторения перед экзаменом
Эффективная подготовка строится циклом "теория \rightarrow задачи \rightarrow разбор ошибок". Для каждого раздела фиксируйте: формулировку ключевых определений, один эталонный алгоритм решения и типовую ловушку, которая чаще всего приводит к неверному ответу.
- Сделать короткий one-page summary по каждому разделу с формулами и условиями применимости.
- Решить минимум 2 задачи базового и 1 задачу повышенного уровня по каждому крупному блоку.
- Провести устный прогон билета: формулировка теоремы, схема доказательства, прикладная интерпретация.