- •Глава 4
- •4.1. Комбинаторные вычисления на конечных множествах
- •4.1.2. Асимптотика
- •Говорят, что при Xx0 f(X) растёт медленнее, чем g(X), или что f(X) "есть о-малое" от g(X).
- •Отсюда, в частности, имеем при n
- •4.1.3. Рекуррентные соотношения
- •Последовательность Фибоначчи асимптотически растёт как
- •4.1.4. Производящие функции
- •4.2. Оценки сложности алгоритмов
- •4.3. Методы повышения эффективности алгоритмов
- •4.3.1. Рекурсия
- •4.3.2. Приём “разделяй и властвуй”
- •4.3.3 Принцип балансировки
- •4.3.4. Динамическое программирование
- •4.3.5. Алгоритмы с возвратом
- •Понимание постановки задачи
- •Составление плана решения
- •Взгляд назад
- •Основные этапы полного построения алгоритма
- •Постановка задачи
- •Временная сложность t(n)
- •Ёмкостная сложность е(n)
- •Заключение
- •Контрольные вопросы. Упражнения
Отсюда, в частности, имеем при n
и . (4.5)
В более общем случае при n и для любого целого k0
; (4.6)
. (4.7)
4.1.3. Рекуррентные соотношения
Понятие рекуррентных соотношений проиллюстрируем на классической проблеме, поставленной и изученной Фибоначчи около 1200 г.
Фибоначчи поставил свою проблему в форме рассказа о скорости роста популяции кроликов при следующих предположениях. Все начинается с одной пары кроликов. Каждая пара кроликов становится фертильной (fertile – плодовитый) через месяц, после чего каждая пара рождает новую пару кроликов каждый месяц. Кролики никогда не умирают, и их воспроизводство никогда не прекращается. Пусть Fn - число пар кроликов в популяции по прошествии n месяцев и пусть эта популяция состоит из Nn пар приплода и On “старых” пар, т.е. Fn = Nn + On. Таким образом, в очередном месяце произойдут следующие события:
- старая популяция в (n+1)-й момент увеличится на число родившихся в момент времени n, т.е. On+1 = On + Nn = Fn;
- каждая старая в момент времени n пара производит в момент времени (n+1) пару приплода, т.е. Nn+1 = Cn.
В последующий месяц эта картина повторяется:
On+2 = On+1+ Nn+1 = Fn+1,
Nn+2 = On+1;
объединив эти равенства, получим рекуррентное соотношение Фибонначи:
On+2 + Nn+2 = Fn+1 + On+1,
или
Fn+2 = Fn+1 + Fn. (4.8)
Выбор начальных условий для последовательности чисел Фибоначчи не важен; существенные свойства этой последовательности определяются рекуррентным соотношением (4.8). Обычно полагают F0=0, F1=1 (иногда полагают F0=F1=1).
Рекуррентное соотношение (4.8) является частным случаем однородных линейных рекуррентных соотношений с постоянными коэффициентами:
xn = a1xn-1 + a2xn-2 +…akxn-k, (4.9)
где коэффициенты ai не зависят от n и x1, x2, …, xk считаются заданными.
Существует общий метод решения (т.е. отыскания xn как функции n) линейных рекуррентных соотношений с постоянными коэффициентами. Этот метод рассмотрим на примере соотношения (4.8). Найдём решение в виде
Fn=crn (4.10)
с постоянными с и r. Подставляя это выражение в (4.8), получим
crn+2 = crn+1 + crn,
или
crn(rn-r-1)=0. (4.11)
Это означает, что Fn=crn является решением, если либо с=0, либо r = 0 (и отсюда Fn=0 для всех n), а также (и это более интересный случай) если r2 - r -1=0, причём константа с произвольна. Тогда из (4.11) следует
r =или r =. (4.12)
Число 1,618 известно как золотое сечение, поскольку с древних времен считается, что треугольник (прямоугольник) со сторонами 1 и имеет наиболее приятные для глаза пропорции.
Сумма двух решений однородного линейного рекуррентного соотношения, очевидно, также является решением, и можно на самом деле показать, что общее решение последовательности Фибоначчи имеет вид
Fn=, (4.13)
где константы с и с’ определяются начальными условиями. Положив F0=0 и F1=1, получим следующую систему линейных уравнений:
, (4.14)
решение которой даёт
c = -c' = . (4.15)
Последовательность Фибоначчи асимптотически растёт как
Fn , (4.16)
поскольку вторым слагаемым в (4.15) можно пренебречь.