- •Предисловие
- •Введение
- •Алгоритмы и их сложность
- •Примеры задач и алгоритмов
- •Задачи на графах: «Коммивояжер», «Кратчайшие пути», «Остовные деревья»
- •Приближенные алгоритмы: «Составление расписаний»
- •«Сортировка слиянием»
- •«Быстрая сортировка»
- •Формально об алгоритмах. Несложно о сложности
- •«RAM»: машины с произвольным доступом
- •Сложность в худшем случае
- •Сложность в среднем
- •Полиномиальные алгоритмы
- •Полиномиальность и эффективность
- •Аппроксимация с гарантированной точностью
- •Алгоритмы с оценками точности
- •Жадные алгоритмы для «Покрытия множеств»
- •Приближенные алгоритмы для «Вершинного покрытия»
- •Жадный алгоритм для «Рюкзака»
- •Алгоритм Кристофидеса
- •Аппроксимация с заданной точностью
- •«Рюкзак»: динамическое программирование
- •Полностью полиномиальная приближенная схема для «Рюкзака»
- •Вероятностный анализ детерминированных алгоритмов
- •Сложность и полиномиальность в среднем
- •Задача упаковки
- •Выполнимость КНФ
- •Точность алгоритма для почти всех входов
- •«Рюкзак»: полиномиальность в среднем
- •Вероятностные алгоритмы и их анализ
- •Вероятностная проверка тождеств
- •Максимальное по включению независимое множество в графе
- •Протокол византийского соглашения
- •Вероятностное округление
- •Максимальный разрез в графе
- •Методы дерандомизации
- •Метод условных вероятностей
- •Метод малых вероятностных пространств
- •Полиномиальная проверка простоты
- •Основы теории сложности вычислений
- •Сложность вычислений
- •Машины Тьюринга и вычислимость
- •Сводимость по Куку
- •Недетерминированные алгоритмы
- •Сводимость по Карпу
- •Вероятностные вычисления
- •Вероятностно проверяемые доказательства
- •Схемы и схемная сложность
- •Коммуникационная сложность
- •Диаграмма классов сложности
- •Приложения
- •Введение в Python
- •Глоссарий
- •Предметный указатель
- •Список алгоритмов
Предметный указатель
2-Sa sfiability
Задача, 266 2-Выполнимость
Задача, 266 2SAT, 266
Задача, 266 3-Sa sfiability
Задача, 265–267, 304, 307 3-Выполнимость
Задача, 265–267, 304, 307 3SAT, 265–267, 304, 307
Задача, 265–267, 304, 307 3Выполнимость-Максимизация
Задача, 304, 305, 309
APX, 13, 44, 309, 311–314, 318, 319
APX PB, 318
BPP, 250, 271, 282–285, 287, 288, 294
coDTIME, 257
coNP, 257, 258, 261, 269–271, 278, 291 coNSPACE, 257
coNTIME, 257 Cook
Сводимость, 261
coRP, 271, 275–280, 292, 299, 334 coZPP, 334
DNF coun ng, 167, 168 Задача, 167, 168 DSPACE, 248, 251, 257 DTIME, 75, 248, 250, 257
coDTIME, 257
Euler cycle
345
346
Алгоритм, 94 EXPTIME, 250–252
FPRAS, 163, 166, 168, 169
FPTAS, 110
GCD
Алгоритм, 21
hal ng problem, 245, 253 Задача, 245, 253
K-covering, 76
Задача, 76
Knapsack, 89, 90, 104, 105, 107, 109, 111, 145 Алгоритм, 105, 107, 109
Жадный, 89, 92, 115
Алгоритм Немхаузера – Ульмана, 107, 109, 145, 155, 156
Задача, 89, 90, 104, 105, 107, 109, 111, 145 Knapsack-SAT
Алгоритм, 104
Literal, 163
Machine
Turing, 273
Предметный указатель
MAX SNP, 315, 318, 319
MAX-3SAT, 304, 305, 309 Задача, 304, 305, 309
MAX-CUT, 194, 195, 197, 200
Алгоритм Вероятностный, 197
Задача, 194, 195, 197, 200 MAX-CUT(VP), 196, 200
Задача, 196, 200 MAX-CUT(ЦП), 195, 196, 200
Задача, 195, 196, 200
MAX-SAT, 186, 188, 204, 205, 207, 304
Алгоритм Вероятностный, 190, 196, 207 Дерандомизация, 208
Задача, 186, 188, 204, 205, 207, 304 Maximal
Independent Set, 210 Maximal independent set, 210 MAXSNP, 317
Mergesort
Алгоритм, 45, 47
Minimum Spanning Tree, 36, 38, 65, 72, 251
Алгоритм
Предметный указатель
Прима, 36, 38, 65, 72 Задача, 36, 251
NEXP, 298
NP, 6, 7, 10–14, 34, 40, 41, 43, 44, 63, 70, 72, 73, 75, 95, 100, 104, 118, 119, 123, 131, 139, 173, 185, 250, 252, 253, 257–266, 269–271, 277, 278, 290, 291, 293, 295–297, 299–302, 305– 307, 309–311, 314, 318, 334, 336
coNP, 257, 258, 261, 269–271, 278, 291
NPC, 262, 266, 267, 269, 270, 302, 305, 307, 309 NPO, 311, 312, 318
NSPACE, 257 coNSPACE, 257 NTIME, 257, 298 coNTIME, 257
P, 10–13, 43, 131, 250–254, 258, 261–263, 266, 269, 270, 293, 301, 314, 318
Packing, 122, 123, 128 Алгоритм, 125, 126, 128, 129 Задача, 122, 123, 128
PCP, 7, 12, 75, 250, 293, 295–302, 305, 306, 308, 309, 314, 336
Система, 300
347
PP, 271, 288–291, 294
PSPACE, 250–252, 258, 290
PTAS, 312–314, 317, 318, 320
Quicksort
Алгоритм, 47, 49, 50, 274
Randomized
Turing Machine, 273, 276, 289, 299 RP, 250, 271, 275–281, 288, 292, 294 coRP, 271, 275–280, 292, 299, 334
Sa sfiability, 131, 263, 265, 266 Задача, 131, 263, 265, 266 Semidefinite programming, 193
Set
Maximal Independent, 210 Set Cover, 73, 76
Задача, 73, 76 Shortest Path
Задача, 27, 61, 251
Shortest Path Problem, 27, 61, 251
Traveling Salesman Problem, 24, 34–36, 39, 43, 61, 93, 94, 98, 254, 255, 258, 259, 261
TSP
348
Алгоритм Переборный, 25, 26, 66
Задача, 24, 34–36, 39, 43, 61, 93, 94, 98, 254, 255, 258, 259, 261
Метрическая Алгоритм, 95, 97, 99
Turing
machine, 273
Randomized Machine, 273, 276, 289, 299
Vector programming, 193, 195 Vertex Cover, 87
Vertex Covering, 78, 81, 85, 86, 267 Задача, 78, 81, 85, 86, 267
ZPP, 250, 291–294 coZPP, 334
Алгоритм
Euler cycle, 94 GCD, 21 Knapsack-SAT, 104 MAX-CUT
Вероятностный, 197 MAX-SAT
Вероятностный, 190, 196, 207
Предметный указатель
Дерандомизация, 208 Mergesort, 45, 47 Minimum Spanning Tree
Прима, 36, 38, 65, 72 Quicksort, 47, 49, 50, 274 TSP
Метрическая, 95, 97, 99 Переборный, 25, 26, 66
Дейкстры, 27, 29–31, 36, 65, 250
Динамическое программирование
Knapsack, 105, 107, 109 Packing, 125, 126, 128, 129
Жадный
Knapsack, 89, 92, 115 Рюкзак, 89, 92, 115
Коммивояжер Метрический, 95, 97, 99 Переборный, 25, 26, 66
Минимальное остовное дерево, 36, 38, 65, 72 НОД, 21
Немхаузера – Ульмана, 107, 109, 145, 155, 156
Переполнение памяти умножением, 65, 66, 253, 254
Полиномиальный в среднем, 121, 126
Предметный указатель
Приближенный, 110, 302, 311
Рюкзак, 105, 107, 109
Сортировка Быстрая, 47, 49, 50, 274
Слиянием, 45, 47 Сумма размеров, 104
Упаковка, 125, 126, 128, 129
Флойда – Уоршолла, 33 Эйлеров цикл, 94
Векторное программирование, 193, 195 Вершинное покрытие, 87
Задача, 78, 81, 85, 86, 267
Выполнимость Задача, 131, 263, 265, 266
Выполнимость-Максимизация Задача, 186, 204, 205, 304
Выполнимость-Максимизация Задача, 188, 207
ДНФ посчет выполняющих наборов, 167, 168
Дейкстры Алгоритм, 27, 29–31, 36, 65, 250
Доминирующее подмножество Рюкзак, 145, 147
349
Задача
2-Sa sfiability, 266
2-Выполнимость, 266 2SAT, 266
3-Sa sfiability, 265–267, 304, 307 3-Выполнимость, 265–267, 304, 307 3SAT, 265–267, 304, 307
3Выполнимость-Максимизация, 304, 305, 309 DNF coun ng, 167, 168
hal ng problem, 245, 253 K-covering, 76
Knapsack, 89, 90, 104, 105, 107, 109, 111, 145 MAX-3SAT, 304, 305, 309
MAX-CUT, 194, 195, 197, 200 MAX-CUT(VP), 196, 200 MAX-CUT(ЦП), 195, 196, 200 MAX-SAT, 186, 188, 204, 205, 207, 304 Minimum Spanning Tree, 36, 251 Packing, 122, 123, 128
Sa sfiability, 131, 263, 265, 266 Set Cover, 73, 76
Shortest Path, 27, 61, 251
TSP, 24, 34–36, 39, 43, 61, 93, 94, 98, 254, 255, 258, 259, 261
350
Vertex Covering, 78, 81, 85, 86, 267
Вершинное покрытие, 78, 81, 85, 86, 267
Выполнимость, 131, 263, 265, 266
Выполнимость-Максимизация, 186, 204, 205, 304
Выполнимость-Максимизация, 188, 207 К-покрытие, 76
Коммивояжер, 24, 34–36, 39, 43, 61, 93, 94, 98, 254, 255, 258, 259, 261
Коммивояжера метрическая, 98 Кратчайшие пути, 27, 61, 251 Максимальный разрез, 194, 195, 197, 200 Максимальный разрез(VP), 196, 200 Максимальный разрез(ЦП), 195, 196, 200 Минимальное остовное дерево, 36, 251 Остановки, 245, 253 Покрытие множества, 73, 76
Рюкзак булев, 89, 90, 104, 105, 107, 109, 111, 145
Сумма размеров, 104
Упаковка, 122, 123, 128
Инцидентность, 123 К-покрытие
Задача, 76
Предметный указатель
Карп Сводимость, 262, 305
Класс
APX, 13, 44, 309, 311–314, 318, 319 APX PB, 318
BPP, 250, 271, 282–285, 287, 288, 294 DSPACE, 248, 251, 257
DTIME, 75, 248, 250, 257 coDTIME, 257
EXPTIME, 250–252 FPRAS, 163, 166, 168, 169 FPTAS, 110
MAX SNP, 315, 318, 319 MAXSNP, 317
NEXP, 298
NP, 6, 7, 10–14, 34, 40, 41, 43, 44, 63, 70, 72, 73, 75, 95, 100, 104, 118, 119, 123, 131, 139, 173, 185, 250, 252, 253, 257–266, 269–271, 277, 278, 290, 291, 293, 295–297, 299–302, 305–307, 309–311, 314, 318, 334, 336
coNP, 257, 258, 261, 269–271, 278, 291
NPC, 262, 266, 267, 269, 270, 302, 305, 307, 309 NPO, 311, 312, 318
NSPACE, 257
Предметный указатель
coNSPACE, 257 NTIME, 257, 298 coNTIME, 257
P, 10–13, 43, 131, 250–254, 258, 261–263, 266, 269, 270, 293, 301, 314, 318
PCP, 7, 12, 75, 250, 293, 295–302, 305, 306, 308, 309, 314, 336
PP, 271, 288–291, 294 PSPACE, 250–252, 258, 290 PTAS, 312–314, 317, 318, 320
RP, 250, 271, 275–281, 288, 292, 294 coRP, 271, 275–280, 292, 299, 334 ZPP, 250, 291–294
coZPP, 334
Коммивояжер
Алгоритм Переборный, 25, 26, 66
Задача, 24, 34–36, 39, 43, 61, 93, 94, 98, 254, 255, 258, 259, 261
Метрический Алгоритм, 95, 97, 99
Кратчайшие пути Алгоритм Дейкстры, 27, 29–31, 36, 65, 250
Алгоритм Флойда – Уоршолла, 33
351
Задача, 27, 61, 251
Кук
Сводимость, 261 Литерал, 163 Максимальное
Независимое множество, 210 Максимальный разрез
Задача, 194, 195, 197, 200
Максимальный разрез(VP)
Задача, 196, 200
Максимальный разрез(ЦП)
Задача, 195, 196, 200
Матрица Инцидентности, 123
Машина Тьюринга, 273
Тьюринга Вероятностная, 273, 276, 289, 299 Метрическая
Задача коммивояжера, 98 Минимальное остовное дерево Алгоритм, 36, 38, 65, 72
Задача, 36, 251
Множество Максимальное независимое, 210
352
НОД Алгоритм, 21
Независимое множество, 210 Остановки
Задача, 245, 253
Парето-набор Рюкзак, 145, 147
Покрытие множества Задача, 73, 76
Полиномиальный в среднем, 121, 126 Полуопределенное программирование, 193 Приближенный
Алгоритм, 110, 302, 311
Рюкзак
Алгоритм Динамическое программирование, 105, 107,
109 Жадный, 89, 92, 115
Алгоритм Немхаузера – Ульмана, 107, 109, 145, 155, 156
Доминирующее подмножество, 145, 147 Парето-набор, 145, 147
Рюкзак булев Задача, 89, 90, 104, 105, 107, 109, 111, 145
Предметный указатель
Сводимость Карп, 262, 305
Кука, 261 Система
PCP, 300
Сортировка Быстрая, 47, 49, 50, 274
Слиянием, 45, 47 Сумма размеров, 104
Алгоритм, 104 Задача, 104
Тьюринга Машина, 273
Машина Вероятностная, 273, 276, 289, 299 Упаковка
Алгоритм Динамическое программирование, 125, 126,
128, 129 Задача, 122, 123, 128
Флойда – Уоршолла Алгоритм, 33
Эйлеров цикл Алгоритм, 94
Список иллюстраций
1.1Работа алгоритма 6 «TSP-перебор» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.2 |
Работа алгоритма 7 «Дейкстры» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
29 |
|
1.3 |
Иллюстрация работы алгоритма 8 |
«Флойда – Уоршолла» . . . . . . . . . . . . . . . . . . . |
33 |
1.4 |
Иллюстрация работы алгоритма 9 |
«MST Прима» . . . . . . . . . . . . . . . . . . . . . . . . |
38 |
1.5Работа «Quicksort» с разными методами выбора оси . . . . . . . . . . . . . . . . . . . . . . 51
1.6 |
Карта-памятка раздела 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
53 |
1.7 |
RAM — машина с произвольным доступом . . . . . . . . . . . . . . . . . . . . . . . . . . . |
56 |
1.8 |
Моделирование циклов для RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
58 |
2.1 |
«Плохой» граф для жадного алгоритма вершинного покрытия . . . . . . . . . . . . . . . . |
80 |
2.2Неоптимальность жадного алгоритма для вершинного покрытия . . . . . . . . . . . . . . . 82
2.3«Ленивый» и «жадный» алгоритмы вершинного покрытия на «плохих» графах . . . . . . . 83
2.4 «Ленивый» и «жадный» алгоритмы вершинного покрытия на случайных графах . . . . . . 84
2.5Карта-памятка разделов 2.1.2и 2.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
2.6 Наборы и ~ в «жадном» алгоритме для «рюкзака» . . . . . . . . . . . . . . . . . . . . . 93
Sg Sg
353
354 |
Список иллюстраций |
2.7Карта-памятка раздела 2.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2.8Карта-памятка раздела 2.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.1Работа алгоритма 28 «Упаковка-ДинПрог» . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.2Алгоритм 28 «Упаковка-ДинПрог» на случайных данных . . . . . . . . . . . . . . . . . . . . 129
3.3Карта-памятка раздела 3.2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
3.4 «Обнуляющие» наборы для трехскобочной КНФ . . . . . . . . . . . . . . . . . . . . . . . . 133
3.5Карта-памятка раздела 3.3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
3.6Граф зависимостей утверждений в разделе 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . 153
3.7Алгоритм 25 «Рюкзак Немхаузера–Ульмана» на случайных данных . . . . . . . . . . . . . . 156
4.1Множества U, G, H в задаче 18 «DNF#» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
4.2Карта-памятка раздела 4.2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
4.3PRAM — Parallel Random Access Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
4.4 |
График функции 1 |
(1 x/k)k при различных k . . . . . . . . . . . . . . . . . . . . . . . . |
189 |
||
4.5 |
График функции |
|
2 |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
198 |
(1 |
cos ) |
||||
4.6 |
Вектора в вероятностном округлении «MAX-CUT» . . . . . . . . . . . . . . . . . . . . . . . |
199 |
|||
4.7Карта-памятка раздела 4.4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.1Дерандомизация на основе минимизации оценок математического ожидания . . . . . . . 206
5.2Карта-памятка раздела 5.1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
6.1Машина Тьюринга: удвоение строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
6.2Машина Тьюринга: унарное сложение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.3 |
Машина Тьюринга: распознавание четных строк . . . . . . . . . . . . . . . . . . . . . . . . |
235 |
6.4 |
Пример МТ: «Количество 0 и 1 равно?» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
236 |
Список иллюстраций |
355 |
6.5Выполнение МТ «Количество 0 и 1 равно?» . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.6Трехленточная универсальная МТ для одноленточных МТ . . . . . . . . . . . . . . . . . . . 241
6.7Карта-памятка раздела 6.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
6.8Отображение выполнимой КНФ на граф . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
6.9 Классы NP, coNP, P, NPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
6.10Карта-памятка раздела 6.2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
6.11Классы сложности RP и coRP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
6.12Классы сложности: BPP и его «соседи» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
6.13 Вероятностные классы сложности: ZPP, RP, BPP, PP . . . . . . . . . . . . . . . . . . . 294
6.14Карта-памятка раздела 6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
6.15Карта-памятка раздела 6.3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
6.16Карта-памятка раздела 6.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
6.17Пример схемы: сравнение двух строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
?
6.18 Пример коммуникационного протокола для «x1x2 = y1y2» . . . . . . . . . . . . . . . . . . 330 6.19 Иерархия некоторых классов сложности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
