Нечисленные алгоритмы программирования

Отчетность: 
экзамен
Тип: 
обязательный
Часов: 
36
Семестр: 
IV-7

Аннотация

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

Программа

  1. Введение. Содержание курса, литература. Ускорение программ методом барьера. Поиск элемента в массиве - простой и ускоренный (дихотомия). Анализ алгоритмов.
  2. Поиск подстроки. Простой алгоритм, алгоритм Рабина-Карпа, алгоритмы Кнута-Морриса-Пратта и Боуера-Мура. Анализ алгоритмов. Метрика на строках. Алгоритм дистанции Левенштейна.
  3. Сортировка. Основные определения, классификация алгоритмов. Простые методы сортировки массивов: метод включения, метод выделения, метод пузырька (обмена). Анализ алгоритмов.
  4. Улучшенные методы сортировки массивов: методы Шелла, пирамидальная сортировка (HeapSort), быстрая сортировка (QuickSort и его варианты). Анализ алгоритмов. Структура данных Heap и сфера ее применения.
  5. Сортировка за линейное время: сортировка подсчетом, Radix-Sort.
  6. Методы сортировки последовательностей: сортировка слиянием, ее анализ. Результаты экспериментального сравнения алгоритмов. Многопутевое слияние.
  7. Сортировка больших массивов, не помещающихся в оперативную память. Адаптация сортировки слиянием для этой задачи.
  8. Рекурсивные алгоритмы - основные определения и методы. Сведение рекурсии к итерациям. Сложная рекурсия. Фрактальные кривые (Гильберта, Серпинского).
  9. Рекурсивные методы при решении поисковых задач искусственного интеллекта. Поиск эвристик. Задача о восьми ферзях.
  10. Динамические структуры данных: алгоритмы обработки списков. Влияние порядка сортировки списка на задачу поиска. Кольцевые списки. Многосвязные списки (skip-lists).
  11. Динамические массивы и деки (deque).
  12. Деревья и их применение для задач поиска/включения. Бинарные деревья. Балансировка. АВЛ-Деревья. Красно-черные деревья. 
  13. В-деревья и B+-деревья. Задачи построения динамических хранилищ. 2-3 деревья.
  14. Хэширование и хэш-таблицы. Методы разрешения коллизий. Открытая адресация, квадратичные пробы. Хэширование строк. Совершенное хэширование.
  15. Цифровой поиск: префиксные деревья, trie, patricia.
  16. Стратегии кэширования часто используемых данных в быстрой памяти.

Литература

  1. Н.Вирт. Алгоритмы и структуры данных.
  2. Р.Седжвик. Фундаментальные алгоритмы на C++.
  3. М.А.Бабенко, М.В.Левин. Введение в теорию алгоритмов и структур данных.
  4. Т.Кормен, Ч.Лейзерсон, Р.Ривест. Алгоритмы: построение и анализ.
  5. Д.Кнут. Искусство программирования для ЭВМ.