Алгоритмы и структуры данных, часть 1
Санкт-Петербург, осень 2011
Описание
Курс знакомит слушателей с базовыми алгоритмическими приёмами и структурами данных.
Преподаватели
Список лекций
Вычисление чисел Фибоначчи: экспоненциальный рекурсивный алгоритм, полиномиальный алгоритм, более детальный анализ. Время работы алгоритма, $O$-символика. Скорость роста функций: логарифм, полином, экспонента.
Метод разделяй и властвуй
. Умножение n-битовых чисел: простой рекурсивный алгоритм, улучшенный рекурсивный алгоритм. Рекуррентные соотношения: основная теорема. Двоичный поиск.
Сортировка слиянием: с рекурсией и без. Сортировка с помощью кучи. Нижняя оценка $\Omega(n \log n)$ для сортировки. Быстрая сортировка: анализ среднего времени работы, анализ глубины рекурсии, элиминация хвостовой рекурсии.
Быстрая сортировка (продолжение). Порядковые статистики: нахождение за линейное в среднем время.
Абстрактные типы данных, интерфейс и реализация. Массивы переменного размера: аддитивная и мультипликативная схемы реаллокации. Анализ учётных стоимостей операций: функция потенциала, истинные и учётные стоимости. Стек, очередь, дек. Реализация на основе массива переменного размера и на основе связанного списка. Моделирование очереди с помощью двух стеков. Корневое дерево: бинарное дерево, дерево с произвольным ветвлением, представление левый ребёнок -- правый сосед
.
Предварительные сведения: ациклические ориентированные графы. Общие принципы динамического программирования, часто используемые подзадачи. Кратчайшие пути в ациклических ориентированных графах. Наибольшая возрастающая подпоследовательность: подзадачи, порядок на подзадачах, граф подзадач, сравнение с рекурсивным алгоритмом; нахождение не только длины, но и самой подпоследовательности. Стоимость редактирования: граф на подзадачах, нахождение кратчайшего пути в данном графе.
Задача о рюкзаке: рюкзак с повторениями и без, ленивые вычисления. Перемножение последовательности матриц: представление порядка перемножения в виде дерева, оценка на количество порядков. Независимые множества в деревьях. О времени и памяти алгоритмов, основанных на методе динамического программирования.
Дерево поиска: поиск, вставка, удаление, поиск следующего и предыдущего элемента за время, пропорциональное высоте. АВЛ-дерево (или какое-нибудь другое сбалансированное дерево): верхняя оценка на высоту, малое и большое вращение.
Декартовы деревья, операции split и merge, реализация стандартных операций деревьев поиска через split и merge.
Верхняя оценка $O(\log n)$ на среднюю стоимость операций.
Графы и способы их представления, способы использования графов. Поиск в глубину в неориентированных графах, выделение компонент связности.
Поиск в глубину в ориентированных графах: ориентированные ациклические графы, топологическая сортировка вершин, наличие стока и истока в ациклическом графе, выделение компонент сильной связности.
Расстояния в графе. Поиск в ширину: обход, дерево кратчайших путей, сравнение с поиском в глубину. Алгоритм Дейкстры: адаптация поиска в ширину введением дополнительных вершин; установка будильников; алгоритм Дейкстры; альтернативный взгляд на алгоритм: последовательное расширение множества вершин, до которых расстояние уже посчитано; время работы алгоритма при различных реализациях очереди с приоритетами.