Алгоритмы и структуры данных 2022
Цели дисциплины
Дисциплина предназначена для студенов младших курсов, профессионально направленных на профессию программиста. Изучение дисциплины требует наличия базовых навыков алгоритмизации, склонности к математическому и техническому мышлению, готовности к высокой нагрузке.
Данная дисциплина НЕ рекомендуется как введение в программирование для непрофильных направлений подготовки.
Критерии оценки
На оценку по данной дисциплине влияют теоретические знания в форме устного экзамена и/или колловкиумов (30-50%), практическое решения задач на онлайн-платформе (30-50%), участие в специализированных мероприятиях (в том числе Rucode, ICPC) (30-50%).
Основы информатики и языка программирования
- Общее устройство универсального компьютера. Архитектура фон-Неймана. Принцип хранимой программы. Гарвардская архитектура.
- Представление целых чисел. Прямое, обратное и дополнительное кодирование.
- Представление вещественных чисел. Проблемы точности вычислений. Абсолютная и относительная погрешность.
- Основные операторы языка C/С++.
- Скалярные типы данных языка C/С++.
- Операции и приоритеты в языке C/С++.
- Массивы и структуре в языке C/С++.
- Указатели и управление памятью в языке C/С++.
- Функции, передача параметров в языке C/С++.
Алгоритмы 1 (1 семестр)
Ответы на все вопросы должны включать:
Определения структур данных. Описания алгоритмов. Оценки затрат времени и памяти. Неформальные доказательства корректности и эффективности.
- Поиск. Бинарный поиск, бинарный поиск строк. Интерполяционный поиск. Бинарный поиск по ответу. Тернарный поиск.
- Простейшие структуры данных. Динамические массивы. Связные списки.
- Поиск в глубину, поиск в ширину, задачи на лабиринтах.
- Сортировка слиянием. Сортировка связных списков. Сортировка подсчётом, карманная (bucket) и поразрядная сортировка. Сортировка patience.
- Быстрая сортировка, порядковые статистики. Нахождение порядковой статистики за линейное в среднем время.
- Куча. Свойства, операции, построение. Очереди с приоритетами, сортировка кучей.
- Запросы суммы и минимума на отрезке. Частичные суммы, дерево минимумов. Деревья отрезков, операции обновления и поиска.
- Запросы суммы и минимума в многомерном случае. Поиск ближайшего общего предка.
- Отображения. Хэш-таблицы. Подбор хэш-функции. Способы разрешения коллизий в хэш-таблицах: списки, открытая адресация.
- Перебор, перебор с возвратом, комбинаторика, отсечения, метод ветвей и границ, альфа-бета-отсечение.
- Динамическое программирование. Принцип оптимальности Беллмана. Задачи о наибольшей общей/возрастающей подпоследовательности, порядке перемножения матриц. Восстановление ответа.
- Жадные алгоритмы. Эвристические применения. Задача о покрытии отрезка (выборе заявок). Метод двух указателей.
- Динамическое программирование в пространстве ответа. Задачи о разрезании стержня, рюкзаке дискретном и непрерывном.
- Поиск подстрок. Префикс-функция. z-функция. Алгоритмы Кнута-Морриса-Пратта, Рабина-Карпа.
Алгоритмы 2 (2 семестр)
- Метод разделения на подзадачи. Рекуррентные соотношения и способы их решения. Мастер-теорема.
- Факторизация целых чисел. НОД и НОК. Решето Эратосфена. Малая теорема Ферма. Операции по модулю.
- Кратное хеширование. Неточный поиск. Фильтры Блума, оценка вероятности ошибки. Операции объединения, пересечения, удаления.
- Хеширование методами кукушки и Робин-Гуда. Совершенное хеширование.
- Алгоритм Бойера-Мура (с правилом Галила).
- Бинарные деревья поиска. Операции добавления, удаления, поиска. АВЛ-деревья: условие балансировки, вывод оценки высоты, повороты, балансировка.
- Красно-чёрные деревья.
- Понятия графа, орграфа, петель, кратных рёбер, цепочек, циклов, простых цепочек, простых циклов. Поиск в ширину.
- Поиск в глубину, леммы о белом пути и отсутствии перекрёстных рёбер. Поиск циклов. Эйлеров граф, эйлеров путь. Топологическая сортировка. Связные и сильно связные компоненты.
- Минимальное остовное дерево. Алгоритмы Крускала (без разбора СНМ), Прима, Борувки.
- Кратчайшие пути. Алгоритмы Дейкстры, Беллмана-Форда, Флойда-Уоршалла.
- Мосты, точки сочленения.
- Лес непересекающихся множеств.
- Двудольные графы. Паросочетания в двудольном графе.
- Понятия задачи, алгоритма, класса сложности P, проверяющего алгоритма, класса сложности NP, сводимости одной задачи к другой, классов сложности NP-complete, NP-hard.
Дополнительные вопросы
Ответ на каждый вопрос даёт от 0 до 2 баллов.
- Динамика по подмножествам, динамика по рваному краю.
- Деревья Фенвика.
- Палиндромы, алгоритм Манакера.
- Порядковые статистики за линейное в худшем случае время (медиана медиан, BFPRT).
- Фибоначчиева куча.
- Преобразование Барроуза-Уилера. Преобразование Move-to-Front.
Конечные автоматы. Автомат Кнута-Морриса-Пратта.
Умножение Карацубы.
- Префиксное дерево.
- Сильная и кратная связность графов.
- Изоморфизм графов. Изоморфизм деревьев.
- Потоки на графах. Алгоритм Эдмондса-Карпа.