КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Простейшие рекуррентные уравнения
Рекуррентные соотношения (уравнения и неравенства) играют существенную роль в анализе алгоритмов. Наиболее известный и простой вид таких соотношений —это линейные рекуррентные уравнения с постоянными коэффициентами. Пример 24.1. Вернемся к задаче 104, в которой надо доказать, что если к числу, первоначально равному нулю, прибавляется шаг за шагом по единице до достижения значения 2" - 1, n ^ 0, то в целом потребуется 2" - п - 1 переносов единиц в старшие разряды. Коль скоро заранее указан ответ, для доказательства можно использовать индукцию. Но формулу 2" - п - 1 можно вывести, исходя лишь из условия задачи. Обозначим через s(n) исследуемое количество переносов и заметим, что если прибавлением единиц уже получено число 2"-1 - 1 (на это потребуется s (n -l) переносов), то очередное прибавление единицы потребует п - 1 переносов и приведет к числу 2"-1, двоичная запись которого есть 10...0 (количество нулей после единицы равно п-1). Далее в процессе достижения числа 11...1 (п единиц) потребуется еще s (n -l) переносов. Получаем рекуррентное уравнение s(n) = 2 s (n - 1) + n - 1 или s (n)-2 s (n -l) = n -l, (24.1) при этом s (0) = 0. Характеристическое уравнение1, соответствующее рекуррентному уравнению (24.1), имеет вид А - 2 = 0. Общее решение однородного уравнения s(n) - 2s (n - 1) = 0 есть сТ. Правую часть уравнения (24.1) можно записать в виде квазиполинома (п-1)1п. Значение 1 не является корнем характеристического уравнения, по- 1 О методе решения линейных рекуррентных уравнений с постоянными коэффициентами см. в приложении G. § 24. Простейшие рекуррентные уравнения этому (24.1) обладает частным решением вида an + Ъ; подставляя это выражение вместо s(n) в (24.1), получаем an + Ъ - 2(а(п - 1) + Ь) = = п - 1, и, приравнивая в левой и правой частях коэффициенты при первой и нулевой степенях п, имеем а = Ъ = -1. Получаем общее решение уравнения (24.1): s (n) = с 2 " - п - 1. Подбираем значение константы с так, чтобы выполнялось s (0) = 0; для этого должно выполняться с • 2 - 2 = 0, т. е. с = 1. Итак, потребуется 2 " - п - 1 переносов единиц в старшие разряды. Алгоритм, который содержит прямые или косвенные (т. е. при посредстве других алгоритмов) обращения к себе, как известно, называется рекурсивным. Рекуррентные соотношения являются удобным средством анализа сложности рекурсивных алгоритмов. В следующем примере обсуждается использование рекуррентных уравнений в анализе рекурсивных алгоритмов и указывается один неудачный вид рекурсии. Пример 24.2. Рассмотрим построение множества Vn всех целых чисел, десятичная запись каждого из которых содержит только цифры 1 и 2, а сумма цифр равна заданному числу n ^ 1. Непосредственно видно, что V i = {l}, У 2 = Ш,2}, У 3 = Ш1, 21,12}. В общем случае Vn является, очевидно, объединением двух непересекающихся подмножеств, в первое из которых входят все числа из Vn, оканчивающиеся цифрой 1, во второе — цифрой 2. Если вычеркнуть последнюю цифру, то при п ^ 2 первое подмножество превратится в Уп - ъ второе — в Vn-2. Это наблюдение приводит к рекурсивному алгоритму V Rec построения Vn: если п = 1 или п = 2, то результатом будет {1} или соответственно {11,2}; иначе надо найти Vn-x (рекурсивное обращение к алгоритму) и приписать справа ко всем числам этого множества единицу, затем найти Vn-2 (еще одно рекурсивное обращение) и приписать справа ко всем числам этого множества двойку, после чего построить объединение двух получившихся множеств. Не составляет труда заметить, что алгоритм V Rec избыточно сложен (о чем еще будет идти речь). Но анализ сложности часто приходится проводить и для «плохих» алгоритмов — например, чтобы показать их практическую непригодность. Прежде чем исследовать временную сложность этого алгоритма, установим, чему равно число v (n) элементов Vn. Мы видим, что v (l) = l, v (2) = 2, v (n)= v (n -l)+ v (n -2), n = 3,4,... Таким образом, v (n) равно (п-Ы)-му числу Фибоначчи: v (n)= Fn +1. Явное выражение v (n) через п можно получить, воспользовавшись формулой Бине (10.2), которая сама может быть выведена с помощью общего 160 Глава 6. Рекуррентные соотношения и сложность алгоритмов метода решения линейных рекуррентных уравнений с постоянными коэффициентами. Используя рекуррентные уравнения, мы можем определить количество у(п) преобразований чисел при построении множества Vn по описанному алгоритму (каждое из этих преобразований состоит в приписывании справа к числу единицы или двойки). Мы можем также определить число z (n) выполняемых операций объединения множеств. Очевидно, имеет место уравнение у(п)=у(п-1) + + y (n -2) +Fn +Fn-1, которое мы перепишем в более удобном виде и добавим начальные значения: y(n)-y(n-1)-y(n-2)=Fn+1, (24.2) у(2) = у(1) = 0. Аналогично, имеем z (n)- z (n -1)- z (n -2) = 1, (24.3) z (2)= z (1) = 0. Начнем со второго уравнения. Будем, как обычно, прибегать к обозначениям , 1 + а/5 г 1-У5 Ф == ˜ ==. Непосредственно видно, что -1 является частным решением нашего рекуррентного уравнения (это частное решение можно получить и общим методом: правая часть является квазиполиномом 1", при этом 1 не есть корень характеристического уравнения А2 - А - 1 = 0, (24.4) и, следовательно, существует частное решение вида c 1", где с — полином нулевой степени, т. е. константа; подстановка в (24.3) дает с = -1). Корнями уравнения (24.4) служат числа фи ˜, входящие в формулу Бине, и общее решение уравнения (24.3) может быть записано в виде z (n) = С 1 фп + С2 ˜ п - 1. Начальные условия z (2) = z (1) = 0 приводят нас к системе 15 "ч 2 s 1 5 ~\ 2 Получаем C 1 = 4=, С2 = - ˜=. (24.5) а/ 5 а/ 5 § 24. Простейшие рекуррентные уравнения Таким образом, z{n) = Fn+1 - 1. Отсюда следует ряд асимптотических формул: z (n) = -j=0 n +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)фп при соответствующем выборе полиномов q i(n), q 2(n) первой степени. Можно было бы найти эти полиномы, но даже не делая этого, а просто принимая во внимание, что степень q1(n) равна 1, получаем у(п) = в(пф"). (24.7) Мы видим, что анализ сложности простейших рекурсивных алгоритмов часто приводит к линейным рекуррентным уравнениям первого или второго порядка с постоянными коэффициентами (однородным или с правыми частями в виде суммы квазиполиномов). В таких случаях оказывается возможным найти явные формулы для сложности алгоритма. Асимптотические формулы иногда удается получить непосредственно из общего решения, не прибегая к вычислению значений входящих в него произвольных постоянных. С помощью рекуррентных уравнений мы получаем информацию о вычислительной сложности рекурсивного алгоритма. Правда, дело не всегда обстоит просто,—иногда возникают уравнения с переменными коэффициентами или нелинейные уравнения и неравенства, и об этом мы еще будем говорить. Тем не менее, сам метод исследования сложности рекурсивных алгоритмов с помощью рекуррентных уравнений выглядит очень естественно. Задержимся на формулах (24.6), (24.7). Если бы построение множества Vn при п > 2 разворачивалось не по алгоритму V Rec, а несколько иначе, то затрат было бы существенно меньше. Можно находить шаг за шагом множества 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,
§ 25. Об одном классе нелинейных рекуррентных соотношений 163 В приложении H можно найти полное доказательство этого предложения. Оно основывается на исследовании расположения на комплексной плоскости корней алгебраических уравнений Afc-Afc-1-...-A-l = 0, к = 2,3,... Эти уравнения являются характеристическими для рекуррентных уравнений (24.11). § 25. Об одном классе нелинейных рекуррентных соотношений Одним из источников появления рекурсии в алгоритмах служит привлечение стратегии «разделяй и властвуй»: вычислительная задача с размером входа п разбивается на s > 1 одноименных задач, размер входа любой из которых примерно равен n/s («разделяй»); эти задачи решаются рекурсивно, т. е. с применением этой же стратегии, а затем полученные решения соединяются в решение исходной задачи («властвуй»). Для входов маленьких размеров — как правило, 0 или 1—задачи решаются каким-то простым способом, без рекурсии. При анализе сложности таких алгоритмов возникают специфические нелинейные рекуррентные соотношения в виде уравнений и неравенств. В общем случае такие соотношения довольно трудны для решения, но для многих конкретных задач удается исследовать сложность алгоритмов сведением рекуррентных соотношений к хорошо изученным линейным рекуррентным уравнениям первого порядка с постоянными коэффициентами и квазиполиномиальными правыми частями. Пример 25.1. Обратимся к сортировке слияниями в ее рекурсивном варианте и исследуем ее сложность Гш(п) по числу сравнений (п —длина массива). Функция T MS(n) подчиняется рекуррентному неравенству (О, если п = 1, Г\п\Л ГГп1Л (25.1) ?MS (\~п \ +?MS (\~п \ + п - 1 > если П>1. В самом деле, для любого массива длины п > 1 сортировка первых его [|J элементов потребует не более ^MsQfJ) сравнений (так как TMS( тМ) —это максимальное число сравнений, которое может потребоваться рассматриваемой сортировке при работе с массивом длины тН); аналогично, сортировка последних ^ элементов потре- 164 Глава 6. Рекуррентные соотношения и сложность алгоритмов бует не более, чем ГМ8(|"|"|) сравнений, а слияние потребует сравнений в количестве, не превосходящем ^ + ^-1 = п-1.В любом, а значит, и в худшем случае потребуется не более TMS( Ц) + + Tms (\l]) + п ~ г сравнений. Рекуррентные неравенства, схожие с неравенством (25.1), характерны для многих алгоритмов, построенных на стратегии «разделяй и властвуй». Мы прервем на некоторое время рассмотрение этого примера и обсудим общую ситуацию с неравенствами возникающего типа. Предложение 25.1. Пусть вещественная функция f натурального аргумента удовлетворяет неравенству
и, если п= 1, <Ш) + .*(Ш) + *м, »„„ >!, (25. 2)
где u,v,w — неотрицательные вещественные числа, причем v +w ^ 1, а функция у —неотрицательная неубывающая. Тогда Доказательство. Установим прежде всего, что вещественная функция F натурального аргумента, удовлетворяющая равенству
является неубывающей, т. е. при п ^ 2 выполнено F (n)^ F (n -l). (25.6) Проведем индукцию по п. При п = 2 неравенство выполнено, так как F (2) = (v + w) u + (^(2)^ u = F (l). Пусть п > 2 и неравенство (25.6) выполнено для 2, 3,...,п-1; докажем, что тогда оно верно и для п. Воспользуемся тем, что при п > 2 § 25. Об одном классе нелинейных рекуррентных соотношений 165 Имеем F (n)= vF 2 +w f 2 +<p(ri)2 >vFlL21 +wFIL -2 ~ +4> (n- 1) =F(n-1). Неравенство (25.6) доказано. Аналогичным образом по индукции докажем, что f(n)^F(n) (25.7) для п=г 1. Очевидно, /(1) ^ u = F (1). Пусть п> 1 и неравенство (25.7) выполнено для 1, 2,...,п- 1; докажем, что тогда оно верно и для п. В силу (25.2) мы имеем при п > 1 и так как при п > 1 выполняются неравенства 2k n -1 и 2 ^ ^ п - 1, то по предположению индукции V^Q2J) +М^(Т21) +(/>(")^ v i7Q2J) + wF ([2l) + ¥>("). (25.9) Правая часть последнего неравенства есть F (n). Это доказывает (25.7). Свойства (25.6), (25.7) дают нам /(n) ^ F (n) ^ F (2гlog2 n l) (25.10) для п^1. Исследуем функцию t (fc) = F (2fc), fc = 0,1,... В силу (25.5) F (2fc) = и, если к = 0, (v + w) F (2fc-1) + ^(2fc), если)с > 0, и, следовательно, t (fc) удовлетворяет линейному рекуррентному урав Определение 25.1. Рекуррентное уравнение (25.4), включающее в себя начальное условие £(0) = и, мы назовем уравнением, ассоциированным с рекуррентным неравенством (25.2). Если u,v,Lp(n) удовлетворяют условиям, сформулированным в предложении 25.1, то решение ассоциированного уравнения — неотрицательная функция (см. задачу 125). 166 Глава 6. Рекуррентные соотношения и сложность алгоритмов Продолжение примера 25.1. Уравнением, ассоциированным с (25.1), будет t k = 1°' k если k = 0' (25.11) 2 t (k -l)+2-l, если k> 0. Отвлекаясь временно от начального значения t (0) = 0, мы замечаем, что правая часть в t{k)-2t{k-l) = 2k-l (25.12) является суммой квазиполиномов 2k и —1; первый из них, т.е. 2k, интересен тем, что 2 является корнем характеристического уравнения А - 2 = 0, и поэтому рекуррентное уравнение t (k) - 2t{k - 1) = 2k имеет частное решение вида p{k)2k, где p (k)— полином первой степени. Подстановка (p 1 k + p 0)2 k в рекуррентное уравнение дает {pгk + p0)2k - (p iC k - 1) + p 0)2 k = 2k, откуда получаем, что p1 = 1, p 0—любое. Итак, k2k является частным решением рекуррентного уравнения с правой частью 2k. Слагаемое -1 правой части исходного уравнения можно переписать в виде (-1) • 1k, единица не является корнем характеристического уравнения, поэтому рекуррентное уравнение t (k) - 2t{k) = -1 имеет в качестве частного решения некоторую константу, значение которой определяется без труда — это 1. Таким образом, любое решение рекуррентного уравнения (25.12) может быть записано в виде c2k+k2k + 1 с некоторым конкретным c. Из условия t (0) = 0 находим c = —1 и t (k) = k 2 k -2 k + l. (25.13) По предложению 25.1 T MS(n) *S [log, n!2П°& n 1 - 2^ n 1 + 1 = = ([log2 n l-l)2rlo& n l + l^ ^log2 n -2lo^ n +1 + l = = 2 n log2 n + 1. Мы еще раз прервем рассмотрение примера 25.1 и сформулируем следующее предложение. § 25. Об одном классе нелинейных рекуррентных соотношений 167 Предложение 25.2. Пусть вещественная функция f натурального аргумента удовлетворяет неравенству и, еслип = 1, Q§J) +м//([§1) +У(п), еслип>1, где u,v,w — неотрицательные вещественные числа, причем v +w ^ 1, а функция у —неотрицательная неубывающая. Тогда /(n)^ t (Llog2 n J), (25.15) где t—решение рекуррентного уравнения (25.4). Доказательство получается заменой знака ^ на ^ в (25.7), (25.8) и (25.9), а также переходом от (25.10) к /(n)^ F (n)^ F (2Ll0&"J). Сохраняя введенную терминологию, рекуррентное уравнение (25.4) будем называть ассоциированным с рекуррентным неравенством (25.14). Если же возникает соотношение со знаком = вместо ^ или ^, то мы можем рассматривать его как систему двух рекуррентных неравенств (25.2), (25.14). Тогда получим оценки t aiog2 n |)sS/(n)sS t (riog2 n l). Завершим рассмотрение примера 25.1. Можно доказать (см. задачу 133), что для сложности по числу сравнений рекурсивной сортировки слияниями выполнено 0, еслип = 1, Гш§ +Гш§ +п-1' еслип > 1> и прийти к справедливым для всех п оценкам (Llog2 п\ - l)2Ll0& n J + 1 s= Тш{п) s= aiog2 п] - l)2rl0& n l + 1. (25.17) Для исследования сложности Тш (п) рекурсивной сортировки слияниями по числу перемещений рассмотрим рекуррентное уравнение „0, если п = 1,
rMS(n)=~ л„п сГтЦЛ (25.18) 168 Глава 6. Рекуррентные соотношения и сложность алгоритмов (при слиянии массивов, содержащих соответственно ^ и ^ элементов, требуется ровно п перемещений элементов). Решением ассоциированного уравнения
О, если/с = 0, 2t{k-l) + 2k, если)с > 0, является k2k, что дает нам Llog2 n j2^"J ^ fMS(n) ^ [log2 п^Ч (25.19) Пространственная сложность этой сортировки есть П(п), ибо слияние упорядоченных массивов выполняется с получением результата на новом месте. (Дополнительно к этому будет использоваться стек отложенных заданий.) Рассмотрение примера 25.1 закончено. Интересно посмотреть на результаты применения разобранного метода на каком-нибудь примере, для которого мы знаем точное значение сложности алгоритма, — сколь далеки будут получаемые оценки от известного точного значения? Пример 25.2. Вернемся к бинарному алгоритму вычисления а" (пример 4.2), который можно легко описать рекурсивно. Для его сложности по числу умножений имеем
О, если п = 1, Г\п\Л (25.20) TRS I - I + 2, если п > 1, и (0, еслип = 1, Гцк(п)И Г\п\Л (25.21) 7rs(L§JJ+1, еслип > 1.
Соответствующими ассоциированными уравнениями будут t (fc) = t (fc) = их решения суть 2fc и fc. Отсюда Llog2 n J s= TRS (n) s= 2 riog2 n]. (25.22) Эти оценки не сильно расходятся с точной формулой T RS(n) = A(n) + + А*(п)-2. § 26. Асимптотические оценки решений рекуррентных неравенств 169
Дата добавления: 2014-01-11; Просмотров: 1390; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |