- •Глава 1
- •§ 1. Затраты алгоритма для данного входа, алгебраическая сложность
- •§ 1. Затраты алгоритма для данного входа
- •§ 1. Затраты алгоритма для данного входа
- •§ 1. Затраты алгоритма для данного входа
- •§ 1. Затраты алгоритма для данного входа
- •§ 2. Асимптотические оценки (формализм)
- •§ 2. Асимптотические оценки (формализм)
- •§ 2. Асимптотические оценки (формализм)
- •§ 3. Асимптотические оценки (два примера) 23
- •§ 3. Асимптотические оценки (два примера)
- •§ 3. Асимптотические оценки (два примера)
- •§ 3. Асимптотические оценки (два примера)
- •§ 3. Асимптотические оценки (два примера)
- •§ 4. Длина числа как возможный размер входа
- •§ 4. Длина числа как возможный размер входа
- •§ 4. Длина числа как возможный размер входа
- •§ 4. Длина числа как возможный размер входа
- •Глава 2
- •§ 5. Понятие сложности в среднем
- •§ 5. Понятие сложности в среднем
- •Глава 2. Сложность в среднем
- •§ 5. Понятие сложности в среднем
- •Глава 2. Сложность в среднем
- •§ 6. Сортировка и конечные вероятностные пространства.
- •§ 6. Сортировка и конечные вероятностные пространства 47
- •Глава 2. Сложность в среднем
- •§ 6. Сортировка и конечные вероятностные пространства 49
- •Глава 2. Сложность в среднем
- •§ 6. Сортировка и конечные вероятностные пространства 51
- •Глава 2. Сложность в среднем
- •§ 7. Пример медленного роста сложности в среднем
- •§ 7. Пример медленного роста сложности в среднем в сравнении со сложностью в худшем случае
- •Глава 2. Сложность в среднем
- •§ 7. Пример медленного роста сложности в среднем 55
- •Глава 2. Сложность в среднем
- •§ 7. Пример медленного роста сложности в среднем
- •Глава 2. Сложность в среднем
- •§ 8. Функция затрат рандомизированного алгоритма
- •§ 8. Функция затрат рандомизированного алгоритма
- •Глава 2. Сложность в среднем
- •§ 8. Функция затрат рандомизированного алгоритма
- •Глава 2. Сложность в среднем
- •§ 8. Функция затрат рандомизированного алгоритма
- •Глава 2. Сложность в среднем
- •Глава 2. Сложность в среднем
- •Глава 2. Сложность в среднем
- •Глава 2. Сложность в среднем
- •Глава 2. Сложность в среднем
- •Глава 3
- •§ 9. Функции, убывающие по ходу выполнения алгоритма
- •§ 9. Функции, убывающие по ходу выполнения алгоритма 75
- •§ 9. Функции, убывающие по ходу выполнения алгоритма 77
- •§ 9. Функции, убывающие по ходу выполнения алгоритма 79
- •§ 9. Функции, убывающие по ходу выполнения алгоритма 81
- •§ 10. Качество оценок
- •§ 10. Качество оценок
- •§ 10. Качество оценок
- •§ 10. Качество оценок
- •§ 11. Завершимостъ работы алгоритма
- •§ 11. Завершимость работы алгоритма
- •§ 11. Завершимостъ работы алгоритма
- •§ 11. Завершимостъ работы алгоритма
- •§ 12. Вложенные циклы (дополнительные примеры)
- •§ 12. Вложенные циклы (дополнительные примеры)
- •§ 13. Нецелые размеры входа и непрерывные оценочные функции 97
- •§ 13. Нецелые размеры входа и непрерывные оценочные функции
- •§ 13. Нецелые размеры входа и непрерывные оценочные функции 99
- •Глава 4
- •§ 14. Понятие нижней границы сложности
- •§ 14. Понятие нижней границы сложности
- •§ 15. Оптимальные алгоритмы
- •§ 15. Оптимальные алгоритмы
- •§ 15. Оптимальные алгоритмы
- •§ 15. Оптимальные алгоритмы
- •§ 16. Асимптотические нижние границы. Алгоритм, оптимальный по порядку сложности
- •§ 16. Асимптотические нижние границы
- •§ 16. Асимптотические нижние границы
- •§ 17. Нижняя граница сложности в среднем
- •§ 17. Нижняя граница сложности в среднем
- •§ 17. Нижняя граница сложности в среднем
- •§ 17. Нижняя граница сложности в среднем
- •§ 17. Нижняя граница сложности в среднем 125
- •§ 18. Нижние границы сложности рандомизированных алгоритмов. Принцип Яо
- •§18. Нижние границы сложности рандомизированных алгоритмов 127
- •Глава 5
- •§ 19. Битовые операции
- •Глава 5. Битовая сложность
- •§ 19. Битовые операции
- •Глава 5. Битовая сложность
- •§ 20. Наивная арифметика: умножение
- •§ 20. Наивная арифметика: умножение
- •Глава 5. Битовая сложность
- •§ 20. Наивная арифметика: умножение
- •Глава 5. Битовая сложность
- •§ 21. Наивная арифметика: деление с остатком
- •§ 21. Наивная арифметика: деление с остатком
- •Глава 5. Битовая сложность
- •§ 21. Наивная арифметика: деление с остатком
- •Глава 5. Битовая сложность
- •§ 22. Модулярная арифметика
- •§ 22. Модулярная арифметика
- •Глава 5. Битовая сложность
- •§ 22. Модулярная арифметика
- •Глава 5. Битовая сложность
- •§ 22. Модулярная арифметика
- •Глава 5. Битовая сложность
- •§ 23. Булева арифметика
- •§ 23. Булева арифметика
- •Глава 5. Битовая сложность
- •§ 23. Булева арифметика
- •Глава 5. Битовая сложность
- •Глава 5. Битовая сложность
- •Глава 6
- •§ 24. Простейшие рекуррентные уравнения
- •§ 24. Простейшие рекуррентные уравнения
- •§ 24. Простейшие рекуррентные уравнения
- •§ 25. Об одном классе нелинейных рекуррентных соотношений 163
- •§ 25. Об одном классе нелинейных рекуррентных соотношений
- •§ 25. Об одном классе нелинейных рекуррентных соотношений 165
- •§ 25. Об одном классе нелинейных рекуррентных соотношений 167
- •§26. Асимптотические оценки решений рекуррентных неравенств 169
- •§ 26. Асимптотические оценки решений рекуррентных неравенств
- •§ 26. Асимптотические оценки решений рекуррентных неравенств 171
- •§ 27. Добавление нулей
- •§ 27. Добавление нулей 173
- •§ 27. Добавление нулей 175
- •§ 27. Добавление нулей
- •§ 27. Добавление нулей 179
- •Глава 7 Сводимость
- •§ 28. Линейная сводимость
- •Глава 7. Сводимость
- •§ 28. Линейная сводимость
- •Глава 7. Сводимость
- •§ 28. Линейная сводимость
- •Глава 7. Сводимость
- •§ 29. Линейная сводимость и нижние границы сложности
- •§ 29. Линейная сводимость и нижние границы сложности 191
- •Глава 7. Сводимость
- •§ 29. Линейная сводимость и нижние границы сложности 193
- •Глава 7. Сводимость
- •§ 30. Классы PиNp
- •§ 30. Классы р и np
- •Глава 7. Сводимость
- •§ 30. Классы PuNp
- •Глава 7. Сводимость
- •§ 30. Классы PuNp
- •Глава 7. Сводимость
- •§ 31. Существование задач распознавания, не принадлежащих р 201
- •§ 31. Существование задач распознавания, не принадлежащих р. Связь моделей мт и рам
- •Глава 7. Сводимость
- •§ 31. Существование задач распознавания, не принадлежащих р 203
- •Глава 7. Сводимость
- •§ 32. Полиномиальная сводимость. Np-полные задачи
- •§ 32. Полиномиальная сводимость. Np-полные задачи
- •Глава 7. Сводимость
- •Глава 7. Сводимость
- •Глава 7. Сводимость
- •Глава 7. Сводимость
- •Глава 1. Сложности алгоритмов как функции числовых аргументов. Сложность в худшем случае
- •119002, Москва, Большой Власьевский пер., 11. Тел. (499) 241-74-83
Глава 3
Оценивание числа шагов (итераций) алгоритма
§ 9. Функции, убывающие по ходу выполнения алгоритма
Часто выполнение алгоритма является последовательностью однотипных шагов (итераций). Если все шаги равнозатратны по времени, то общее их число с точностью до постоянного множителя эквивалентно временным затратам рассматриваемого алгоритма для данного входа, и важной задачей является определение или хотя бы оценивание числа этих шагов.
Пример 9.1. Пусть а0, а1 —натуральные числа, а0^а1. Поиск наибольшего общего делителя (нод) чисел а0, а1 по алгоритму Евклида требует выполнения серии однотипных шагов, каждый из которых— деление с остатком:
a0 = q1a1 +а2, а1 = q2a2 +а3,
(9.1) ап-3 = Чп-2ап-2 + ап-1
a„-2 = q n-1 a„-1 + a n ,
ап-1 = Чпап.
В этом случае ап = нод(а0, а1), так как
нод(а0, а1) = нод(а1, а2) =... = нод(ап, 0) = ап.
Последовательность получаемых остатков убывает (остаток меньше делителя), при этом все остатки — неотрицательные целые. Не существует убывающей бесконечной последовательности, элементами которой являются неотрицательные целые числа, поэтому выполнение алгоритма Евклида (будем обозначать его буквой E) завершается для любых натуральных а0, а1, и число делений с остатком не пре-
§ 9. Функции, убывающие по ходу выполнения алгоритма 75
восходит аг. Обозначив через СЕ{а0,аг) исследуемое число делений с остатком, получаем
СЕ(.а0,а1)^а1 (9.2)
(для упрощения записи мы пишем СЕ(,а0,аг) вместо С^{а0, аг)). Это говорит о том, что если аг рассматривается как размер входа или если а0, аг рассматриваются как два параметра размера входа, то сложность алгоритма Евклида по числу делений не превосходит аг. Как мы увидим, эта оценка является весьма грубой, но, привлекая сходные рассуждения, можно получать и более тонкие оценки.
Формализуем те соображения, которые привели нас к этой первой оценке. Каждый шаг алгоритма имеет дело с парой неотрицательных целых {а{_ъ at) и при условии at ф 0 перерабатывает эту пару в {ahai+1), где ai+1 равно остатку от деления а(_г на at. На множестве пар неотрицательных целых чисел к, I мы определяем функцию L(fc,Z), принимающую неотрицательные целые значения. Эта функция такова, что когда при выполнении алгоритма Евклида мы переходим от пары {а{_ъ at) к паре (аь ai+1), значения функции убывают: L{ai_1,ai)>L{ai,ai+1). Так как функция целочисленна, то ее значение убывает с каждым шагом по крайней мере на единицу. Отсюда следует, что общее число шагов не превзойдет значения функции L на исходной паре чисел. Мы рассмотрели функцию L{k,l) = l, и это привело нас к выводу, что число шагов не превзойдет значения Ца0,а1)=а1.
Для обоснования того, что число делений в алгоритме Евклида растет медленнее, чем аъ было бы достаточно найти соответствующую функцию I(fc,Z), значения которой при больших к,1 оказываются существенно меньшими, чем Z. Эта функция по-прежнему должна быть определена для любых неотрицательных целых k,l, М Z, принимать неотрицательные целые значения и убывать при замене пары М парой I, г, где г — остаток от деления к на Z. Хотя бы одна пара целых неотрицательных k,l, к^1, должна обращать L(M) в нуль, иначе вместо L{k,l) можно взять функцию L'(M) = ДМ) - 1 и т.д.
Предложение 9.1. Пусть к,1&П+, к>1, и пусть г —остаток от деления к на I. Тогда
(i) A(fc) > А(г), где, как обычно, А(-) — битовая длина данного числа;
(ii) функция
L(M) = A(fc) + A(Z)-2 (9.3)
такова, что L(k, l) > L(l, r).
76 Глава 3. Оценивание числа шагов (итераций) алгоритма
Доказательство. (i) Имеем k = ql + r, q^l, откуда k ^ l + r > 2r. Следовательно, A(k)>A(r).
(ii) Из A(k) > А(r) следует A(k) + A(l) - 2 > A(l) + А(r) - 2. П
Очевидно, что функция (9.3) неотрицательна. Таким образом, справедлива оценка
CЕ(a0,a1)^А(a0)+А(a1)-2. (9.4)
Но если a0 очень велико в сравнении с aг, то А(a0) + А(aх) - 2 > aг. Тем не менее, теперь для CЕ{a0,aг) уже легко выводится хорошая оценка. Пусть число делений с остатком больше 1. Имеем
CЕ(a0, aг) = CЕ{aъ a2) + 1 s= Х{aг) + А(a2) - 1 s= 2А(aх) - 1.
Оценка
CЕ(a0,a1)^2А(a1)-1, (9.5)
очевидно, верна и в случае единственного деления: CЕ(a0, aг) = 1 при том, что \{aг) ^ 1.
Если взять aг за размер входа {a0,aг), то для сложности по числу делений будем иметь
TЕ{aг) = шах CЕ(a0, a) s= 2А(aх) - 1 = 2Llog? aj + 2 - 1 «S 2 logo aг + 1.
Доказанное нами можно переформулировать так:
Если рассматривать aг как размер входа a0, aг алгоритма Евклида, то для сложности TЕ(aх) по числу делений выполнено неравенство
TE(a1)^21og2a1 + l. (9.6)
Эта же оценка имеет место и при рассмотрении двух параметров a0, aг размера входа.
Для достаточно больших aг верхняя оценка (9.6) существенно лучше, чем TЕ{aг) s= aг. (Несколько более точная, чем (9.6), оценка дается в задаче 52.)
Рассматривая далее оценки сложности по числу делений алгоритма Евклида, мы будем использовать значение aг в качестве размера входа (значение a0 может быть очень большим в сравнении с aъ но первое же деление с остатком приведет к aг,a2, где a2 <aг).
Известно, что алгоритм Евклида допускает разнообразные обобщения и расширения. Прежде всего, вместе с нод(a0, aг) можно находить целые s, t такие, что
sa0 + ta1 = HOfl(a0ja1). (9.7)