- •Глава 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
§ 24. Простейшие рекуррентные уравнения
161
Таким образом, z{n) = Fn+1 - 1. Отсюда следует ряд асимптотических формул:
z(n) = -j=0n+1 + O(l), z(n) ~ -±=фп+1, z{n) = Q{<bn) (24.6)
V5 V5
и т.д. Обратимся теперь к (24.2). Характеристическим уравнением здесь вновь является (24.4). Поскольку Fn+1 = сгфп + с2фп, где със2 — полиномы нулевой степени, то правая часть уравнения (24.2) является суммой двух квазиполиномов, и для нахождения интересующего нас решения может быть привлечен общий метод, в результате чего получится формула вида у{п) = рг{п)фп + р2{п)фп, где, в силу того, что ф и ф являются корнями кратности 1 характеристического уравнения, а также того, что със2ф0, степени полиномов рг{п) и р2{п) равны 1. Это показывает, что у{п) = Сгфп+ С2фп+ рг{п)фп + + р2{п)фп = q1(n)фп + q2{n)фп при соответствующем выборе полиномов qi(n),q2(n) первой степени. Можно было бы найти эти полиномы, но даже не делая этого, а просто принимая во внимание, что степень q1(n) равна 1, получаем
у(п) = в(пф"). (24.7)
Мы видим, что анализ сложности простейших рекурсивных алгоритмов часто приводит к линейным рекуррентным уравнениям первого или второго порядка с постоянными коэффициентами (однородным или с правыми частями в виде суммы квазиполиномов). В таких случаях оказывается возможным найти явные формулы для сложности алгоритма. Асимптотические формулы иногда удается получить непосредственно из общего решения, не прибегая к вычислению значений входящих в него произвольных постоянных.
С помощью рекуррентных уравнений мы получаем информацию о вычислительной сложности рекурсивного алгоритма. Правда, дело не всегда обстоит просто,—иногда возникают уравнения с переменными коэффициентами или нелинейные уравнения и неравенства, и об этом мы еще будем говорить. Тем не менее, сам метод исследования сложности рекурсивных алгоритмов с помощью рекуррентных уравнений выглядит очень естественно.
Задержимся на формулах (24.6), (24.7). Если бы построение множества Vn при п > 2 разворачивалось не по алгоритму VRec, а несколько иначе, то затрат было бы существенно меньше. Можно находить шаг за шагом множества V1,V2,V3, ... до появления интересующего нас Vn, при этом каждое Vk, к = 3, 4,..., п, строится исходя из уже имеющихся множеств Vk2 и Укг. Или же можно организовать рекурсию
162 Глава 6. Рекуррентные соотношения и сложность алгоритмов
для вычисления пары Рп = (Vn, Vn-1) так, чтобы при вычислении Рп исходя из Рп-1 множество Vn-1 просто переходило бы из пары в пару. Будем использовать обозначения у*(п) и z*(n) для количества преобразований чисел и соответственно для количества объединений множеств, затрачиваемых при нахождении (Vn,Vn-1). При п>2 имеем y*(n) = y*(n-1)+Fn+F„-1. Перепишем уравнение в более удобном виде и добавим начальное значение:
y*(n)-y*(n-1) = Fn+1, (24.8)
у*(1) = 0. Аналогично,
z*(n)-z*(n-1) = 1, (24.9)
z*(1) = 0. Легко получаем z*(n) = n- 2 для п^2 и у*(п) = в(ф").
Причина избыточной сложности первого из рассмотренных алгоритмов ясна. Построение Vn требует вычисления Уп-1 и Vn-2, а Уп-1 в свою очередь потребует построения Vn-2 и Vn-3. Таким образом, даже не прослеживая ход построений слишком далеко, мы видим, что требуются два независимых построения множества Vn-2, при этом построение Vn-2 по тем же причинам будет производиться не лучшим образом.
Пример 24.3. Достаточно ясно, что при к > 2 рекурсия вида
Yn = U(Yn-1,...,Yn-k) (24.10)
(например, с заданными У0,У1,...,Ук-1) заслуживает еще меньше доверия, чем при к = 2, коль скоро эта рекурсия предписывает независимое вычисление Yn-1,Yn-2, ...,Yn-k; при этом не важно, являются ли Yt числами, множествами или же какими-то другими объектами. Нахождение Yn с помощью простейшего циклического алгоритма потребует п-к + 1 обращений к U. Если при рекурсивном нахождении их требуется у(п), то
у(п) - у(п - 1) - ... - у(п - к) = 1, (24.11)
у(0) = у(1) = ... = у(к - 1) = 0. Можно найти асимптотику у(п), не решая полностью рекуррентного уравнения (24.11), и получить следующее предложение.
Предложение 24.1. Пусть рекурсивный алгоритм организован по схеме (24.10), пусть к ^ 2 и пусть для получения значения функции U необходимы значения всех ее к аргументов. Тогда количество вычислений значений этой функции при нахождении Yn есть Q(ank), и ак
удовлетворяет условию 2-^ак<2, к = 2,3,