Обложка.................................................................................................. 1
Предисловие.............................................................................................. 14
Читателю................................................................................................. 14
Преподавателю............................................................................................ 16
Благодарности............................................................................................ 17
Ограничение ответственности.............................................................................. 18
ЧАСТЬ I. ПРАКТИЧЕСКАЯ РАЗРАБОТКА АЛГОРИТМОВ.............................................................. 20
Глава 1. Введение в разработку алгоритмов............................................................ 22
1.1. Оптимизация маршрута робота................................................................. 23
1.2. Задача календарного планирования............................................................ 27
1.3. Обоснование правильности алгоритмов......................................................... 30
1.3.1. Представление алгоритмов.............................................................. 31
1.3.2. Задачи и свойства..................................................................... 32
1.3.3. Демонстрация неправильности алгоритма................................................. 33
1.3.4. Индукция и рекурсия................................................................... 34
1.3.5. Суммирование.......................................................................... 36
1.4. Моделирование задачи........................................................................ 38
1.4.1. Комбинаторные объекты................................................................. 38
1.4.2. Рекурсивные объекты................................................................... 40
1.5. Истории из жизни............................................................................ 41
1.6. История из жизни. Моделирование проблемы ясновидения........................................ 42
1.7. Упражнения.................................................................................. 46
Глава 2. Анализ алгоритмов........................................................................... 50
2.1. Модель вычислений RAM....................................................................... 50
2.1.1. Анализ сложности наилучшего, наихудшего и среднего случая............................. 51
2.2. Асимптотические обозначения................................................................. 53
2.3. Скорость роста и отношения доминирования.................................................... 56
2.3.1. Отношения доминирования............................................................... 57
2.4. Работа с асимптотическими обозначениями..................................................... 59
2.4.1. Сложение функций...................................................................... 59
2.4.2. Умножение функций..................................................................... 59
2.5. Оценка эффективности........................................................................ 60
2.5.1. Сортировка методом выбора............................................................. 60
2.5.2. Сортировка вставками.................................................................. 61
2.5.3. Сравнение строк....................................................................... 62
2.5.4. Умножение матриц...................................................................... 64
2.6. Логарифмы и их применение................................................................... 65
2.6.1. Логарифмы и двоичный поиск............................................................ 65
2.6.2. Логарифмы и деревья................................................................... 65
2.6.3. Логарифмы и биты...................................................................... 66
2.6.4. Логарифмы и умножение................................................................. 66
2.6.5. Быстрое возведение в степень.......................................................... 67
2.6.6. Логарифмы и сложение.................................................................. 67
2.6.7. Логарифмы и система уголовного судопроизводства....................................... 68
2.7. Свойства логарифмов......................................................................... 69
2.8. История из жизни. Загадка пирамид........................................................... 70
2.9. Анализ высшего уровня
................................................................... 73
2.9.1. Малораспространенные функции.......................................................... 74
2.9.2. Пределы и отношения доминирования..................................................... 75
2.10. Упражнения................................................................................. 76
Глава 3. Структуры данных............................................................................ 85
3.1. Смежные и связные структуры данных.......................................................... 85
3.1.1. Массивы............................................................................... 86
3.1.2. Указатели и связные структуры данных.................................................. 87
3.1.3. Сравнение............................................................................. 90
3.2. Стеки и очереди............................................................................. 91
3.3. Словари..................................................................................... 92
3.4. Двоичные деревья поиска..................................................................... 96
3.4.1. Реализация двоичных деревьев.......................................................... 97
3.4.2. Эффективность двоичных деревьев поиска................................................101
3.4.3. Сбалансированные деревья поиска.......................................................102
3.5. Очереди с приоритетами......................................................................103
3.6. История из жизни. Триангуляция..............................................................105
3.7. Хеширование и строки........................................................................108
3.7.1. Коллизии..............................................................................109
3.7.2. Эффективный метод поиска строк посредством хеширования................................111
3.7.3. Выявление дубликатов с помощью хеширования............................................113
3.8. Специализированные структуры данных.........................................................114
3.9. История из жизни. Геном человека............................................................115
3.10. Упражнения.................................................................................119
Глава 4. Сортировка и поиск..........................................................................124
4.1. Применение сортировки.......................................................................124
4.2. Практические аспекты сортировки.............................................................127
4.3. Пирамидальная сортировка....................................................................129
4.3.1. Пирамиды..............................................................................130
4.3.2. Создание пирамиды.....................................................................133
4.3.3. Наименьший элемент пирамиды...........................................................134
4.3.4. Быстрый способ создания пирамиды
..................................................136
4.3.5. Сортировка вставками..................................................................138
4.4. История из жизни. Билет на самолет..........................................................139
4.5. Сортировка слиянием. Метод "разделяй и властвуй.............................................142
4.6. Быстрая сортировка. Рандомизированная версия................................................144
4.6.1. Ожидаемое время исполнения алгоритма быстрой сортировки...............................147
4.6.2. Рандомизированные алгоритмы...........................................................148
4.6.3. Действительно ли алгоритм быстрой сортировки работает быстро..........................151
4.7. Сортировка распределением. Метод блочной сортировки.........................................151
4.7.1. Нижние пределы для сортировки.........................................................152
4.8. История из жизни. Адвокат Скиена............................................................153
4.9. Двоичный поиск и связанные с ним алгоритмы..................................................155
4.9.1. Частота вхождения элемента............................................................156
4.9.2. Односторонний двоичный поиск..........................................................156
4.9.3. Корни числа...........................................................................157
4.10. Метод "разделяй и властвуй.................................................................157
4.10.1. Рекуррентные соотношения.............................................................158
4.10.2. Рекуррентные соотношения метода "разделяй и властвуй.................................159
4.10.3. Решение рекуррентных соотношений типа "разделяй и властвуй"
......................160
4.11. Упражнения.................................................................................162
Глава 5. Обход графов................................................................................169
5.1. Разновидности графов........................................................................170
5.1.1. Граф дружеских отношений..............................................................173
5.2. Структуры данных для графов.................................................................175
5.3. История из жизни. Жертва закона Мура........................................................179
5.4. История из жизни. Создание графа............................................................182
5.5. Обход графа.................................................................................185
5.6. Обход в ширину..............................................................................186
5.6.1. Применение обхода.....................................................................188
5.6.2. Поиск путей...........................................................................189
5.7. Применение обхода в ширину..................................................................190
5.7.1. Компоненты связности..................................................................190
5.7.2. Раскраска графов двумя цветами........................................................192
5.8. Обход в глубину.............................................................................193
5.9. Применение обхода в глубину.................................................................196
5.9.1. Поиск циклов..........................................................................197
5.9.2. Шарниры графа.........................................................................197
5.10. Обход в глубину ориентированных графов.....................................................201
5.10.1. Топологическая сортировка............................................................203
5.10.2. Сильно связные компоненты............................................................204
5.11. Упражнения.................................................................................208
Глава 6. Алгоритмы для работы со взвешенными графами.................................................214
6.1. Минимальные остовные деревья................................................................215
6.1.1. Алгоритм Прима........................................................................216
6.1.2. Алгоритм Крускала.....................................................................219
6.1.3. Поиск-объединение.....................................................................221
6.1.4. Разновидности остовных деревьев.......................................................224
6.2. История из жизни. И все на свете только сети................................................225
6.3. Поиск кратчайшего пути......................................................................228
6.3.1. Алгоритм Дейкстры.....................................................................229
6.3.2. Кратчайшие пути между всеми парами вершин.............................................232
6.3.3. Транзитивное замыкание................................................................234
6.4. История из жизни. Печатаем с помощью номеронабирателя.......................................235
6.5. Потоки в сетях и паросочетание в двудольных графах..........................................240
6.5.1. Паросочетание в двудольном графе......................................................240
6.5.2. Вычисление потоков в сети.............................................................241
6.6. Разрабатывайте не алгоритмы, а графы........................................................245
6.7. Упражнения..................................................................................247
Глава 7. Комбинаторный поиск и эвристические методы..................................................252
7.1. Перебор с возвратом.........................................................................252
7.1.1. Генерирование всех подмножеств........................................................255
7.1.2. Генерирование всех перестановок.......................................................256
7.1.3. Генерирование всех путей в графе......................................................257
7.2. Отсечение вариантов поиска..................................................................259
7.3. Судоку......................................................................................260
7.4. История из жизни. Покрытие шахматной доски..................................................265
7.5. Эвристические методы перебора...............................................................268
7.5.1. Произвольная выборка..................................................................269
7.5.2. Локальный поиск.......................................................................272
7.5.3. Имитация отжига.......................................................................275
7.5.4. Применение метода имитации отжига.....................................................279
7.6. История из жизни. Только это не радио.......................................................281
7.7. История из жизни. Отжиг массивов............................................................284
7.8. Другие эвристические методы поиска..........................................................287
7.9. Параллельные алгоритмы......................................................................288
7.10. История из жизни. "Торопиться в никуда.....................................................290
7.11. Упражнения.................................................................................291
Глава 8. Динамическое программирование...............................................................294
8.1. Кэширование и вычисления....................................................................295
8.1.1. Генерирование чисел Фибоначчи методом рекурсии........................................295
8.1.2. Генерирование чисел Фибоначчи посредством кэширования.................................296
8.1.3. Генерирование чисел Фибоначчи посредством динамического программирования..............298
8.1.4. Биномиальные коэффициенты.............................................................299
8.2. Поиск приблизительно совпадающих строк......................................................301
8.2.1. Применение рекурсии для вычисления расстояния редактирования..........................302
8.2.2. Применение динамического программирования для вычисления расстояния редактирования....303
8.2.3. Восстановление пути...................................................................305
8.2.4. Разновидности расстояния редактирования...............................................307
8.3. Самая длинная возрастающая последовательность...............................................311
8.4. История из жизни. Эволюция омара............................................................313
8.5. Задача разбиения............................................................................316
8.6. Синтаксический разбор.......................................................................319
8.6.1. Триангуляция с минимальным весом......................................................321
8.7. Ограничения динамического программирования. Задача коммивояжера.............................323
8.7.1. Вопрос правильности алгоритмов динамического программирования.........................324
8.7.2. Эффективность алгоритмов динамического программирования...............................325
8.8. История из жизни. Динамическое программирование и язык Prolog...............................326
8.9. История из жизни. Сжатие текста для штрих-кодов.............................................329
8.10. Упражнения.................................................................................333
Глава 9. Труднорешаемые задачи и аппроксимирующие алгоритмы..........................................339
9.1. Сведение задач..............................................................................339
9.1.1. Ключевая идея.........................................................................340
9.1.2. Задачи разрешимости...................................................................341
9.2. Сведение для создания новых алгоритмов......................................................342
9.2.1. Поиск ближайшей пары..................................................................342
9.2.2. Максимальная возрастающая подпоследовательность.......................................343
9.2.3. Наименьшее общее кратное..............................................................344
9.2.4. Выпуклая оболочка
.................................................................345
9.3. Простые примеры сведения сложных задач......................................................346
9.3.1. Гамильтонов цикл......................................................................346
9.3.2. Независимое множество и вершинное покрытие............................................348
9.3.3. Задача о клике........................................................................351
9.4. Задача выполнимости булевых формул..........................................................352
9.4.1. Задача выполнимости в 3-конъюнктивной нормальной форме................................353
9.5. Нестандартные сведения......................................................................354
9.5.1. Целочисленное программирование........................................................355
9.5.2. Вершинное покрытие....................................................................357
9.6. Искусство доказательства сложности..........................................................359
9.7. История из жизни. Наперегонки со временем...................................................361
9.8. История из жизни. Полный провал.............................................................363
9.9. Сравнение классов сложности P и NP..........................................................365
9.9.1. Верификация решения и поиск решения...................................................366
9.9.2. Классы сложности P и NP...............................................................366
9.9.3. Почему задача выполнимости является самой сложной из всех сложных задач...............367
9.9.4. NP-сложность по сравнению с NP-полнотой...............................................368
9.10. Решение NP-полных задач....................................................................368
9.10.1. Аппроксимация вершинного покрытия....................................................369
9.10.2. Задача коммивояжера в евклидовом пространстве........................................371
9.10.3. Максимальный бесконтурный подграф....................................................372
9.10.4. Задача о покрытии множества..........................................................373
9.11. Упражнения.................................................................................376
Глава 10. Как разрабатывать алгоритмы................................................................381
Список вопросов разработчика алгоритмов..........................................................382
ЧАСТЬ II. КАТАЛОГ АЛГОРИТМИЧЕСКИХ ЗАДАЧ..................................................................386
Глава 11. Описание каталога..........................................................................388
Предостережения..................................................................................389
Глава 12. Структуры данных...........................................................................390
12.1. Словарь....................................................................................390
12.2. Очереди с приоритетами.....................................................................396
12.3. Суффиксные деревья и массивы...............................................................399
12.4. Графы......................................................................................403
12.5. Множества..................................................................................407
12.6. Kd-деревья.................................................................................411
Глава 13. Численные задачи...........................................................................416
13.1. Решение системы линейных уравнений.........................................................417
13.2. Уменьшение ширины ленты матрицы............................................................420
13.3. Умножение матриц...........................................................................423
13.4. Определители и перманенты..................................................................426
13.5. Условная и безусловная оптимизация.........................................................428
13.6. Линейное программирование..................................................................432
13.7. Генерирование случайных чисел..............................................................436
13.8. Разложение на множители и проверка чисел на простоту.......................................441
13.9. Арифметика произвольной точности...........................................................444
13.10. Задача о рюкзаке..........................................................................449
13.11. Дискретное преобразование Фурье...........................................................452
Глава 14. Комбинаторные задачи.......................................................................456
14.1. Сортировка.................................................................................457
14.2. Поиск......................................................................................462
14.3. Поиск медианы и выбор элементов............................................................466
14.4. Генерирование перестановок.................................................................469
14.5. Генерирование подмножеств..................................................................473
14.6. Генерирование разбиений....................................................................476
14.7. Генерирование графов.......................................................................480
14.8. Календарные вычисления.....................................................................485
14.9. Календарное планирование...................................................................487
14.10. Выполнимость..............................................................................490
Глава 15. Задачи на графах c полиномиальным временем исполнения......................................494
15.1. Компоненты связности.......................................................................495
15.2. Топологическая сортировка..................................................................498
15.3. Минимальные остовные деревья...............................................................501
15.4. Поиск кратчайшего пути.....................................................................506
15.5. Транзитивное замыкание и транзитивная редукция.............................................512
15.6. Паросочетание..............................................................................515
15.7. Задача поиска эйлерова цикла и задача китайского почтальона................................518
15.8. Реберная и вершинная связность.............................................................522
15.9. Потоки в сети..............................................................................525
15.10. Рисование графов..........................................................................529
15.11. Рисование деревьев........................................................................532
15.12. Планарность...............................................................................535
Глава 16. Сложные задачи на графах...................................................................539
16.1. Задача о клике.............................................................................540
16.2. Независимое множество......................................................................543
16.3. Вершинное покрытие.........................................................................545
16.4. Задача коммивояжера........................................................................548
16.5. Гамильтонов цикл...........................................................................552
16.6. Разбиение графов...........................................................................555
16.7. Вершинная раскраска........................................................................558
16.8. Реберная раскраска.........................................................................562
16.9. Изоморфизм графов..........................................................................564
16.10. Дерево Штейнера...........................................................................569
16.11. Разрывающее множество ребер или вершин....................................................573
Глава 17. Вычислительная геометрия...................................................................577
17.1. Элементарные задачи вычислительной геометрии...............................................578
17.2. Выпуклая оболочка..........................................................................582
17.3. Триангуляция...............................................................................586
17.4. Диаграммы Вороного.........................................................................590
17.5. Поиск ближайшей точки......................................................................593
17.6. Поиск в области............................................................................597
17.7. Местоположение точки.......................................................................600
17.8. Выявление пересечений......................................................................604
17.9. Разложение по контейнерам..................................................................608
17.10. Преобразование к срединной оси............................................................611
17.11. Разбиение многоугольника на части.........................................................614
17.12. Упрощение многоугольников.................................................................616
17.13. Выявление сходства фигур..................................................................620
17.14. Планирование перемещений..................................................................622
17.15. Конфигурации прямых.......................................................................626
17.16. Сумма Минковского.........................................................................629
Глава 18. Множества и строки.........................................................................632
18.1. Поиск покрытия множества...................................................................632
18.2. Задача укладки множества...................................................................636
18.3. Сравнение строк............................................................................639
18.4. Нечеткое сравнение строк...................................................................642
18.5. Сжатие текста..............................................................................648
18.6. Криптография...............................................................................652
18.7. Минимизация конечного автомата.............................................................657
18.8. Максимальная общая подстрока...............................................................660
18.9. Поиск минимальной общей надстроки..........................................................664
Глава 19. Ресурсы....................................................................................667
19.1. Программные системы........................................................................667
19.1.1. Библиотека LEDA......................................................................667
19.1.2. Библиотека CGAL......................................................................668
19.1.3. Библиотека Boost.....................................................................669
19.1.4. Библиотека GOBLIN....................................................................669
19.1.5. Библиотека Netlib....................................................................669
19.1.6. Коллекция алгоритмов ассоциации ACM..................................................670
19.1.7. Сайты SourceForge и CPAN.............................................................670
19.1.8. Система Stanford GraphBase...........................................................670
19.1.9. Пакет Combinatorica..................................................................671
19.1.10. Программы из книг...................................................................671
19.2. Источники данных...........................................................................673
19.3. Библиографические ресурсы..................................................................674
19.4. Профессиональные консалтинговые услуги.....................................................674
Список литературы........................................................................................676
Предметный указатель.....................................................................................714