Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
abramov_s_a_lekcii_o_slozhnosti_algoritmov.doc
Скачиваний:
136
Добавлен:
11.05.2015
Размер:
2.74 Mб
Скачать

§ 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,

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]