You are on page 1of 30

Основи

розв’язання
рекурентнних
співвідношень (РС)
План
1. Поняття рекурентних співвідношень
2. Основні способи розв’язання рекурентних
співвідношень
3. Деякі корисні формули
4. Метод ітерацій.
4.1. Дерева рекурсій. Приклад.
4.2. Ряди. Приклад.
5. Загальний рецепт.
6. Метод підстановки.
Способи розв’язання РС
• Багато задач, які доводиться розв’язувати
програмістам, досить ефективно розв’язуються
за допомогою рекурсивних алгоритмів.
Оцінюючи час роботи таких рекурсивних процедур,
ми приходимо до співвідношення, що виражає цей час
через час роботи тієї ж процедури на вхідних даних
меншого розміру (такі співвідношення називаються
рекурентними).

• Розглянемо 3 способи, що дозволяють розв’язати


рекурентне співвідношення, тобто знайти
асимптотичну оцінку для його розв’язання.
Способи розв’язання РС
1. Метод ітерацій полягає у «розгортанні» рекурентної
формули та одержанні при цьому суми, яку можна
потім оцінювати.

2. Загальний рецепт для розв’язання рекурентних


співвідношень вигляду Т(n) = аТ(n/b)+f(n),
де а1, b>1 – деякі константи, а f(n) – задана функція.
Такий рецепт ґрунтується на основній теоремі про
рекурентні співвідношення.

3. Метод підстановки передбачає, що можна вгадати


оцінку, а потім довести її за індукцією, підставляючи
вгадану формулу в праву частину співвідношення.
Деякі корисні формули

b logb a
=a e ln( x )
=a

logb a = 1 / log a b
log b a = c  log b a
c

log b a = log c a / log c b


c loga b
=b loga c
Деякі корисні формули
n
1

k =1
k = n( n + 1 ) =  ( n )
2
2

n
n( n + 1 )( 2n + 1 )

k =0
k =
2

6 n
1

k =1 k
= ln( n ) + 0( 1 )
n +1
n
k −1

k =0
k =
3

k −1
, де x  1
Деякі корисні формули
Сума Sc членів нескінченної спадної геометричної
прогресії: 
1 a де m >1,
Sc =  = a – перший член прогресії,
k =0 m k
1− q
q – основа прогресії

Сума Sз членів геометричної прогресії, що зростає:


n −1
a( r n − 1 )
S з =  ar = a + ar + ar + ar + ... + ar
k 2 3 n −1
=
k =0 r −1

де r >1
1. Метод ітерацій
Для розв’язання співвідношення можна його
проітерувати, одержати ряд та оцінити його.

Процес підстановки співвідношення в себе


досить зручно зобразити у вигляді дерева
рекурсії.

Отже, проаналізуємо вищеотримане


співвідношення T(n) = 2T(n/2) + n
із застосуванням дерев рекурсії.
1. Метод ітерацій (дерева рекурсії)
T(n) = 2T(n/2) + n.

T(n) → →

Початковий процес розгортання дерева.


1. Метод ітерацій (дерева рекурсії)
1. Метод ітерацій (дерева рекурсії)
1. Метод ітерацій (дерева рекурсій)
Знайдемо суму всіх ел-тів дерева, додавши суму
листя дерева до суми елементів усіх ярусів:
1. Метод ітерацій (дерева рекурсії)
Початковий процес розгортання дерева.
1. Метод ітерацій (дерева рекурсії)
1. Метод ітерацій (дерева рекурсій)
1. Метод ітерацій (дерева рекурсій)
1. Метод ітерацій (дерева рекурсії)
T(n) = 2T(n/2) + n2.

T(n) → →

Початковий процес розгортання дерева.


1. Метод ітерацій (дерева рекурсії)
1. Метод ітерацій (дерева рекурсії)
1. Метод ітерацій (дерева рекурсій)
Метод ітерацій (ряди)
• Оцінимо співвідношення T(n) = 3T ( n/4 ) + n.
• Підставимо його само в себе та оцінимо отриманий ряд

бо та
• Скільки кроків треба зробити, щоб дійти до T(1)?
Оскільки після i-ї ітерації виявиться , ми дійдемо до Т(1)
коли , тобто коли .
Враховуючи, що можемо оцінити ряд спадною
геометричною прогресією (+ останній член ):
2. Загальний рецепт
Даний метод можна застосовувати для рекурентних
співвідношень вигляду
T(n) = aT(n/b) + f(n) (*)
де а1, b>1 – деякі константи; f(n) – додатна (принаймні
для великих значень аргументу) функція.
(*) виникає, якщо алгоритм розбиває задачу розміром n
на а підзадач розміру n/b, які розв’язуються рекурсивно,
кожна за час Т(n/b), і результати об’єднуються. Витрати
на розбиття та об'єднання описуються функцією f(n).
У формулі (*) виникає проблема з округленням, оскільки
частка n/b може не бути цілою. Формально варто було б
замінити Т(n/b) на T(n/b), або на T(n/b).
Обидва варіанти приведуть до одної і тої ж відповіді,
тому для простоти будемо упускати округлення.
2. Загальний рецепт (теорема)
Нехай а1 і b>1 – константи, f(n) – функція,
Т(n) визначено при невід’ємних n формулою
T(n) = aT(n/b) + f(n), (*)
де під (n/b) розуміється n/b або n/b. То:
1) якщо для деякого >0,
то

2) якщо , то

3) якщо для деякого >0

і якщо для деякої константи с<1


і досить великих n, то
2. Загальний рецепт (сутність)
У кожному з 3-х випадків порівнюємо f(n) з nlogba. Та з них,
що зростає швидше і визначає порядок зростання Т(n)
(випадки 1 і 3). Якщо обидві функції одного порядку (вип. 2) –
з'являється додатковий логарифмічний множник
і відповіддю є формула .
У 1-у випадку недостатньо, щоб f(n) була просто < nlogba,
нам потрібен „зазор” розміром n для деякого >0.
Так само у 3-у випадку f(n) повинна бути > nlogba із
запасом і задовольняти умову регулярності: af(n/b)≤cf(n).
Ці 3 випадки не вичерпують усіх можливостей: може
виявитися, наприклад, що функція f(n) < nlogba , але зазор
недостатній, щоби скористатися 1-м твердженням теореми.
Аналогічна „щілина” є і між випадками 2 і 3.
Також функція може не мати властивості регулярності.
2. Загальний рецепт (приклади застосування)
Розглянемо співвідношення

Тут а=9;
b=3;
f(n)=n;
nlogba = θ(n2).

Оскільки f(n) = O(nlog39-) для  = 1, то застосовуємо


перше твердження теореми та робимо висновок, що
Т(n) = θ(n2).
2. Загальний рецепт (приклади застосування)
Розглянемо співвідношення

Тут а=1;
b=3/2;
f(n)=1;
nlogba = nlog3/21 = n0 = 1.

Оскільки f(n) = θ(nlogba ) = θ(1) – застосовуємо


друге твердження теореми та робимо висновок, що
Т(n) = θ(log n).
2. Загальний рецепт (приклади застосування)
Розглянемо співвідношення

Тут а=3; b=4;


f(n)=n∙logn;
nlogba = nlog34 = O(n0,793). Зазор є  ≈ 0,2.
Перевіримо умову регулярності. Для досить великого n
маємо

для с = 3/4.
Отже, застосовуємо друге твердження теореми
та робимо висновок, що Т(n) = θ(n∙log n).
3. Метод підстановки
• Ідея: відгадати відповідь і довести її за індукцією.
Це потребує досвіду. Наприклад, якщо Ви вже
розв’язували подібне рекурентне співвідношення і
отримали деяку відповідь – її можна прийняти і в даному
випадку, а потім або довести правильність відповіді, або
шукати іншу відповідь.

• Часто відповідь містить коефіцієнти, які треба вибрати


так, щоб міркування за індукцією проходило. Індуктив-
ний метод застосовують і до нижніх, і до верхніх оцінок.

• Як приклад знайдемо верхню оцінку для функції, заданої


співвідношенням
3. Метод підстановки

Припустимо, що Т(n) = O(nlogn), тобто що Т(n)  cnlogn


для с>0. Доведемо це за індукцією. Нехай ця оцінка
правильна для , тобто
Підставивши її у співвідношення, одержимо

Останній перехід законний при с1.


Тепер перевіримо базис індукції, тобто доведемо оцінку для початкового
значення п. При n=1 права частина нерівності = 0, яким би не взяти с (бо
log1 = 0). Але асимптотичну оцінку досить довести для всіх п, починаючи
з деякого. Підберемо с так, щоб оцінка T(n)  cnlogn була правильна при
n=2 і n=3. Тоді для великих п можна міркувати за індукцією, і небезпеч-
ний випадок n = 1 нам не зустрінеться (оскільки n/2 ≥ 2 при n > 3).
Висновки
1. Розглянуто питання розв’язання рекурентних співвідношень
для оцінювання складності рекурсивних алгоритмів.
2. Наведено основні способи розв’язання рекурентних
співвідношень.
3. Наведено деякі формули, що використовуються під час
оцінювання рекурентних співвідношень.
4. Розглянуто метод ітерацій.
4.1. Детально розглянуто дерева рекурсій. Наведено
відповідні типові приклади.
4.2. Проаналізовано метод ітерацій шляхом використання
рядів. Наведено відповідний приклад.
5. Проаналізовано загальний рецепт розв’язання рекурентних
співвідношень на базі основної теореми про рекурентні
співвідношення. Наведено відповідні типові приклади.
6. Наведено метод підстановки з відповідним прикладом.

You might also like