Предисловие
1. Введение
1.1. Алгоритмы
1.2. Анализ алгоритмов
1.3. Построение алгоритмов
1.4. О пользе быстрых алгоритмов
I. Математические основы анализа алгоритмов
Введение
2. Скорость роста функций
2.1. Асимптотические обозначения
2.2. Стандартные функции и обозначения
3. Суммирование
3.1. Суммы и их свойства
3.2. Оценки сумм
4. Рекуррентные соотношения
4.1. Метод подстановки
4.2. Метод итераций
4.3. Общий рецепт
4.4 Доказательство теоремы 4.1
5. Множества
5.1. Множества
5.2. Отношения
5.3. Функции
5.4. Графы
5.5. Деревья
6. Комбинаторика и вероятность
6.1. Подсчёт количеств
6.2. Вероятность
6.3. Дискретные случайные величины
6.4. Геометрическое и биномиальное распределения
6.5 Хвосты биномиального распределения
6.6. Вероятностный анализ
II. Сортировка и порядковые статистики
Введение
7. Сортировка с помощью кучи
7.1. Кучи
7.2. Сохранение основного свойства кучи
7.3. Построение кучи
7.4. Алгоритм сортировки с помощью кучи
7.5. Очереди с приоритетами
8. Быстрая сортировка
8.1. Описание быстрой сортировки
8.2. Работа быстрой сортировки
8.3. Вероятностные алгоритмы быстрой сортировки
8.4. Анализ быстрой сортировки
9. Сортировка за линейное время
9.1. Нижние оценки для сортировки
9.2. Сортировка подсчётом
9.3. Цифровая сортировка
9.4. Сортировка вычёрпыванием
10. Медианы и порядковые статистики
10.1. Минимум и максимум
10.2. Выбор за линейное в среднем время
10.3. Выбор за линейное в худшем случае время
III. Структуры данных
Введение
11. Элементарные структуры данных
11.1. Стеки и очереди
11.2. Связанные списки
11.3. Реализация указателей и записей с несколькими полями
11.4. Представление корневых деревьев
12. Хеш-таблицы
12.1. Прямая адресация
12.2. Хеш-таблицы
12.3. Хеш-функции
12.4. Открытая адресация
13. Двоичные деревья поиска
13.1. Что такое двоичное дерево поиска?
13.2. Поиск в двоичном дереве
13.3. Добавление и удаление элемента
13.4 Случайные двоичные деревья поиска
14. Красно-чёрные деревья
14.1. Свойства красно-чёрных деревьев
14.2. Вращения
14.3. Добавление вершины
14.4. Удаление
15. Пополнение структур данных
15.1. Динамические порядковые статистики
15.2. Общая схема работы с дополнительной информацией
15.3. Деревья промежутков
IV. Методы построения и анализа алгоритмов
Введение
16. Динамическое программирование
16.1. Перемножение нескольких матриц
16.2. Когда применимо динамическое программирование
16.3. Наибольшая общая подпоследовательность
16.4. Оптимальная триангуляция многоугольника
17. Жадные алгоритмы
17.1. Задача о выборе заявок
17.2. Когда применим жадный алгоритм?
17.3. Коды Хаффмена
17.4 Теоретические основы жадных алгоритмов
17.5 Задача о расписании
18. Амортизационный анализ
18.1. Метод группировки
18.2. Метод предоплаты
18.3. Метод потенциалов
18.4. Динамические таблицы
V. Более сложные структуры данных
Введение
19 Б-деревья
19.1. Определение Б-дерева
19.2. Основные операции с Б-деревьями
19.3. Удаление элемента из Б-дерева
20. Биномиальные кучи
20.1. Биномиальные деревья и биномиальные кучи
20.2. Операции с биномиальными кучами
21. Фибоначчиевы кучи
21.1. Строение фибоначчиевой кучи
21.2. Операции, предусмотренные для сливаемых куч
21.3. Уменьшение ключа и удаление вершины
21.4. Оценка максимальной степени
22. Системы непересекающихся множеств
22.1. Операции с непересекающимися множествами
22.2. Реализация с помощью списков
22.3. Лес непересекающихся множеств
22.4 Объединение по рангам со сжатием путей: анализ
VI. Алгоритмы на графах
Введение
23. Основные алгоритмы на графах
23.1. Представление графов
23.2. Поиск в ширину
23.3. Поиск в глубину
23.4. Топологическая сортировка
23.5. Сильно связные компоненты
24. Минимальные покрывающие деревья
24.1. Построение минимального покрывающего дерева
24.2. Алгоритмы Крускала и Прима
25. Кратчайшие пути из одной вершины
25.1. Кратчайшие пути и релаксация
25.2. Алгоритм Дейкстры
25.3. Алгоритм Беллмана-Форда
25.4. Кратчайшие пути в ациклическом ориентированном графе
25.5. Ограничения на разности и кратчайшие пути
26. Кратчайшие пути для всех пар вершин
26.1. Кратчайшие пути и умножение матриц
26.2. Алгоритм Флойда - Уоршолла
26.3. Алгоритм Джонсона для разреженных графов
26.4 Замкнутые полукольца: общая схема для задач о путях
27. Максимальный поток
27.1. Потоки в сетях
27.2. Метод Форда - Фалкерсона
27.3. Максимальное паросочетание в двудольном графе
27.4 Алгоритм «проталкивания предпотока»
27.5 Алгоритм «поднять-и-в-начало»
Дополнительные главы
Введение
28. Сортирующие сети
28.1. Сети компараторов
28.2. Правило нуля и единицы
28.3. Битонический сортировщик
28.4. Сливающая сеть
28.5. Сортирующая сеть
29. Арифметические схемы
29.1. Схемы из функциональных элементов
29.2. Схемы для сложения
29.3. Схемы для умножения
29.4. Тактированные схемы
30. Алгоритмы параллельных вычислений
30.1. Переходы по указателям
30.2. CRCW- и EREW-алгоритмы
30.3. Теорема Брента и эффективность по затратам
30.4 Эффективная параллельная обработка префиксов
30.5. Нарушение симметрии (детерминированный алгоритм)
31. Матрицы и действия с ними
31.1. Матрицы и их свойства
31.2. Алгоритм Штрассена умножения матриц
31.3 Алгебраические системы и умножение булевых матриц
31.4. Решение систем линейных уравнений
31.5. Обращение матриц
31.6. Положительно определённые симметрические матрицы
32. Многочлены и быстрое преобразование Фурье
32.1. Представление многочленов
32.2. Дискретное преобразование Фурье. Быстрый алгоритм
32.3. Эффективные реализации быстрого преобразования Фурье
33. Теоретико-числовые алгоритмы
33.1. Начальные сведения из теории чисел
33.2. Наибольший общий делитель
33.3. Модулярная арифметика
33.4. Решение линейных диофантовых уравнений
33.5. Китайская теорема об остатках
33.6. Степени элемента
33.7. Криптосистема RSA с открытым ключом
33.8 Проверка чисел на простоту
33.9 Разложение чисел на множители
34. Поиск подстрок
34.1. Простейший алгоритм
34.2. Алгоритм Рабина-Карпа
34.3. Поиск подстрок с помощью конечных автоматов
34.4. Алгоритм Кнута - Морриса - Пратта
34.5. Алгоритм Бойера-Мура
35. Вычислительная геометрия
35.1. Свойства отрезков
35.2. Есть ли пересекающиеся отрезки?
35.3. Построение выпуклой оболочки
35.4. Отыскание пары ближайших точек
36. NP-полнота
36.1. Полиномиальное время
36.2. Проверка принадлежности языку и класс NP
36.3. NP-полнота и сводимость
36.4. Доказательства NP-полноты
36.5. NP-полные задачи
37. Приближенные алгоритмы
37.1. Задача о вершинном покрытии
37.2. Задача коммивояжёра
37.3. Задача о покрытии множествами
37.4. Задача о суммах подмножеств
Литература
Предметный указатель
Именной указатель