Майстер-метод

Матеріал з testwiki
Версія від 10:53, 20 березня 2025, створена imported>A.sav (Загальний вигляд: clean up, replaced: велиих → великих за допомогою AWB)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Майстер-метод (Шаблон:Lang-en) надає готові розв'язки в асимптотичному записі (через використання нотації великого О) для рекурентних співвідношень які використовуються при аналізі алгоритмів «розділяй і володарюй». Його популяризувала канонічна книга з алгоритмів — Вступ в алгоритми, написана Томасом Корменом, Чарльзом Лейзерсоном, Рівестом і Кліффордом Стейном, в якій метод описано і доведено. Однак, не всі рекурентні співвідношення можна розв’язати за допомогою цього методу; метод Акра-Баззі узагальнює майстер-метод.

Вступ

Розглянемо проблему, яку можна розв'язати за допомогою рекурсивного алгоритму як-от такого:

 підпрограма T( n : розмір проблеми ) визначений як:
   якщо n < 1 тоді вихід

Виконати роботу обсягом f(n)

T(n/b) T(n/b) ...повторити загалом a раз... T(n/b) кінець підпрограми

В попередньому алгоритмі ми розділили задачу на кілька підзадач рекурсивно, кожна з підзадач розміром n/b. Це можна зобразити як дерево викликів, де кожна вершина дерева це один рекурсивний виклик, а її дочірні вершини є примірниками наступних викликів. В попередньому прикладі, кожна вершина матиме a дочірніх вершин. Кожна вершина виконує обсяг роботи відповідний до розміру отриманої підзадачі — n, який вимірюється як f(n). Загальний обсяг роботи виконаної цілим деревом становить суму роботи, яку виконали усі вершини дерева.

Алгоритми подібні до попереднього можна представити як рекурентне співвідношення T(n)=aT(nb)+f(n). Ц е співвідношення можна успішно розгорнути для отримання виразу загального обсягу роботи.[1]

Майстер-метод дозволяє легко обчислити час виконання такого рекурсивного алгоритму в Θ-записі без розгортання рекурентного співвідношення.

Загальна форма

Майстер-метод розглядає рекурентні співвідношення такого виду:

T(n)=aT(nb)+f(n), де a1b>1

При застосуванні в розгляді рекурсивних алгоритмів, сталі і функції означають наступне:

  • n — розмір задачі.
  • a — кількість підзадач на кожному поступі рекурсії.
  • n/b — розмір кожної з підпроблем. (Тут мається на увазі, що всі підзадачі однакового розміру.)
  • f (n) — обсяг роботи поза рекурсивними викликами, який включає обсяг задачі розділення й обсяг злиття розв'язків підпроблем.

Опишемо три випадки докладніше.

Випадок 1

Загальний вид

Якщо f(n)=O(nlogb(a)ϵ) для деякої сталої ϵ>0, тоді:

T(n)=Θ(nlogba)

Приклад

T(n)=8T(n2)+1000n2

Як читач може побачити в попередній формулі, змінні мають такі значення:

a=8,b=2,f(n)=1000n2,logba=log28=3

Тепер ми повинні перевірити, що мають місце наступні рівняння:

f(n)=O(nlogbaϵ)
1000n2=O(n3ϵ)

Якщо ми оберемо ϵ = 1, ми отримуємо:

1000n2=O(n31)=O(n2)

Раз рівняння виконується, перший випадок майстер-метода можна застосувати для цього рекурентного співвідношення, отже отримуємо:

T(n)=Θ(nlogba)

Якщо підставити значення, зрештою отримуємо:

T(n)=Θ(n3)

Отже наше рекурентне співвідношення T(n) обмежене Θ(n3).

(Цей вислід підтверджується точним розв'язком рекурентного співвідношення, який становить T(n)=1001n31000n2, якщо взяти T(1)=1.)

Випадок 2

Загальний вид

Якщо для деякої сталої k ≥ 0 виконується, що f(n)=Θ(nlogbalogkn), тоді:

T(n)=Θ(nlogbalogk+1n)

Приклад

T(n)=2T(n2)+10n

Як читач може побачити в попередній формулі, змінні мають такі значення:

a=2,b=2,k=0,f(n)=10n,logba=log22=1

Тепер ми повинні перевірити, що мають місце наступні рівняння (при k=0):

f(n)=Θ(nlogba)

Якщо підставити значення, ми отримаємо:

10n=Θ(n1)=Θ(n)

Через те, що рівняння виконуються, тут можна застосувати другий випадок майстер-метода, отримуємо:

T(n)=Θ(nlogbalogk+1n)

З підставковою значень отримуємо:

T(n)=Θ(nlogn)

Отже наше рекурентне співвідношення T(n) обмежене Θ(n log n).

(Цей вислід підтверджується точним розв'язком рекурентного співвідношення, який становить T(n)=n+10nlog2n, якщо покласти T(1)=1.)

Випадок 3

Загальний вигляд

Як що правда що:

f(n)=Ω(nlogb(a)+ϵ) для деякої сталої ϵ>0

і якщо також істинно, що:

af(nb)cf(n) для деякої сталої c<1 і достатньо великих n, тоді:
T(n)=Θ(f(n))

Приклад

T(n)=2T(n2)+n2

Як можна побачити в попередній формулі, змінні мають такі значення:

a=2,b=2,f(n)=n2,logba=log22=1

Тепер ми повинні перевірити, що мають місце наступні рівняння:

f(n)=Ω(nlogba+ϵ)

Якщо підставити значення і вибрати ϵ = 1, ми отримаємо:

n2=Ω(n1+1)=Ω(n2)

Через те, що це рівняння виконується, ми маємо перевірити другу умову, тобто, якщо істинно, що:

af(nb)cf(n)

Якщо ми підставимо більше значень, ми отримаємо число:

2(n2)2cn212n2cn2

Якщо ми оберемо c=12, тоді істинно:

12n212n2, n1

Отже далі:

T(n)=Θ(f(n)).

Продовжуючи підстановки, ми отримуємо:

T(n)=Θ(n2).

Отже наше рекурентне співвідношення T(n) обмежене Θ(n2), що відповідає f (n) даної формули.

(Цей вислід підтверджується точним розв'язком рекурентного співвідношення, який становить T(n)=2n2n, прийняв T(1)=1.)

Заміна змінних

Розглянемо T(n)=12T(n1/3)+log(n)2.

Нехай n=3m (тобто, нехай m=log3n). Тоді заміною змінних отримуємо:

T(3m)=12T((3m)1/3)+(log(3m))2=12T(3m/3)+(mlog3)2=12T(3m/3)+(log3)2m2

Перейменовуючи S(m)=T(3m) маємо: S(m)=12S(m/3)+(log3)2m2.

З log312>log39=2 випливає що (log3)2m2=O(nlog312ϵ) якщо 0<ϵlog3122. Отже, по першому випадку майстер-методу, ми маємо S(m)=Θ(mlog312). Замінюючи змінні назад до початкового рекурентного співвідношення виводимо:

T(n)=T(3m)=S(m)=Θ(mlog312)=Θ((log3n)log312)=Θ((logn)log312)

Використовуючи тотожність xlogby=ylogbx, можемо альтернативно записати як:

T(n)=Θ(12log3logn)

Недопустимі рівняння

Зауваження: три випадки не покривають усіх можливостей для f(n). Існує розрив між 1 і 2 коли f(n) менша від nlogba, але не поліноміально менша. Подібний розрив присутній між 2 і 3 коли f(n) більша ніж nlogba, але не поліноміально більша. Коли функція f(n) потрапляє а один з цих розривів або умова регулярності не дотримана у випадку 3, майстер-метод використовувати не можна.

Наступні рівняння не можливо розв'язати із використанням майстер-методу:[2]

  • T(n)=2nT(n2)+nn
    a не стала, кількість підзадач мусить бути фіксованою
  • T(n)=2T(n2)+nlogn
    не поліноміальна різниця між f(n) і nlogba (дивись нижче)
  • T(n)=0.5T(n2)+n
    a<1 не можна мати менш ніж одну підзадачу
  • T(n)=64T(n8)n2logn
    f(n) не додатне
  • T(n)=T(n2)+n(2cosn)
    випадок 3, але порушена постійність.

В другому недопустимому прикладі, різницю між f(n) і nlogba можна виразити як співвідношення f(n)nlogba=nlognnlog22=nnlogn=1logn. Видно, що 1logn<nϵ для будь-якої сталої ϵ>0. Тому, різниця не поліноміальна і не можна застосувати майстер-метод.

Доведення

У разі коли f(n)=nd можливо визначити щільну асимптотичну межу[3] в таких трьох випадках:

T(n)={O(nlogba),if a>bdO(ndlogn),if a=bdO(nd),if a<bd

В цьому доведенні ми покладемо T(1)=1.

Дерево рекурсії матиме logbn рівнів. На кожному рівні кількість підзадач збільшуватиметься в a раз, отже на рівні i матимемо ai підзадач. Кожна підзадача на рівні i має розмір n/bi. Підзадача розміру n/bi потребує (n/bi)d додаткової роботи і через те, що на рівні i всього

ai(n/bi)d=nd(aibdi)=nd(abd)i.

З нашої формули для рівня i ми бачимо, що робота зменшується, залишається незмінною або збільшується відповідно до (abd)i. Три випадки залежать від того чи (abd)i дорівнює 1, менша або більша від 1. Тепер зауважимо, що

(abd)i=1a=bdlogba=dlogbblogba=d.

Отже видно звідки з'явились три випадки. Загалом, ми маємо такий обсяг роботи Шаблон:NumBlk

У випадку, коли a=bd маємо

Шаблон:EquationNote =nd(logbn+1)=O(ndlogbn)

Розглянемо випадок, коли a<bd. Тут нам знадобиться формула суми геометричного ряду:

i=0kri=rk+11rk1, де r<1. Довести можна за індукцією.

Якщо r<1, тоді rk+11rk1<11r=c1 — стала, не залежить від k.

Шаблон:EquationNote =c1nd=O(nd)

Якщо r>1, тоді rk+11rk1<rk+11r=rkrr1=O(rk).

Шаблон:EquationNote =O(nd(abd)logbn).

Розглянемо внутрішній вираз:

nd(abd)logbn=ndalogbnbdlogbn=ndalogbnnd=alogbn=nlogba.

Застосування до поширених алгоритмів

Алгоритм Рекурентне співвідношення Час виконання Коментар
Двійковий пошук T(n)=T(n2)+O(1) O(logn) Майстер-метод, випадок 2, де a=1,b=2,logba=0,k=0
Двійковий обхід дерева T(n)=2T(n2)+O(1) O(n) Майстер-метод, випадок 1, де a=2,b=2,logba=0
Сортування злиттям T(n)=2T(n2)+O(n) O(nlogn) Майстер-метод, випадок 2, де a=2,b=2,logba=1,k=0

Примітки

Шаблон:Reflist

  1. Duke University, "Big-Oh for Recursive Functions: Recurrence Relations", http://www.cs.duke.edu/~ola/ap/recurrence.html Шаблон:Webarchive
  2. Massachusetts Institute of Technology (MIT), "Master Theorem: Practice Problems and Solutions", http://www.csail.mit.edu/~thies/6.046-web/master.pdfШаблон:Недоступне посилання
  3. В програмуванні часто замість Θ для вказання функції, що обмежує досліджувану функцію згори і знизу, використовують O.