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

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

Описание

Курс знакомит слушателей с базовыми алгоритмическими приёмами и структурами данных.

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

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

Введение

Вычисление чисел Фибоначчи: экспоненциальный рекурсивный алгоритм, полиномиальный алгоритм, более детальный анализ. Время работы алгоритма, \(O\)-символика. Скорость роста функций: логарифм, полином, экспонента.

Рекуррентные соотношения

Метод разделяй и властвуй. Умножение n-битовых чисел: простой рекурсивный алгоритм, улучшенный рекурсивный алгоритм. Рекуррентные соотношения: основная теорема. Двоичный поиск.

Алгоритмы сортировки

Сортировка слиянием: с рекурсией и без. Сортировка с помощью кучи. Нижняя оценка \(\Omega(n \log n)\) для сортировки. Быстрая сортировка: анализ среднего времени работы, анализ глубины рекурсии, элиминация хвостовой рекурсии.

Алгоритмы сортировки

Быстрая сортировка (продолжение). Порядковые статистики: нахождение за линейное в среднем время.

Элементарные структуры данных

Абстрактные типы данных, интерфейс и реализация. Массивы переменного размера: аддитивная и мультипликативная схемы реаллокации. Анализ учётных стоимостей операций: функция потенциала, истинные и учётные стоимости. Стек, очередь, дек. Реализация на основе массива переменного размера и на основе связанного списка. Моделирование очереди с помощью двух стеков. Корневое дерево: бинарное дерево, дерево с произвольным ветвлением, представление левый ребёнок -- правый сосед.

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

Предварительные сведения: ациклические ориентированные графы. Общие принципы динамического программирования, часто используемые подзадачи. Кратчайшие пути в ациклических ориентированных графах. Наибольшая возрастающая подпоследовательность: подзадачи, порядок на подзадачах, граф подзадач, сравнение с рекурсивным алгоритмом; нахождение не только длины, но и самой подпоследовательности. Стоимость редактирования: граф на подзадачах, нахождение кратчайшего пути в данном графе.

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

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

Двоичные деревья поиска

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

Декартовы деревья

Декартовы деревья, операции split и merge, реализация стандартных операций деревьев поиска через split и merge.

Сплей-деревья

Верхняя оценка \(O(\log n)\) на среднюю стоимость операций.

Декомпозиция графов

Графы и способы их представления, способы использования графов. Поиск в глубину в неориентированных графах, выделение компонент связности.

Декомпозиция графов (продолжение)

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

Пути в графах

Расстояния в графе. Поиск в ширину: обход, дерево кратчайших путей, сравнение с поиском в глубину. Алгоритм Дейкстры: адаптация поиска в ширину введением дополнительных вершин; установка будильников; алгоритм Дейкстры; альтернативный взгляд на алгоритм: последовательное расширение множества вершин, до которых расстояние уже посчитано; время работы алгоритма при различных реализациях очереди с приоритетами.