Алгоритмы и структуры данных, часть 1

Санкт-Петербург, осень 2019

Описание

О курсе

Этот курс поможет вам получить представление о фундаментальной составляющей программирования — алгоритмах, а также о том как хранить данные и обрабатывать их — структурах данных. Мы научимся понимать, какие алгоритмы и какие структуры данных подходят к данной вам задаче, какие более эффективные. Научимся понимать какого рода задача вам поставлена. Рассмотрим множество приемов, которые уже придумало человечество, поймем, как они это придумали, и сравним эти приемы.

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

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

Продолжим структурами данных, алгоритмами на графах и другими не менее интересными темами.

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

Будут состоять из двух типов задач:

Задачи на программирование будут приниматься в автоматическом режиме на системе для контестов.

Задачи на доказательство будет приниматься через сайт центра.

Критерии выставления оценки

Оценка будет выставляться по результатам решения домашних заданий и летучек. Летучки составляют 10% от общей оценки, теоретические домашние задания - 40%, задачи на программирование - 50%.

За 85% решённых задач выставляется оценка отлично,

за 75% - хорошо,

за 60% - зачёт.

Оценка теоретических домашних заданий

Всего будет \(n\) домашних заданий (\(n\) будет где-то около 14) (\(n = 8\)). За каждое домашнее задание можно набрать 1 балл максимум. В каждом домашнем задании есть несколько задач. Решение каждой задачи вносит одинаковый вклад в оценку этого домашнего задания.

В каждом домашнем задании указано, сколько задач нужно решить, чтобы получить максимальный балл. Получить больше максимального балла нельзя. Например, если в одном домашнем задании есть 4 задачи, но для максимального балла нужно решить 3, то если вы полностью решаете любые 3 из 4, то получаете 1 балл. Либо если же вы решаете две задачи правильно, а две задачи наполовину, то тоже получите 1 балл за домашнее задание.

Оценка за все домашние задания:

  • Взять \(n - 2\) лучших домашних задания студента, \(S\) — это сумма баллов по этим домашним заданиям.

  • Оценка за теоретические домашние задания — это \(\frac{S}{n - 2}\).

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

Оценка летучек

В начале лекции будут летучки, это несколько тестовых заданий на несколько минут. У вас есть ровно одна попытка ответить на каждый вопрос. Оценка за летучки:

  • За каждую летучку вы получаете \(\frac{C}{Q}\), где C — число правильных ответов, а Q — число вопросов.

  • Всего будет \(n\) летучек, из них выбираются лучшие \(n - 2\) для студента, и суммируются полученные по ним баллы в число \(S\).

  • Оценка за летучки это \(\frac{S}{n - 2}\).

Преподаватели

Список лекций

Понятие и оценка алгоритмов

Что такое алгоритм? RAM-модель, O-символика. Оценка рекурсивных функций.

Сортировки - 1

Рассмотрим сортировки с помощью сравнений: квадратичные, сортировку слиянием и быструю сортировка.

Сортировки и поиск — 2
  • Нижняя граница на сортировки с помощью сравнений.
  • Задача о порядковой статистике.
  • Сортировка подсчетом и цифровая сортировка.
  • Двоичный поиск.
Динамическое программирование 1

Рассмотрим концепцию динамического программирования.

Задача о наибольшей возрастающей подпоследовательности

Задача о редакционном расстоянии

Задача о рюкзаке

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

Рассмотрим задачу о рюкзаке, задачу о перемножении последовательности матриц разного размера (ДП по подотрезкам), задачу о независимом множестве максимального веса в дереве (ДП по поддеревьям) и задачу коммивояжера (ДП по подмножествам)

Базовые структуры данных
  • Pointer-machine модель
  • Стек, очередь, список, дек
  • Вектор
  • Амортизационный анализ
СНМ и Деревья поиска

Система непересекающихся множеств на списках

Система непересекающихся множеств на деревьях

Дерево поиска, определение и наивная реализация функций: добавление, удаление, поиск заданного элемента, поиск минимума, поиск максимума, поиск следующего, поиск предыдущего

Сбалансированные деревья поиска

АВЛ-дерево, доказательство оценки на высоту дерева, операции добавления и удаления

2-3-дерево, операции добавления и удаления

Сбалансированные деревья поиска -- 2

Splay дерево

Декартово дерево