
В издательстве “БХВ” вышло третье издание бестселлера Стивена Скиены: “Алгоритмы. Руководство по разработке. 3-е изд.“.
Книга является наиболее полным руководством по разработке эффективных алгоритмов. Первая часть книги содержит практические рекомендации по разработке алгоритмов: приводятся основные понятия, дается анализ алгоритмов, рассматриваются типы структур данных, основные алгоритмы сортировки, операции обхода графов и алгоритмы для работы со взвешенными графами, примеры использования комбинаторного поиска, эвристических методов и динамического программирования. Вторая часть книги содержит обширный список литературы и каталог из 75 наиболее распространенных алгоритмических задач, для которых перечислены существующие программные реализации.
В третьем издании расширен набор рандомизированных алгоритмов, алгоритмов хеширования, аппроксимации и квантовых вычислений. Добавлено более 100 новых задач, даны ссылки к реализациям на C, C++ и Java.
Книгу можно использовать в качестве справочника по алгоритмам для программистов, исследователей и в качестве учебного пособия для студентов соответствующих специальностей.
Наиболее полное руководство по разработке эффективных алгоритмов
Расширенное и обновленное третье издание классического бестселлера продолжает раскрывать «загадку» разработки алгоритмов и анализа их эффективности. Книга является основным учебником для курсов по разработке алгоритмов, пособием для самоподготовки к собеседованиям, сохраняя при этом свой статус главного практического справочника по алгоритмам для программистов, исследователей и студентов.
Первая часть представляет собой общее введение в технические приемы разработки и анализа компьютерных алгоритмов.
Вторая часть содержит обширный список литературы и каталог наиболее распространенных алгоритмических задач, для которых перечислены существующие программные реализации.
Новое в третьем издании
• Расширенный набор рандомизированных алгоритмов, хеширования, алгоритмов «разделяй и властвуй», аппроксимации и квантовых вычислений.
• Онлайн-поддержка для преподавателей, включающая слайды и видеоуроки.
• Полноцветные иллюстрации и код, наглядно разъясняющие сложные концепции
• Новые «истории из жизни», рассказывающие об опыте работы с реальными приложениями.
• Более 100 новых задач, включая задачи по программированию от LeetCode и Hackerrank.
• Актуальные ссылки к лучшим реализациям на языках C, C++ и Java.
От автора
Читатели предыдущих изданий одобрили три аспекта руководства: каталог алгоритмических задач, истории из жизни и электронную версию книги. Эти элементы сохранены и в настоящем издании.
- Каталог алгоритмических задач. Не так-то просто узнать, что уже известно о стоящей перед вами задаче. Именно поэтому в книге имеется каталог 75 наиболее важных задач, часто возникающих в реальной жизни.
- Истории из жизни. Чтобы продемонстрировать, как алгоритмические задачи возникают в реальной жизни, в материал книги включены неприукрашенные истории, описывающие мой опыт по решению практических задач.
- Онлайновый компонент. На моем веб-сайте (www.algorist.com) в полном объеме представлены конспекты лекций, а также Wiki-энциклопедия решений задач. Этот веб-сайт был обновлен совместно с книгой.
На веб-сайте автора www.algorist.com в полном объеме представлены конспекты лекций, а также Wiki-энциклопедия решений задач. Этот веб-сайт был обновлен совместно с книгой.
Преподаватели смогут загрузить здесь полный набор лекционных слайдов для проведения занятий по материалам книги. Кроме того, выложены аудио- и видеолекции с использованием этих слайдов для преподавания полного курса продолжительностью в один семестр.
Оригинальная книга: “The Algorithm Design Manual (Texts in Computer Science)” 3rd ed. 2020 Editionby Steven S. Skiena (Author)
Отзывы
Это руководство — мой абсолютный фаворит для подготовки к собеседованию. Больше, чем любая другая книга, она помогла мне понять, насколько поразительно распространены… проблемы с графами — они должны быть частью набора инструментов каждого работающего программиста. В книге также рассматриваются основные структуры данных и алгоритмы сортировки, что является приятным бонусом, а простые и понятные картинки облегчают запоминание.
Стив Йегге, публикация «Get that Job at Google»
Эта книга сохраняет за собой звание лучшего и наиболее полного практического руководства по алгоритмам … Каждый программист должен ее прочитать и держать под рукой. … Это лучшая инвестиция…, которую может сделать программист.
Гарольд Тимблби, журнал «Times Higher Education»
Замечательно открыть книгу на любой странице и обнаружить интересный алгоритм. Это единственный учебник, который я храню со студенческих лет!
Кори Барт, Делавэрский университет

Стивен Соль Скиена — ученый-компьютерщик и заслуженный профессор компьютерных наук в Университете Стоуни-Брук, директор Института искусственного интеллекта в Стоуни-Брук. Автор нескольких популярных книг в области алгоритмов, программирования и математики. Его книга Алгоритмы. Руководство по разработке (The Algorithm Design Manual) широко используется в качестве учебника по алгоритмам и для подготовки к собеседованию в технической индустрии. В 2001 году Скиена была награждена премией IEEE Computer Science and Engineering для студентов-преподавателей «За выдающийся вклад в высшее образование в области алгоритмов и дискретной математики, а также за влиятельные учебники и программное обеспечение» (Источник: Википедия).
-
Алгоритмы. Руководство по разработке. 3-е изд.
2000 ₽
1700 ₽
Предисловие…………………………………………………………………………………………… 17
Читателю…………………………………………………………………………………………………………………………………….. 17
Преподавателю………………………………………………………………………………………………………………………….. 19
Благодарности…………………………………………………………………………………………………………………………… 20
Ограничение ответственности………………………………………………………………………………………………….. 21
Часть I. Практическая разработка алгоритмов…………………. 23
Глава 1. Введение в разработку алгоритмов…………………………………………… 25
1.1. Оптимизация маршрута робота………………………………………………………………………………………… 26
1.2. Задача календарного планирования………………………………………………………………………………… 30
1.3. Обоснование правильности алгоритмов…………………………………………………………………………… 33
1.3.1. Задачи и свойства…………………………………………………………………………………………………….. 34
1.3.2. Представление алгоритмов……………………………………………………………………………………… 35
1.3.3. Демонстрация неправильности алгоритма……………………………………………………………. 35
Остановка для размышлений: «Жадные» кинозвезды?……………………………………………………. 37
1.3.4. Индукция и рекурсия………………………………………………………………………………………………… 38
Остановка для размышлений: Правильность инкрементных алгоритмов……………………… 39
1.4. Моделирование задачи………………………………………………………………………………………………………. 40
1.4.1. Комбинаторные объекты…………………………………………………………………………………………. 41
1.4.2. Рекурсивные объекты……………………………………………………………………………………………….. 42
1.5. Доказательство от противного………………………………………………………………………………………….. 44
1.6. Истории из жизни………………………………………………………………………………………………………………… 45
1.7. История из жизни. Моделирование проблемы ясновидения…………………………………………… 45
1.8. Прикидка……………………………………………………………………………………………………………………………… 49
Замечания к главе………………………………………………………………………………………………………………………. 50
1.9. Упражнения…………………………………………………………………………………………………………………………. 50
Поиск контрпримеров………………………………………………………………………………………………………… 50
Доказательство правильности………………………………………………………………………………………….. 51
Математическая индукция………………………………………………………………………………………………… 52
Приблизительные подсчеты………………………………………………………………………………………………. 52
Проекты по реализации……………………………………………………………………………………………………… 53
Задачи, предлагаемые на собеседовании………………………………………………………………………… 53
LeetCode………………………………………………………………………………………………………………………………. 54
HackerRank…………………………………………………………………………………………………………………………. 54
Задачи по программированию………………………………………………………………………………………….. 54
Глава 2. Анализ алгоритмов…………………………………………………………………… 55
2.1. Модель вычислений RAM………………………………………………………………………………………………….. 55
2.1.1. Анализ сложности наилучшего, наихудшего и среднего случая………………………… 56
2.2. Асимптотические («Big Oh») обозначения………………………………………………………………………… 58
Остановка для размышлений: Возвращение к определениям…………………………………………. 61
Остановка для размышлений: Квадраты…………………………………………………………………………… 61
2.3. Скорость роста и отношения доминирования………………………………………………………………….. 61
2.3.1. Отношения доминирования……………………………………………………………………………………… 63
2.4. Работа с асимптотическими обозначениями……………………………………………………………………. 64
2.4.1. Сложение функций……………………………………………………………………………………………………. 64
2.4.2. Умножение функций…………………………………………………………………………………………………. 64
Остановка для размышлений: Транзитивность………………………………………………………………… 65
2.5. Оценка эффективности……………………………………………………………………………………………………….. 65
2.5.1. Сортировка методом выбора…………………………………………………………………………………… 65
Доказываем временную сложность Θ-большое…………………………………………………….. 66
2.5.2. Сортировка вставками……………………………………………………………………………………………… 67
Доказываем временную сложность Θ-большое…………………………………………………….. 68
2.5.3. Сравнение строк……………………………………………………………………………………………………….. 68
Доказываем время исполнения по Θ-большое………………………………………………………. 69
2.5.4. Умножение матриц…………………………………………………………………………………………………… 70
2.6. Суммирование…………………………………………………………………………………………………………………….. 71
Остановка для размышлений: Формулы факториала………………………………………………………. 72
2.7. Логарифмы и их применение……………………………………………………………………………………………… 73
2.7.1. Логарифмы и двоичный поиск…………………………………………………………………………………. 73
2.7.2. Логарифмы и деревья……………………………………………………………………………………………….. 74
2.7.3. Логарифмы и биты……………………………………………………………………………………………………. 74
2.7.4. Логарифмы и умножение…………………………………………………………………………………………. 75
2.7.5. Быстрое возведение в степень…………………………………………………………………………………. 75
2.7.6. Логарифмы и сложение……………………………………………………………………………………………. 76
2.7.7. Логарифмы и система уголовного судопроизводства…………………………………………… 76
2.8. Свойства логарифмов…………………………………………………………………………………………………………. 77
Остановка для размышлений: Важно ли деление точно пополам………………………………….. 79
2.9. История из жизни. Загадка пирамид…………………………………………………………………………………. 79
2.10. Анализ высшего уровня (*)………………………………………………………………………………………………. 82
2.10.1. Малораспространенные функции……………………………………………………………………….. 83
2.10.2. Пределы и отношения доминирования……………………………………………………………….. 84
Замечания к главе………………………………………………………………………………………………………………………. 85
2.11. Упражнения……………………………………………………………………………………………………………………….. 86
Анализ программ………………………………………………………………………………………………………………. 86
Упражнения по асимптотическим обозначениям………………………………………………………….. 87
Суммирование…………………………………………………………………………………………………………………… 92
Логарифмы………………………………………………………………………………………………………………………… 93
Задачи, предлагаемые на собеседовании………………………………………………………………………. 93
LeetCode…………………………………………………………………………………………………………………………….. 94
HackerRank……………………………………………………………………………………………………………………….. 94
Задачи по программированию………………………………………………………………………………………… 94
Глава 3. Структуры данных…………………………………………………………………… 95
3.1. Смежные и связные структуры данных…………………………………………………………………………….. 95
3.1.1. Массивы…………………………………………………………………………………………………………………….. 96
3.1.2. Указатели и связные структуры данных………………………………………………………………… 97
Поиск элемента в связном списке……………………………………………………………………………. 98
Вставка элемента в связный список……………………………………………………………………….. 99
Удаление элемента из связного списка………………………………………………………………….. 99
3.1.3. Сравнение……………………………………………………………………………………………………………….. 100
3.2. Стеки и очереди………………………………………………………………………………………………………………… 101
3.3. Словари……………………………………………………………………………………………………………………………… 102
Остановка для размышлений: Сравнение реализаций словаря (I)……………………………….. 103
Остановка для размышлений: Сравнение реализаций словаря (II)……………………………… 105
3.4. Двоичные деревья поиска………………………………………………………………………………………………… 108
3.4.1. Реализация двоичных деревьев…………………………………………………………………………….. 108
Поиск в дереве………………………………………………………………………………………………………… 109
Поиск наименьшего и наибольшего элементов дерева………………………………………. 110
Обход дерева………………………………………………………………………………………………………….. 110
Вставка элементов в дерево………………………………………………………………………………….. 111
Удаление элемента из дерева……………………………………………………………………………….. 112
3.4.2. Эффективность двоичных деревьев поиска………………………………………………………….. 112
3.4.3. Сбалансированные деревья поиска……………………………………………………………………… 113
Остановка для размышлений: Использование сбалансированных деревьев поиска….. 114
3.5. Очереди с приоритетами………………………………………………………………………………………………….. 115
Остановка для размышлений: Построение базовых очередей с приоритетами………….. 115
3.6. История из жизни. Триангуляция…………………………………………………………………………………….. 117
3.7. Хеширование…………………………………………………………………………………………………………………….. 121
3.7.1. Коллизии…………………………………………………………………………………………………………………. 121
3.7.2. Выявление дубликатов с помощью хеширования……………………………………………….. 123
3.7.3. Прочие приемы хеширования……………………………………………………………………………….. 125
3.7.4. Каноникализация……………………………………………………………………………………………………. 125
3.7.5. Уплотнение……………………………………………………………………………………………………………… 126
3.8. Специализированные структуры данных………………………………………………………………………. 126
3.9. История из жизни. Геном человека………………………………………………………………………………….. 127
Замечания к главе……………………………………………………………………………………………………………………. 131
3.10. Упражнения…………………………………………………………………………………………………………………….. 131
Стеки, очереди и списки…………………………………………………………………………………………………. 131
Элементарные структуры данных………………………………………………………………………………… 132
Деревья и другие словарные структуры………………………………………………………………………. 132
Применение древовидных структур……………………………………………………………………………… 134
Задачи по реализации……………………………………………………………………………………………………. 135
Задачи, предлагаемые на собеседовании……………………………………………………………………. 136
LeetCode………………………………………………………………………………………………………………………….. 137
HackerRank……………………………………………………………………………………………………………………… 137
Задачи по программированию……………………………………………………………………………………… 137
Глава 4. Сортировка и поиск……………………………………………………………….. 138
4.1. Применение сортировки…………………………………………………………………………………………………… 138
Остановка для размышлений: Поиск пересечения множеств………………………………………… 141
Остановка для размышлений: Использование хеша для решения задач……………………… 142
4.2. Практические аспекты сортировки…………………………………………………………………………………. 143
4.3. Пирамидальная сортировка…………………………………………………………………………………………….. 145
4.3.1. Пирамиды………………………………………………………………………………………………………………… 146
Остановка для размышлений: Поиск в пирамиде…………………………………………………………… 148
4.3.2. Создание пирамиды……………………………………………………………………………………………….. 148
4.3.3. Наименьший элемент пирамиды…………………………………………………………………………… 149
4.3.4. Быстрый способ создания пирамиды (*)……………………………………………………………… 151
Остановка для размышлений: Расположение элемента в пирамиде…………………………….. 153
4.3.5. Сортировка вставками…………………………………………………………………………………………… 154
4.4. История из жизни. Билет на самолет………………………………………………………………………………. 155
4.5. Сортировка слиянием. Метод «разделяй и властвуй»…………………………………………………… 158
4.6. Быстрая сортировка. Рандомизированная версия…………………………………………………………. 160
4.6.1. Интуиция: ожидаемое время исполнения алгоритма быстрой сортировки………. 163
4.6.2. Рандомизированные алгоритмы……………………………………………………………………………. 164
Остановка для размышлений: Болты и гайки…………………………………………………………………. 166
4.6.3. Действительно ли алгоритм быстрой сортировки работает быстро?……………….. 167
4.7. Сортировка распределением. Метод блочной сортировки………………………………………….. 167
4.7.1. Нижние пределы для сортировки………………………………………………………………………….. 168
4.8. История из жизни. Скиена в суде…………………………………………………………………………………….. 170
Замечания к главе……………………………………………………………………………………………………………………. 172
4.9. Упражнения……………………………………………………………………………………………………………………….. 172
Применение сортировки: сортировка чисел………………………………………………………………….. 172
Применение сортировки: интервалы и множества………………………………………………………… 174
Пирамиды………………………………………………………………………………………………………………………….. 175
Быстрая сортировка…………………………………………………………………………………………………………. 175
Сортировка слиянием………………………………………………………………………………………………………. 176
Другие алгоритмы сортировки……………………………………………………………………………………….. 177
Нижние пределы………………………………………………………………………………………………………………. 178
Поиск…………………………………………………………………………………………………………………………………. 178
Задачи по реализации……………………………………………………………………………………………………… 178
Задачи, предлагаемые на собеседовании……………………………………………………………………… 179
LeetCode……………………………………………………………………………………………………………………………. 179
HackerRank……………………………………………………………………………………………………………………….. 180
Задачи по программированию……………………………………………………………………………………….. 180
Глава 5. Метод «разделяй и властвуй»…………………………………………………. 181
5.1. Двоичный поиск и связанные с ним алгоритмы……………………………………………………………… 181
5.1.1. Частота вхождения элемента………………………………………………………………………………… 182
5.1.2. Односторонний двоичный поиск…………………………………………………………………………… 183
5.1.3. Корни числа……………………………………………………………………………………………………………. 184
5.2. История из жизни. Поиск «бага в баге»…………………………………………………………………………… 184
5.3. Рекуррентные соотношения…………………………………………………………………………………………….. 186
5.3.1. Рекуррентные соотношения метода «разделяй и властвуй»………………………………. 187
5.4. Решение рекуррентных соотношений типа «разделяй и властвуй» (*)……………………….. 188
5.5. Быстрое умножение………………………………………………………………………………………………………….. 190
5.6. Поиск наибольшего поддиапазона и ближайшей пары………………………………………………… 192
5.7. Параллельные алгоритмы……………………………………………………………………………………………….. 194
5.7.1. Параллелизм на уровне данных……………………………………………………………………………. 194
5.7.2. Подводные камни параллелизма………………………………………………………………………….. 195
5.8. История из жизни. «Торопиться в никуда»……………………………………………………………………… 196
5.9. Свертка (*)…………………………………………………………………………………………………………………………. 197
5.9.1. Применение свертки……………………………………………………………………………………………….. 198
5.9.2. Быстрое полиномиальное умножение (**)…………………………………………………………… 199
Замечания к главе……………………………………………………………………………………………………………………. 202
5.10. Упражнения…………………………………………………………………………………………………………………….. 202
Двоичный поиск……………………………………………………………………………………………………………… 202
Алгоритмы типа «разделяй и властвуй»………………………………………………………………………. 203
Рекуррентные соотношения…………………………………………………………………………………………… 203
LeetCode………………………………………………………………………………………………………………………….. 204
HackerRank……………………………………………………………………………………………………………………… 204
Задачи по программированию……………………………………………………………………………………… 205
Глава 6. Хеширование и рандомизированные алгоритмы……………………. 206
Остановка для размышлений: Город быстрой сортировки…………………………………………… 207
6.1. Обзор теории вероятностей……………………………………………………………………………………………… 207
6.1.1. Теория вероятностей………………………………………………………………………………………………. 207
6.1.2. Составные события и независимость……………………………………………………………………. 209
6.1.3. Условная вероятность……………………………………………………………………………………………. 210
6.1.4. Распределения вероятностей…………………………………………………………………………………. 211
6.1.5. Среднее и дисперсия………………………………………………………………………………………………. 212
6.1.6. Броски монет…………………………………………………………………………………………………………… 212
Остановка для размышлений: Случайный обход графа……………………………………………….. 213
6.2. Задача мячиков и контейнеров………………………………………………………………………………………… 214
6.2.1. Задача о собирании купонов………………………………………………………………………………… 216
Остановка для размышлений: Время покрытия для Kn………………………………………………….. 216
6.3. Почему хеширование является рандомизированным алгоритмом?…………………………….. 217
6.4. Фильтры Блума…………………………………………………………………………………………………………………. 218
6.5. Парадокс дня рождения и идеальное хеширование………………………………………………………. 220
6.6. Метод минимальных хеш-кодов……………………………………………………………………………………… 222
Остановка для размышлений: Приблизительная оценка численности популяции……… 224
6.7. Эффективный поиск подстроки в строке…………………………………………………………………………. 225
6.8. Тестирование чисел на простоту…………………………………………………………………………………….. 226
6.9. История из жизни. Как я дал Кнуту свой средний инициал………………………………………….. 228
6.10. Откуда берутся случайные числа?……………………………………………………………………………….. 229
Замечания к главе……………………………………………………………………………………………………………………. 230
6.11. Упражнения…………………………………………………………………………………………………………………….. 230
Вероятность…………………………………………………………………………………………………………………….. 230
Хеширование…………………………………………………………………………………………………………………… 231
Рандомизированные алгоритмы……………………………………………………………………………………. 231
LeetCode………………………………………………………………………………………………………………………….. 232
HackerRank……………………………………………………………………………………………………………………… 232
Задачи по программированию……………………………………………………………………………………… 232
Глава 7. Обход графов………………………………………………………………………….. 233
7.1. Разновидности графов………………………………………………………………………………………………………. 234
7.1.1. Граф дружеских отношений………………………………………………………………………………….. 237
7.2. Структуры данных для графов………………………………………………………………………………………… 240
7.3. История из жизни. Жертва закона Мура………………………………………………………………………… 244
7.4. История из жизни. Создание графа…………………………………………………………………………………. 248
7.5. Обход графа………………………………………………………………………………………………………………………. 250
7.6. Обход в ширину………………………………………………………………………………………………………………… 251
7.6.1. Применение обхода………………………………………………………………………………………………… 254
7.6.2. Поиск путей…………………………………………………………………………………………………………….. 255
7.7. Применение обхода в ширину…………………………………………………………………………………………. 256
7.7.1. Компоненты связности…………………………………………………………………………………………… 256
7.7.2. Раскраска графов двумя цветами………………………………………………………………………….. 257
7.8. Обход в глубину………………………………………………………………………………………………………………… 259
7.9. Применение обхода в глубину…………………………………………………………………………………………. 263
7.9.1. Поиск циклов…………………………………………………………………………………………………………… 263
7.9.2. Шарниры графа………………………………………………………………………………………………………. 264
7.10. Обход в глубину ориентированных графов…………………………………………………………………. 268
7.10.1. Топологическая сортировка………………………………………………………………………………… 270
7.10.2. Сильно связные компоненты……………………………………………………………………………….. 272
Замечания к главе……………………………………………………………………………………………………………………. 274
7.11. Упражнения…………………………………………………………………………………………………………………….. 275
Алгоритмы для эмуляции графов………………………………………………………………………………….. 275
Обход графов………………………………………………………………………………………………………………….. 276
Приложения…………………………………………………………………………………………………………………….. 277
Разработка алгоритмов…………………………………………………………………………………………………. 278
Ориентированные графы……………………………………………………………………………………………….. 280
Шарниры графа……………………………………………………………………………………………………………… 281
Задачи, предлагаемые на собеседовании……………………………………………………………………. 282
LeetCode………………………………………………………………………………………………………………………….. 282
HackerRank…………………………………………………………………………………………………………………….. 282
Задачи по программированию……………………………………………………………………………………… 282
Глава 8. Алгоритмы для работы со взвешенными графами………………….. 283
8.1. Минимальные остовные деревья…………………………………………………………………………………….. 284
8.1.1. Алгоритм Прима……………………………………………………………………………………………………… 285
8.1.2. Алгоритм Крускала………………………………………………………………………………………………… 288
8.1.3. Структура данных непересекающихся множеств……………………………………………….. 290
8.1.4. Разновидности остовных деревьев……………………………………………………………………….. 293
8.2. История из жизни. И всё на свете — только сети……………………………………………………………. 295
8.3. Поиск кратчайшего пути………………………………………………………………………………………………….. 298
8.3.1. Алгоритм Дейкстры………………………………………………………………………………………………… 299
Остановка для размышлений: Кратчайший путь с учетом веса вершин……………………… 302
8.3.2. Кратчайшие пути между всеми парами вершин………………………………………………….. 302
8.3.3. Транзитивное замыкание……………………………………………………………………………………….. 304
8.4. История из жизни. Печатаем с помощью номеронабирателя……………………………………….. 305
8.5. Потоки в сетях и паросочетание в двудольных графах………………………………………………… 309
8.5.1. Паросочетание в двудольном графе…………………………………………………………………….. 310
8.5.2. Вычисление потоков в сети……………………………………………………………………………………. 311
8.6. Произвольный минимальный разрез……………………………………………………………………………….. 315
8.7. Разрабатывайте не алгоритмы, а графы…………………………………………………………………………. 316
Остановка для размышлений: Нить Ариадны………………………………………………………………… 317
Остановка для размышлений: Упорядочивание последовательности…………………………. 317
Остановка для размышлений: Размещение прямоугольников по корзинам…………………. 318
Остановка для размышлений: Конфликт имен файлов………………………………………………….. 318
Остановка для размышлений: Разделение текста…………………………………………………………… 318
Замечания к главе……………………………………………………………………………………………………………………. 319
8.8. Упражнения……………………………………………………………………………………………………………………….. 319
Алгоритмы для эмуляции графов……………………………………………………………………………………. 319
Минимальные остовные деревья…………………………………………………………………………………….. 319
Поиск-объединение………………………………………………………………………………………………………….. 321
Поиск кратчайшего пути…………………………………………………………………………………………………. 321
Потоки в сети и паросочетание………………………………………………………………………………………. 323
LeetCode……………………………………………………………………………………………………………………………. 323
HackerRank……………………………………………………………………………………………………………………….. 323
Задачи по программированию……………………………………………………………………………………….. 323
Глава 9. Комбинаторный поиск…………………………………………………………… 324
9.1. Перебор с возвратом…………………………………………………………………………………………………………. 324
9.2. Примеры перебора с возвратом………………………………………………………………………………………. 327
9.2.1. Генерирование всех подмножеств………………………………………………………………………… 327
9.2.2. Генерирование всех перестановок……………………………………………………………………….. 329
9.2.3. Генерирование всех путей в графе……………………………………………………………………….. 330
9.3. Отсечение вариантов поиска…………………………………………………………………………………………… 332
9.4. Судоку……………………………………………………………………………………………………………………………….. 333
9.5. История из жизни. Покрытие шахматной доски…………………………………………………………….. 339
9.6. Поиск методом «лучший-первый»…………………………………………………………………………………… 342
9.7. Эвристический алгоритм А*……………………………………………………………………………………………. 345
Замечания к главе……………………………………………………………………………………………………………………. 347
9.8. Упражнения……………………………………………………………………………………………………………………….. 347
Перестановки……………………………………………………………………………………………………………………. 347
Перебор с возвратом………………………………………………………………………………………………………… 348
Игры и головоломки…………………………………………………………………………………………………………. 349
Комбинаторная оптимизация………………………………………………………………………………………….. 350
Задачи, предлагаемые на собеседовании……………………………………………………………………… 350
LeetCode……………………………………………………………………………………………………………………………. 351
HackerRank……………………………………………………………………………………………………………………….. 351
Задачи по программированию……………………………………………………………………………………….. 351
Глава 10. Динамическое программирование………………………………………… 352
10.1. Кэширование и вычисления…………………………………………………………………………………………… 353
10.1.1. Генерирование чисел Фибоначчи методом рекурсии…………………………………….. 353
10.1.2. Генерирование чисел Фибоначчи посредством кэширования……………………….. 354
10.1.3. Генерирование чисел Фибоначчи посредством динамического программирования 356
10.1.4. Биномиальные коэффициенты…………………………………………………………………………… 358
10.2. Поиск приблизительно совпадающих строк………………………………………………………………… 360
10.2.1. Применение рекурсии для вычисления расстояния редактирования…………….. 361
10.2.2. Применение динамического программирования для вычисления
расстояния редактирования………………………………………………………………………………………….. 362
10.2.3. Восстановление пути…………………………………………………………………………………………. 364
10.2.4. Разновидности расстояния редактирования……………………………………………………. 366
10.3. Самая длинная возрастающая подпоследовательность…………………………………………….. 370
10.4. История из жизни. Сжатие текста для штрихкодов……………………………………………………… 372
10.5. Неупорядоченное разбиение или сумма подмножества…………………………………………….. 376
10.6. История из жизни: Баланс мощностей………………………………………………………………………….. 378
10.7. Задача упорядоченного разбиения………………………………………………………………………………. 381
10.8. Синтаксический разбор………………………………………………………………………………………………….. 384
Остановка для размышлений: Экономичный синтаксический разбор……………………… 386
10.9. Ограничения динамического программирования: задача коммивояжера………………… 387
10.9.1. Вопрос правильности алгоритмов динамического программирования………… 388
10.9.2. Эффективность алгоритмов динамического программирования……………………. 389
10.10. История из жизни. Динамическое программирование и язык Prolog………………………… 390
Замечания к главе……………………………………………………………………………………………………………………. 393
10.11. Упражнения…………………………………………………………………………………………………………………… 394
Простые рекуррентные соотношения…………………………………………………………………………. 394
Расстояние редактирования………………………………………………………………………………………… 394
«Жадные» алгоритмы…………………………………………………………………………………………………… 396
Числовые задачи…………………………………………………………………………………………………………… 397
Задачи на графы…………………………………………………………………………………………………………… 399
Задачи по разработке………………………………………………………………………………………………….. 399
Задачи, предлагаемые на собеседовании………………………………………………………………….. 402
LeetCode………………………………………………………………………………………………………………………… 402
HackerRank…………………………………………………………………………………………………………………… 402
Задачи по программированию……………………………………………………………………………………. 402
Глава 11. NP-полнота…………………………………………………………………………… 403
11.1. Сведение задач……………………………………………………………………………………………………………….. 403
11.1.1. Ключевая идея…………………………………………………………………………………………………….. 404
11.1.2. Задачи разрешимости………………………………………………………………………………………… 405
11.2. Сведение для создания новых алгоритмов…………………………………………………………………… 406
11.2.1. Поиск ближайшей пары……………………………………………………………………………………… 406
11.2.2. Максимальная возрастающая подпоследовательность…………………………………. 407
11.2.3. Наименьшее общее кратное………………………………………………………………………………. 408
11.2.4. Выпуклая оболочка (*)………………………………………………………………………………………. 409
11.3. Простые примеры сведения сложных задач………………………………………………………………… 410
11.3.1. Гамильтонов цикл……………………………………………………………………………………………….. 410
11.3.2. Независимое множество и вершинное покрытие……………………………………………… 412
Остановка для размышлений: Сложность общей задачи календарного планирования 413
11.3.3. Задача о клике…………………………………………………………………………………………………….. 415
11.4. Задача выполнимости булевых формул………………………………………………………………………. 416
11.4.1. Задача выполнимости в 3-конъюнктивной нормальной форме
(задача 3-SAT)…………………………………………………………………………………………………………………. 417
11.5. Нестандартные сведения задачи SAT…………………………………………………………………………… 419
11.5.1. Вершинное покрытие………………………………………………………………………………………….. 419
11.5.2. Целочисленное программирование…………………………………………………………………… 421
11.6. Искусство доказательства сложности………………………………………………………………………….. 423
11.7. История из жизни. Наперегонки со временем………………………………………………………………. 425
11.8. История из жизни. Полный провал………………………………………………………………………………… 427
11.9. Сравнение классов сложности P и NP…………………………………………………………………………… 430
11.9.1. Верификация решения и поиск решения…………………………………………………………… 430
11.9.2. Классы сложности P и NP………………………………………………………………………………….. 431
11.9.3. Почему задача выполнимости является сложной?…………………………………………. 432
11.9.4. NP-сложность по сравнению с NP-полнотой……………………………………………………. 432
Замечания к главе……………………………………………………………………………………………………………………. 433
11.10. Упражнения…………………………………………………………………………………………………………………… 434
Преобразования и выполнимость……………………………………………………………………………….. 434
Базовые сведения………………………………………………………………………………………………………….. 435
Нестандартные сведения…………………………………………………………………………………………….. 437
Алгоритмы для решения частных случаев задач……………………………………………………… 438
P или NP?……………………………………………………………………………………………………………………….. 439
LeetCode………………………………………………………………………………………………………………………… 439
HackerRank…………………………………………………………………………………………………………………… 439
Задачи по программированию……………………………………………………………………………………. 439
Глава 12. Решение сложных задач……………………………………………………….. 440
12.1. Аппроксимирующие алгоритмы……………………………………………………………………………………. 440
12.2. Аппроксимация вершинного покрытия…………………………………………………………………………. 441
Остановка для размышлений: Вершинное покрытие в остатке…………………………………. 443
12.2.1. Рандомизированный эвристический алгоритм вершинного покрытия…………. 444
12.3. Задача коммивояжера в евклидовом пространстве…………………………………………………….. 445
12.3.1. Эвристический алгоритм Кристофидеса………………………………………………………….. 446
12.4. Когда среднее достаточно хорошее……………………………………………………………………………… 448
12.4.1. Задача максимальной k-SAT……………………………………………………………………………… 448
12.4.2. Максимальный бесконтурный подграф……………………………………………………………. 449
12.5. Задача о покрытии множества………………………………………………………………………………………. 449
12.6. Эвристические методы поиска………………………………………………………………………………………. 451
12.6.1. Произвольная выборка……………………………………………………………………………………….. 452
Остановка для размышлений: Выбор пары…………………………………………………………………. 454
12.6.2. Локальный поиск………………………………………………………………………………………………… 455
12.6.3. Имитация отжига………………………………………………………………………………………………… 459
Реализация…………………………………………………………………………………………………………… 462
12.6.4. Применение метода имитации отжига………………………………………………………………. 463
Задача максимального разреза…………………………………………………………………………. 463
Независимое множество…………………………………………………………………………………….. 463
Размещение компонентов на печатной плате………………………………………………….. 464
12.7. История из жизни. Только это не радио………………………………………………………………………… 465
12.8. История из жизни. Отжиг массивов……………………………………………………………………………….. 468
12.9. Генетические алгоритмы и другие эвристические методы поиска…………………………….. 471
12.9.1. Генетические алгоритмы……………………………………………………………………………………. 471
12.10. Квантовые вычисления………………………………………………………………………………………………… 472
12.10.1. Свойства «квантовых» компьютеров………………………………………………………………. 473
12.10.2. Алгоритм Гровера для поиска в базе данных………………………………………………… 475
Решение задачи о выполнимости…………………………………………………………………….. 475
12.10.3. Более быстрое «преобразование Фурье»……………………………………………………….. 476
12.10.4. Алгоритм Шора для разложения целых чисел на множители……………………… 477
12.10.5. Перспективы квантовых вычислений……………………………………………………………… 479
Замечания к главе……………………………………………………………………………………………………………………. 481
12.11. Упражнения…………………………………………………………………………………………………………………… 482
Частные случаи сложных задач…………………………………………………………………………………. 482
Аппроксимирующие алгоритмы…………………………………………………………………………………. 482
Комбинаторная оптимизация……………………………………………………………………………………… 483
«Квантовые» вычисления…………………………………………………………………………………………….. 484
LeetCode………………………………………………………………………………………………………………………… 484
HackerRank…………………………………………………………………………………………………………………… 484
Задачи по программированию……………………………………………………………………………………. 484
Глава 13. Как разрабатывать алгоритмы?……………………………………………. 485
13.1. Список вопросов для разработчика алгоритмов…………………………………………………………. 486
13.2. Подготовка к собеседованию в технологических компаниях…………………………………….. 489
Часть II. Каталог алгоритмических задач…………………………. 493
Глава 14. Описание каталога……………………………………………………………….. 495
14.1. Предостережения……………………………………………………………………………………………………………. 496
Глава 15. Структуры данных……………………………………………………………….. 497
15.1. Словари……………………………………………………………………………………………………………………………. 497
15.2. Очереди с приоритетами………………………………………………………………………………………………… 503
15.3. Суффиксные деревья и массивы…………………………………………………………………………………….. 507
15.4. Графы………………………………………………………………………………………………………………………………. 511
15.5. Множества………………………………………………………………………………………………………………………. 515
15.6. Kd-деревья……………………………………………………………………………………………………………………….. 519
Глава 16. Численные задачи………………………………………………………………… 525
16.1. Решение системы линейных уравнений………………………………………………………………………… 526
16.2. Уменьшение ширины ленты матрицы…………………………………………………………………………… 530
16.3. Умножение матриц…………………………………………………………………………………………………………. 532
16.4. Определители и перманенты…………………………………………………………………………………………. 535
16.5. Условная и безусловная оптимизация………………………………………………………………………….. 538
16.6. Линейное программирование………………………………………………………………………………………… 542
16.7. Генерирование случайных чисел………………………………………………………………………………….. 547
16.8. Разложение на множители и проверка чисел на простоту…………………………………………. 552
16.9. Арифметика произвольной точности……………………………………………………………………………. 555
16.10. Задача о рюкзаке………………………………………………………………………………………………………….. 560
16.11. Дискретное преобразование Фурье…………………………………………………………………………….. 565
Глава 17. Комбинаторные задачи…………………………………………………………. 569
17.1. Сортировка……………………………………………………………………………………………………………………… 570
17.2. Поиск………………………………………………………………………………………………………………………………… 575
17.3. Поиск медианы и выбор элементов……………………………………………………………………………….. 579
17.4. Генерирование перестановок………………………………………………………………………………………… 582
17.5. Генерирование подмножеств…………………………………………………………………………………………. 587
17.6. Генерирование разбиений……………………………………………………………………………………………… 590
17.7. Генерирование графов……………………………………………………………………………………………………. 595
17.8. Календарные вычисления……………………………………………………………………………………………… 599
17.9. Календарное планирование………………………………………………………………………………………….. 601
17.10. Выполнимость………………………………………………………………………………………………………………. 605
Глава 18. Задачи на графах c полиномиальным временем исполнения… 609
18.1. Компоненты связности…………………………………………………………………………………………………… 610
18.2. Топологическая сортировка………………………………………………………………………………………….. 613
18.3. Минимальные остовные деревья…………………………………………………………………………………… 617
18.4. Поиск кратчайшего пути………………………………………………………………………………………………… 622
18.5. Транзитивное замыкание и транзитивная редукция……………………………………………………. 627
18.6. Паросочетание………………………………………………………………………………………………………………… 630
18.7. Задача поиска эйлерова цикла и задача китайского почтальона…………………………….. 634
18.8. Реберная и вершинная связность…………………………………………………………………………………… 637
18.9. Потоки в сети…………………………………………………………………………………………………………………… 641
18.10. Рисование графов………………………………………………………………………………………………………….. 644
18.11. Рисование деревьев………………………………………………………………………………………………………. 649
18.12. Планарность………………………………………………………………………………………………………………….. 652
Глава 19. NP-сложные задачи на графах………………………………………………. 655
19.1. Задача о клике………………………………………………………………………………………………………………… 655
19.2. Независимое множество…………………………………………………………………………………………………. 658
19.3. Вершинное покрытие……………………………………………………………………………………………………… 661
19.4. Задача коммивояжера……………………………………………………………………………………………………. 664
19.5. Гамильтонов цикл…………………………………………………………………………………………………………… 668
19.6. Разбиение графов……………………………………………………………………………………………………………. 672
19.7. Вершинная раскраска…………………………………………………………………………………………………….. 675
19.8. Реберная раскраска………………………………………………………………………………………………………… 679
19.9. Изоморфизм графов………………………………………………………………………………………………………… 680
19.10. Дерево Штейнера………………………………………………………………………………………………………….. 685
19.11. Разрывающее множество ребер или вершин……………………………………………………………… 689
Глава 20. Вычислительная геометрия…………………………………………………… 693
20.1. Элементарные задачи вычислительной геометрии…………………………………………………….. 693
20.2. Выпуклая оболочка………………………………………………………………………………………………………… 698
20.3. Триангуляция………………………………………………………………………………………………………………….. 702
20.4. Диаграммы Вороного…………………………………………………………………………………………………….. 706
20.5. Поиск ближайшей точки………………………………………………………………………………………………… 709
20.6. Поиск в области………………………………………………………………………………………………………………. 713
20.7. Местоположение точки………………………………………………………………………………………………….. 716
20.8. Выявление пересечений…………………………………………………………………………………………………. 720
20.9. Разложение по контейнерам………………………………………………………………………………………….. 724
20.10. Преобразование к срединной оси……………………………………………………………………………….. 728
20.11. Разбиение многоугольника на части…………………………………………………………………………… 731
20.12. Упрощение многоугольников………………………………………………………………………………………. 734
20.13. Выявление сходства фигур………………………………………………………………………………………….. 737
20.14. Планирование перемещений……………………………………………………………………………………….. 740
20.15. Конфигурации прямых…………………………………………………………………………………………………. 744
20.16. Сумма Минковского……………………………………………………………………………………………………… 747
Глава 21. Множества и строки……………………………………………………………… 750
21.1. Поиск покрытия множества……………………………………………………………………………………………. 750
21.2. Задача укладки множества……………………………………………………………………………………………. 755
21.3. Сравнение строк……………………………………………………………………………………………………………… 758
21.4. Нечеткое сравнение строк……………………………………………………………………………………………… 761
21.5. Сжатие текста…………………………………………………………………………………………………………………. 766
21.6. Криптография………………………………………………………………………………………………………………….. 770
21.7. Минимизация конечного автомата……………………………………………………………………………….. 776
21.8. Максимальная общая подстрока………………………………………………………………………………….. 779
21.9. Поиск минимальной общей надстроки…………………………………………………………………………. 782
Глава 22. Ресурсы………………………………………………………………………………… 786
22.1. Программные системы……………………………………………………………………………………………………. 786
22.1.1. Библиотека LEDA………………………………………………………………………………………………. 786
22.1.2. Библиотека CGAL………………………………………………………………………………………………. 787
22.1.3. Библиотека Boost……………………………………………………………………………………………….. 787
22.1.4. Библиотека Netlib……………………………………………………………………………………………….. 788
22.1.5. Коллекция алгоритмов ассоциации ACM………………………………………………………… 788
22.1.6. Сайты GitHub и SourceForge………………………………………………………………………………. 788
22.1.7. Система Stanford GraphBase……………………………………………………………………………… 789
22.1.8. Пакет Combinatorica…………………………………………………………………………………………… 789
22.1.9. Программы из книг……………………………………………………………………………………………… 789
Книга «Programming Challenges»……………………………………………………………………….. 790
Книга «Combinatorial Algorithms for Computers and Calculators»…………………… 790
Книга «Computational Geometry in C»………………………………………………………………. 790
Книга «Algorithms in C++»………………………………………………………………………………….. 790
Книга «Discrete Optimization Algorithms in Pascal»…………………………………………… 791
22.2. Источники данных………………………………………………………………………………………………………….. 791
22.3. Библиографические ресурсы…………………………………………………………………………………………. 791
22.4. Профессиональные консалтинговые услуги………………………………………………………………… 792
Глава 23. Список литературы………………………………………………………………. 793
Приложение. Описание электронного архива………………………………………. 838
Предметный указатель…………………………………………………………………………. 839
-
Алгоритмы. Руководство по разработке. 3-е изд.
2000 ₽
1700 ₽