Алгоритмы и структуры данных III. Основной поток 2026: различия между версиями

Материал из Public ATP Wiki
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показана 21 промежуточная версия этого же участника)
Строка 1: Строка 1:
== О курсе ==
== О курсе ==
Курс алгоритмов и структур данных — одна из ключевых дисциплин в области теоретической информатики на ФПМИ. Он посвящён изучению методов эффективного решения вычислительных задач и принципов организации данных, лежащих в основе современных программных систем.
На лекциях разбираются различные модельные задачи и алгоритмы их решения, на семинарах студентам предлагается решать теоретические задачи, обсуждать их решения, реализовывать код избранных алгоритмов, а также сдавать домашние задания.
В рамках курса рассматриваются как фундаментальные теоретические вопросы, так и практические аспекты применения алгоритмических подходов в реальных задачах, возникающих в индустрии.


В первом (осеннем) семестре основное внимание будет сосредоточено на разнообразных структурах данных, которые нужны будут в роли «чёрных ящиков» для более продвинутых алгоритмов.  
В третьем семестре рассматриваются три больших блока тем: строковые алгоритмы, вычислительные вопросы теории чисел, алгоритмы в геометрии. Предполагается, что слушатели курса знакомы с основными структурами данных: деревьями отрезков и деревьями поиска. Также необходимо базовое знакомство с понятиями теории графов и основными алгоритмами на графах.
Для формирования необходимой базы в начале курса разбираются:
*классические линейные алгоритмы,
*принцип бинарного поиска,
*основные алгоритмы сортировки.


Далее курс переходит к систематическому изучению структур данных, включая:
В течение семестра студенты научатся эффективно искать вхождения слов в тексты, а также строить сложные суффиксные структуры для обработки различных запросов и изменений над большими текстами. Кульминацией этой части курса станет построение суффиксного автомата для строки, наиболее мощной структуры данных для представления текстовой информации (например, в биоинформатике).
*линейные структуры,
*кучи (приоритетные очереди),
*деревья отрезков,
*деревья поиска,
*хеш-таблицы,
*а также ряд менее стандартных, но практически значимых подходов к организации данных.


Курс ориентирован как на студентов, изучающих его в рамках обязательной программы, так
В теоретико-числовом блоке будет рассмотрено несколько классических алгоритмов (извлечение корня, дискретное логарифмирование) в конечных полях, а также алгоритм факторизации. Здесь также даётся материал по быстрому преобразованию Фурье, которое предлагает изящный способ перемножать длинные числа и работать с многочленами и функциональными рядами.
и на всех, кто заинтересован в углублённом понимании алгоритмов и стремится научиться разрабатывать эффективные и масштабируемые программные решения.


'''Пререквизиты:'''
В разделе о геометрии будут разобраны классические простые алгоритмы наподобие выпуклой оболочки и суммы Минковского. Все вопросы здесь критически важны для реализации собственных геометрических и физических движков (при разработке игр или моделировании систем). Из продвинутых алгоритмов разбираются техники пересечения полуплоскостей, построения диаграммы Вороного, триангуляции Делоне и выпуклой оболочки точек в трёхмерном пространстве.


Студенты имеют первичное представление о языках программирования. Например, студенты в прошлом сдавали ЕГЭ по информатике или участвовали в разработке ИТ-проектов.
== Команда курса ==
От желающих сдавать курс факультативно (по выбору) ожидается знакомство с одним из языков программирования в рамках любого университетского курса.
Лектор: Степанов Илья Данилович


== Команда курса ==
Семинаристы: Сбродов Егор Алексеевич
Лектор: Степанов Илья
 
Вашкевич Егор Сергеевич


Семинаристы:
Степанов Илья Данилович


== Программа курса ==
== Программа курса ==
В семестре 15 лекций и 30 семинаров (практических занятий).
В семестре 15 лекций и 30 семинаров (практических занятий).


'''Формы контроля:'''' Дифференцированный зачет и экзамен
'''Формы контроля:''' экзамен


{|class="wikitable"
{|class="wikitable"
|-
|-
!Неделя!!Лекции!!Домашние задания и контест
!Неделя!!Лекции!
|-
|-
|1||Асимптоматика. Бинарный поиск.||Бинарный поиск, два указателя
|1||Хеширование и поиск образца в строке
|-
|-
|2||MergeSoft. QuickSort.||
|2||Префикс-функция, Z-функция и палиндромы
|-
|-
|3||Derandomized. QuickSort. LSDSort.||Сортировки.
|3||Боры и алгоритм Ахо — Корасик
|-
|-
|4||Кучи. HeapSort.||
|4||Суффиксный массив и массив LCP
|-
|-
|5||Кучи(продолжение). Динамический массив||Кучи, линейные контейнеры.
|5||Дерево палиндромов
|-
|-
|6||Связные списки. Кучи Фибоначчи.||
|6||Конечные автоматы и суффиксный автомат
|-
|-
|7||Стеки. Очередь.||
|7||Суффиксное дерево и связь суффиксных структур
|-
|-
|8||Дерево отрезков.||Дерево отрезков, дерево Фенвика.
|8||Быстрое преобразование Фурье
|-
|-
|9||Динамическое ДО. Персистентные структуры данных
|9||Алгоритмы над многочленами и линейные рекурренты
|-
|-
|10||Деревья поиска:AVL-деревья, Splay-дерево.||Деревья поиска.
|10||Теория чисел и алгоритмы над конечными полями
|-
|-
|11||Неявное дерево поиска.||
|11||Вычислительная геометрия: базовые примитивы
|-
|-
|12||Декартово дерево. В-дерево.||
|12||Триангуляция многоугольников и выпуклая оболочка
|-
|-
|13||Красно-чёрное дерево.||
|13|| Алгоритмы на выпуклых многоугольниках
|-
|-
|14||Хэш-таблицы.||Хеш-таблицы.
|14||Принадлежность точки многоугольнику и пересечение полуплоскостей
|-
|-
|15||Хэш-таблицы (продолжение).||
|15||Диаграммы Вороного и триангуляция Делоне
|}
|}


== Коммуникация ==
== Коммуникация ==
За каждой группой закреплён семинарист и ассистент, к которым можно обращаться за помощью.
За каждой группой закреплён семинарист и ассистент, к которым можно обращаться за помощью.
Чат курса (Telegram)


== Прогресс студентов ==
== Прогресс студентов ==
Таблица с оценками, доступная студентам
Таблица с оценками доступна студентам в канале дисциплины


== Критерии оценивания и формы контроля успеваемости ==
== Критерии оценивания и формы контроля успеваемости ==
За курс предусмотрены '''две''' независимые оценки: за '''зачёт''' и за '''экзамен'''.
Оценка за семестр считается по формуле в общей табличке.
Оценка за зачёт ставится за работу в семестре: за сдачу теоретических и практических домашних задач, а также за активность на семинарах и помощь в развитии курса (исправление опечаток в условиях, подготовка более сильных тестов к задачам, разработка собственных задач и пр.).
Список задач будет окончательно известен только ближе к концу семестра, поэтому заранее невозможно спрогнозировать, какие будут пороги на каждую оценку.
Чтобы заработать минимальную положительную оценку (уд. 3), нужно набрать примерно 50% баллов от максимума.
Чтобы заработать наивысшую оценку (отл. 10), нужно приблизиться к идеальному студенту, решившему все задачи. Решить всё возможно: в семестре будет много бонусных задач, которые идут в зачёт
Ожидаемый максимальный балл ~150.
Если в течение семестра студент не набирает баллов на уд 3, он получает пересдачу.
На пересдачу можно сдавать те же самые практические (в первую очередь задачи без код-ревью)
и теоретические задачи. Начать дорешивать можно сразу после зачётной недели и вплоть до пересдачи в начале следующего семестра.
Оценка за экзамен ставится исключительно исходя из качества устного ответа на экзамене.
В течение семестра планируются 5–6 домашних заданий.
Выдаются примерно каждые три недели сроком на три недели.
# введение, бинарный поиск;
# сортировки;
# кучи, линейные контейнеры;
# дерево отрезков, дерево Фенвика;
# деревья поиска;
# хеш-таблицы.
'''В каждой теме планируется большой контест и небольшое теоретическое задание.'''
1. Теоретические задания
Теоретические домашние задания сдаются устно семинаристу.


Формат предполагает:
За курс предусмотрены две оценки: за зачёт и за экзамен. Оценки независимы и никак не влияют друг на друга. Оценка за зачёт ставится за работу в семестре: за сдачу теоретических и практических домашних задач, а также за активность на семинарах и помощь в развитии курса (исправление опечаток в условиях, подготовка более сильных тестов к задачам, разработка собственных задач и пр.). Оценка за экзамен ставится исключительно исходя из качества устного ответа на экзамене.
*объяснение решения,
*ответы на уточняющие вопросы,
*демонстрацию понимания используемых идей и методов.


2. Практические задания
В течение семестра планируются 5 домашних заданий, разбитых по темам:
Практические задачи делятся на два типа:
# базовые строковые алгоритмы [7–28 сентября];
# суффиксные строковые структуры [28 сентября – 24 октября];
# алгоритмы в теории чисел [21 октября – 15 ноября];
# базовые алгоритмы в геометрии [1 ноября – 21 ноября];
# продвинутые алгоритмы в геометрии [28 ноября – 15 декабря].


'''Задачи с код-ревью'''
В каждой теме планируется большой контест и небольшое теоретическое задание. Чтобы заработать минимальную положительную оценку (уд. 3), нужно набрать примерно 50% баллов от максимума.


Чтобы задача считалась решённой:
Чтобы заработать наивысшую оценку (отл. 10), нужно приблизиться к идеальному студенту, решившему почти все задачи.  
*Необходимо загрузить код в указанный репозиторий (который укажут семинарист и ассистент).
*Ассистент проводит код-ревью.
*По результатам ревью код может быть отправлен на доработку.
*После успешного прохождения всех итераций ревью задача засчитывается, и за неё выставляется балл.


'''Дополнительные правила:'''
Ожидаемый максимальный балл — 120. Оценка за семестр стремится зафиксировать уровень навыков студента в решении и реализации практических задач по алгоритмам.
*число итераций ревью не ограничено;
*при этом ассистент может отказать в дальнейшем ревью, если считает, что было сделано чрезмерное количество некачественных попыток.


'''Задачи без код-ревью'''
Экзамен же рассчитан оценить уровень теоретической подготовки студента. На нём от студента ожидается знание доказательств изученных в течение курса алгоритмов, а также умение решать теоретические задачи. Обычно такие задачи более сложные, чем практические, что компенсируется отсутствием необходимости реализовывать их (имплементировать).
*решения таких задач не предполагает обязательного просмотра кода решения со стороны ассистента.  
*такие задачи должны пройти все тесты в системе.
*пройти встроенную автоматическую проверку на кодстайл (то есть в самом яндекс-контесте настроены некоторые минимальные требования, чтобы код был не совсем плохой).  
*однако семинарист может выборочно запросить устную сдачу.
 
'''Устная защита решений'''
 
Для части задач из контестов предусмотрена устная защита.
Цель защиты:
*подтвердить самостоятельность решения,
*проверить понимание алгоритма и структуры кода.
 
Такая система позволяет оценить:
*теоретическую подготовку,
*практические навыки программирования,
*глубину понимания алгоритмов.
 
'''Бонусы'''
 
Семинарист может ставить небольшие бонусы за активность на семинарах. Уточняйте правила их выставления у семинаристов.
Если понимаете, что в какой-то задаче очень слабые тесты (заходят решения, которые не должны), можете подготовить более сильные тесты. Их добавят в систему, а вам дадут бонусные баллы.
 
'''Штрафы'''
 
Ближе к концу семестра будет проведена проверка на списывание (антиплагиат). Пойманные на списывании получат штраф к баллам за семестр, включая автоматический «неуд». Списыванием может быть рассчитано и независимое использование одного и того же открытого кода. Поэтому пишите полностью свой код, не прибегая к помощи готовых библиотек. Исключение — код, приводимый на лекциях и семинарах.


== Правила курса ==
== Правила курса ==
Более подробно и во избежание спорных ситуаций в конце семестра читайте о правилах курса [https://docs.google.com/document/d/1TNoAMWFGZHsEigH9BlM_lGI4jdHxxR66Y3jHGtntQME/edit здесь]
Подробнее о правилах курса [https://docs.google.com/document/d/1TNoAMWFGZHsEigH9BlM_lGI4jdHxxR66Y3jHGtntQME/edit здесь]


== Материалы курса ==
== Материалы курса ==
[https://www.youtube.com/playlist?list=PL4_hYwCyhAvbR2onqJWW7JQi8TYEaQN_p лекции] потока 2024 года


Примерная [https://drive.google.com/file/d/1ZU6efLnjNXPEA5iwgfmMoBwaTvZWiICn/view?usp=sharing программа] экзамена
[https://www.youtube.com/playlist?list=PL4_hYwCyhAvYlrKIbN0Qgv9yjClbrIZyG лекции] потока осень 2024
 
Примерная [https://drive.google.com/file/d/1EG31vtO4NSrRQgQgXwoHDv0YcSRM9R9m/view?usp=sharing программа] экзамена


Литература:
Литература:
# Абрамов С. А. Лекции о сложности алгоритмов. МЦНМО, 2020.
# Дасгупта С., Пападимитриу Х., Вазирани У. Алгоритмы. – МЦНМО, 2014
# Рейнгольд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы. Теория и практика. «Мир», 1980.
# Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов – «Мир», 1979
# Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. «Мир», 1979.
# Препарата Ф., Шеймос М. Вычислительная геометрия: введение – «Мир», 1989
# Кнут Д. Э. Искусство программирования, Т. 1. «ИД Вильямс», 2018.
# Gusfield D. Algorithms on Strings, Trees, and Sequences – Cambridge University Press, 1997
# Кнут Д. Э. Искусство программирования, Т. 3. «ИД Вильямс», 2018.
# De Berg M. et al. Computational Geometry. Algorithms and Applications – Springer, 2008
# Карацуба А. А., Офман Ю. П. Умножение многозначных чисел на автоматах // Доклады АН СССР, 1962, 145(2).
# Strassen V. Gaussian elimination is not optimal // Numerische Mathematik, 1969, 13(4).
# Кормен Т. и др. Алгоритмы. Построение и анализ. «ИД Вильямс», 2011.

Текущая версия от 08:17, 30 октября 2026

О курсе

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

В третьем семестре рассматриваются три больших блока тем: строковые алгоритмы, вычислительные вопросы теории чисел, алгоритмы в геометрии. Предполагается, что слушатели курса знакомы с основными структурами данных: деревьями отрезков и деревьями поиска. Также необходимо базовое знакомство с понятиями теории графов и основными алгоритмами на графах.

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

В теоретико-числовом блоке будет рассмотрено несколько классических алгоритмов (извлечение корня, дискретное логарифмирование) в конечных полях, а также алгоритм факторизации. Здесь также даётся материал по быстрому преобразованию Фурье, которое предлагает изящный способ перемножать длинные числа и работать с многочленами и функциональными рядами.

В разделе о геометрии будут разобраны классические простые алгоритмы наподобие выпуклой оболочки и суммы Минковского. Все вопросы здесь критически важны для реализации собственных геометрических и физических движков (при разработке игр или моделировании систем). Из продвинутых алгоритмов разбираются техники пересечения полуплоскостей, построения диаграммы Вороного, триангуляции Делоне и выпуклой оболочки точек в трёхмерном пространстве.

Команда курса

Лектор: Степанов Илья Данилович

Семинаристы: Сбродов Егор Алексеевич

Вашкевич Егор Сергеевич

Степанов Илья Данилович

Программа курса

В семестре 15 лекций и 30 семинаров (практических занятий).

Формы контроля: экзамен

Неделя Лекции!
1 Хеширование и поиск образца в строке
2 Префикс-функция, Z-функция и палиндромы
3 Боры и алгоритм Ахо — Корасик
4 Суффиксный массив и массив LCP
5 Дерево палиндромов
6 Конечные автоматы и суффиксный автомат
7 Суффиксное дерево и связь суффиксных структур
8 Быстрое преобразование Фурье
9 Алгоритмы над многочленами и линейные рекурренты
10 Теория чисел и алгоритмы над конечными полями
11 Вычислительная геометрия: базовые примитивы
12 Триангуляция многоугольников и выпуклая оболочка
13 Алгоритмы на выпуклых многоугольниках
14 Принадлежность точки многоугольнику и пересечение полуплоскостей
15 Диаграммы Вороного и триангуляция Делоне

Коммуникация

За каждой группой закреплён семинарист и ассистент, к которым можно обращаться за помощью.

Прогресс студентов

Таблица с оценками доступна студентам в канале дисциплины

Критерии оценивания и формы контроля успеваемости

За курс предусмотрены две оценки: за зачёт и за экзамен. Оценки независимы и никак не влияют друг на друга. Оценка за зачёт ставится за работу в семестре: за сдачу теоретических и практических домашних задач, а также за активность на семинарах и помощь в развитии курса (исправление опечаток в условиях, подготовка более сильных тестов к задачам, разработка собственных задач и пр.). Оценка за экзамен ставится исключительно исходя из качества устного ответа на экзамене.

В течение семестра планируются 5 домашних заданий, разбитых по темам:

  1. базовые строковые алгоритмы [7–28 сентября];
  2. суффиксные строковые структуры [28 сентября – 24 октября];
  3. алгоритмы в теории чисел [21 октября – 15 ноября];
  4. базовые алгоритмы в геометрии [1 ноября – 21 ноября];
  5. продвинутые алгоритмы в геометрии [28 ноября – 15 декабря].

В каждой теме планируется большой контест и небольшое теоретическое задание. Чтобы заработать минимальную положительную оценку (уд. 3), нужно набрать примерно 50% баллов от максимума.

Чтобы заработать наивысшую оценку (отл. 10), нужно приблизиться к идеальному студенту, решившему почти все задачи.

Ожидаемый максимальный балл — 120. Оценка за семестр стремится зафиксировать уровень навыков студента в решении и реализации практических задач по алгоритмам.

Экзамен же рассчитан оценить уровень теоретической подготовки студента. На нём от студента ожидается знание доказательств изученных в течение курса алгоритмов, а также умение решать теоретические задачи. Обычно такие задачи более сложные, чем практические, что компенсируется отсутствием необходимости реализовывать их (имплементировать).

Правила курса

Подробнее о правилах курса здесь

Материалы курса

лекции потока осень 2024

Примерная программа экзамена

Литература:

  1. Дасгупта С., Пападимитриу Х., Вазирани У. Алгоритмы. – МЦНМО, 2014
  2. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов – «Мир», 1979
  3. Препарата Ф., Шеймос М. Вычислительная геометрия: введение – «Мир», 1989
  4. Gusfield D. Algorithms on Strings, Trees, and Sequences – Cambridge University Press, 1997
  5. De Berg M. et al. Computational Geometry. Algorithms and Applications – Springer, 2008