6.9 Mistrovská metoda

Aplikujme opět iterační metodu na „obecnou“ rekurenci

\begin{equation*} T(n) = a \cdot T\left( \frac{n}{b} \right) + f(n). \end{equation*}

Prvních několik iterací dává

\begin{align*} T(n) &= f(n) + a \cdot T\left( \frac{n}{b} \right) \\ &= f(n) + a \cdot f\left( \frac{n}{b} \right) + a^2 \cdot T\left( \frac{n}{b^2} \right) \\ &= f(n) + a \cdot f\left( \frac{n}{b} \right) + a^2 f\left( \frac{n}{b^2} \right) + a^3 \cdot T\left( \frac{n}{b^3} \right).\end{align*}

Po $k$ iteracích pak dostáváme

\begin{align*} T(n) &= f(n) + a \cdot f\left( \frac{n}{b} \right) + \cdots + a^{k-1} f\left( \frac{n}{b^{k-1}} \right) + a^k \cdot T\left( \frac{n}{b^k} \right) \\ &= \sum_{j=0}^{k-1} a^j f\left( \frac{n}{b^j} \right) + a^k \cdot T\left(\frac{n}{b^k}\right).\end{align*}

Určíme ukončovací podmínku. Iteraci zastavíme pokud $\frac{n}{b^k} = 1$, tedy po $k = \log_b n$ iteracích (případně „$\leq$“ místo „$=$“). Pak klademe $T(1) = \Theta(1)$.

Celkem se tedy dostáváme ke vztahu

\begin{equation*} T(n) = \underbrace{\sum_{j=0}^{\log_b(n) - 1} a^j f\left( \frac{n}{b^j} \right)}_{A(n)} + \underbrace{\Theta\left( n^{\log_b(a)}\right)}_{B(n)}. \end{equation*}

Abychom vystihli chování $T(n)$, tak je potřeba rozhodnout, který z uzávorkovaných výrazů $A(n)$ a $B(n)$ je asymptoticky významnější. To můžeme vždy zkoumat v konkrétním případě (pro konkrétní volbu $a$, $b$ a $f$ – to přesně dělá iterační metoda), nebo se můžeme omezit na několik kvalitativně odlišných situací, což přesně činí následující věta.

Věta 6.9 (Mistrovská metoda / Master theorem)

Nechť $a \geq 1$ a $b > 1$ jsou reálné konstanty, $f$ kladná funkce jedné proměnné. Uvažujme rekurentní rovnici

\begin{equation*} T(n) = a \cdot T\left( \frac{n}{b} \right) + f(n), \end{equation*}

kde $\frac{n}{b}$ v argumentu může znamenat i $\lceil \frac{n}{b} \rceil$ nebo $\lfloor \frac{n}{b} \rfloor$.

Potom (všechny vztahy myšleny pro $n \to \infty$):

  1. Pokud $f(n) = \mathcal{O}(n^{\log_b(a) - \varepsilon})$ pro nějaké $\varepsilon > 0$, potom $T(n) = \Theta(n^{\log_b(a)})$.

  2. Pokud $f(n) = \Theta(n^{\log_b(a)})$, pak $T(n) = \Theta\big(n^{\log_b(a)} \cdot \ln(n)\big)$.

  3. Pokud $f(n) = \Omega(n^{\log_b(a) + \varepsilon})$ pro nějaké $\varepsilon > 0$ a pokud existuje $d \in (0, 1)$ a $n_0 \in \N$ takové, že

    \begin{equation*} a f\left( \frac{n}{b} \right) \leq d \cdot f(n), \quad \text{pro každé} \ n \geq n_0, \end{equation*}

    pak $T(n) = \Theta(f(n))$.

Kompletní důkaz na tomto místě podávat (zatím) nebudeme. Omezíme se jen na jeho náčrt v jednom případě. Nejprve ale pro jistotu čtenáře upozorněme:

Varování 6.1

Jednotlivé body Mistrovské metody nepokrývají všechny situace, které mohou nastat. V takovém případě je možné se uchýlit k iterační metodě.

Pokud $f(n) = \Theta(n^{\log_b(a)})$, pak existují dvě konstanty $c_1, c_2$ a $n_0$ takové, že

\begin{equation*} c_1 n^{\log_b(a)} \leq f(n) \leq c_2 n^{\log_b(a)}, \quad \text{pro všechna} \ n \geq n_0. \end{equation*}

Protože

\begin{equation*} \frac{n}{b^j} > n_0 \iff j \leq \log_b(n/n_0) = \log_b(n) - \log_b(n_0)\,, \end{equation*}

rozdělím sumu v $A(n)$ následovně

\begin{equation*} A(n) = \sum_{j=0}^{\log_b(n) - 1} a^j f\left( \frac{n}{b^j} \right) = \underbrace{\sum_{j=0}^{\log_b(n/n_0)-1} a^j f\left( \frac{n}{b^j} \right)}_{S(n)} + \underbrace{\sum_{j=\log_b(n/n_0)}^{\log_b(n) -1} a^j f\left( \frac{n}{b^j} \right)}_{C(n)} \end{equation*}

Suma $C(n)$ obsahuje $\log_{b}(n_0)$ sčítanců, navíc $1\leq \frac{n}{b^j} \leq n_0$, proto

\begin{equation*} 0 \leq C(n) \leq (\underbrace{\max\limits_{k\in\widehat{n_0}}f(k)}_D )\cdot \sum_{j = \log_b(n/n_0)}^{\log_b(n)} a^j = D a^{\log_b(n)}\sum_{j=0}^{\log_b(n_0)-1}a^j = \Theta\left(n^{\log_b(a)}\right) \end{equation*}

Celkem $C(n) = \mathcal{O}\left(n^{\log_b(a)}\right)$.

Odhad $S(n)$ shora:

\begin{align*} S(n) &\leq c_2 \sum_{j=0}^{\log_b(n/n_0)} a^j \left( \frac{n}{b^j} \right)^{\log_b(a)} = c_2 \sum_{j=0}^{\log_b(n/n_0)} n^{\log_b(a)} = \\ &= c_2 n^{\log_b(a)} \big( \log_b(n) - \log_b(n_0) \big) = n^{\log_b(a)} \ln(n) \cdot \Theta(1).\end{align*}

Analogicky provedeme i spodní odhad, tj. celkem $S(n) = \Theta(n^{\log_b(a)} \ln(n))$.

Protože $B(n) = \Theta(n^{\log_b(a)})$ celkem dostáváme

\begin{align*} T(n) &= S(n) + B(n) + C(n) = \\ &= \Theta\left(n^{\log_b(a)} \ln(n)\right) + \Theta\left(n^{\log_b(a)}\right) + \mathcal{O}\left(n^{\log_b(a)}\right) = \\ &= \Theta\left(n^{\log_b(a)} \ln(n)\right).\end{align*}

Tím je důkaz dokončen.

$\square$

Pojďme se nyní podívat na konkrétní příklad. Více příkladů lze nalézt ve výše zmíněné cvičebnici na MARASTu.

Příklad 6.20

Aplikujte Mistrovskou metodu na rekurenci

\begin{equation*} T(n) = 6 T\left( \frac{n}{4} \right) + n. \end{equation*}

Zobrazit řešení

Máme $a = 6$ a $b = 4$, tudíž

\begin{equation*} n^{\log_b(a)} = n^{\log_4(6)}, \quad \text{přičemž} \ \log_4(6) > 1. \end{equation*}

Proto jistě existuje kladné $\varepsilon$ (numericky třeba $1/10$) takové, že

\begin{equation*} f(n) = n = n^1 = \mathcal{O}(n^{\log_4(6) - \varepsilon}). \end{equation*}

V Mistrovské metodě jsme proto v první situaci a dostáváme výsledek

\begin{equation*} T(n) = \Theta(n^{\log_4(6)}). \end{equation*}

Příklad 6.21

Aplikujte Mistrovskou metodu na rekurenci

\begin{equation*} T(n) = 2 T\left( \frac{n}{2} \right) + n. \end{equation*}

Zobrazit řešení

Máme $a = 2$ a $b = 2$, tudíž

\begin{equation*} n^{\log_b(a)} = n^{\log_2(2)} = n^1. \end{equation*}

a

\begin{equation*} f(n) = n = n^1 = \Theta(n^{1}). \end{equation*}

V Mistrovské metodě jsme proto v druhé situaci a dostáváme výsledek

\begin{equation*} T(n) = \Theta(n^{\log_2(2)} \ln(n)) = \Theta(n\ln(n)). \end{equation*}

Příklad 6.22

Aplikujte Mistrovskou metodu na rekurenci

\begin{equation*} T(n) = 3 T\left( \frac{n}{4} \right) + n. \end{equation*}

Zobrazit řešení

Máme $a = 3$ a $b = 4$, tudíž

\begin{equation*} n^{\log_b(a)} = n^{\log_4(3)}, \quad \text{přičemž} \ 0 < \log_4(3) < 1. \end{equation*}

Proto existuje kladné $\varepsilon$ takové, že

\begin{equation*} f(n) = n = n^1 = \Omega(n^{\log_4(3) + \varepsilon}). \end{equation*}

Dále

\begin{equation*} a f\left(\frac{n}{b}\right) = 3 \frac{n}{4} = \frac{3}{4} n \, \leq \, d n, \end{equation*}

kde za $d \in (0,1)$ volíme například $\frac{3}{4}$. V Mistrovské metodě jsme proto v třetí situaci a dostáváme výsledek

\begin{equation*} T(n) = \Theta(n). \end{equation*}

Příklad 6.23

Aplikujte Mistrovskou metodu na rekurenci

\begin{equation*} T(n) = 3 T\left( \frac{n}{4} \right) + n^2. \end{equation*}

Zobrazit řešení

Máme $a = 3$ a $b = 4$, tudíž

\begin{equation*} n^{\log_b(a)} = n^{\log_4(3)}, \quad \text{přičemž} \ 0 < \log_4(3) < 1. \end{equation*}

Proto existuje kladné $\varepsilon$ takové, že

\begin{equation*} f(n) = n^2 = \Omega(n^{\log_4(3) + \varepsilon}). \end{equation*}

Dále

\begin{equation*} a f\left(\frac{n}{b}\right) = 3 \left(\frac{n}{4}\right)^2 = \frac{3}{4^2} n^2 \, \leq \, d n^2, \end{equation*}

kde za $d \in (0,1)$ volíme například $\frac{3}{4^2}$. V Mistrovské metodě jsme proto v třetí situaci a dostáváme výsledek

\begin{equation*} T(n) = \Theta(n^2). \end{equation*}