6.10 Substituční metoda

Mějme opět rekurenci (případně i jinou rekurenci)

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

Substituční „metoda“ spočívá v následujících dvou krocích:

  1. Uhodněte/odhadněte asymptotické chování $T(n)$, vyjádřené pomocí $\Theta$, $\mathcal{O}$, $\Omega$, …

  2. Dokažte jeho platnost pomocí matematické indukce.

Z důvodu zpětné kompatibility s BI-ZDM o tomto přístupu stále mluvíme jako o „substituční metodě“. Ale skutečně nejde o nic jiného, než o důkaz platnosti jistého vztahu pomocí matematické indukce. Demonstrujme výše popsané myšlenky na konkrétních příkladech.

Příklad 6.24

Mějme rekurentní rovnici

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

Pomocí iterační metody po $k$ krocích dostaneme

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

Pokud $n = 2^k$, tj. $k = \log_2(n)$, pak dostáváme

\begin{equation*} T(n) = n \log_2(n) + n T(1). \end{equation*}

Pomocí matematické indukce dokažte vztah $T(n) = \mathcal{O}(n \ln n)$, pro $n \to \infty$.

Zobrazit řešení

Máme dokázat následující tvrzení: splňuje-li $T(n)$ rekurentní rovnici $T(n) = 2 T\left( \frac{n}{2} \right) + n$, pak

\begin{equation*} \text{existují} \ n_0\in\N \ \text{a} \ c > 0 \ \text{tak, že} \ 0 \leq T(n) \leq c n \ln(n) \ \text{pro každé} \ n \geq n_0. \end{equation*}

Indukční krok: Předpokládejme, že pro $n$ platí $T(\frac{n}{2}) \leq c \frac{n}{2} \ln \frac{n}{2}$. Potom s využitím rekurentního vztahu dostáváme

\begin{align*} T(n) &= 2 T\left( \frac{n}{2} \right) + n \overset{IP}{\leq} 2 \left( c \frac{n}{2} \ln \frac{n}{2} \right) + n = \\ &= cn \ln(n) - cn\ln 2 + n = cn \ln(n) + n(1 - c\ln 2).\end{align*}

Pro $c > \frac{1}{\ln 2}$ je poslední výraz záporný a proto platí $T(n) \leq cn \ln(n)$. Omezení na $n$ jsme žádná neměli.

Základní krok matematické indukce: dokážeme nalézt nějaké $n_0 \in \N$ takové, aby nerovnost $T(n_0) \leq c n_0 \ln(n_0)$ platila pro nějaké $c > 1/\ln 2$? Ano, můžeme vzít libovolné $n_0 > 1$, pro které má $T(n_0)$ smysl a pak nerovnost splnit volbou dostatečně velkého $c$.

Poznámka: Naprosto analogickým způsobem bychom dokázali vztah $T(n) = \Omega(n \ln(n))$, pro $n \to \infty$ a dohromady tedy i $T(n) = \Theta(n \ln(n))$, $n \to \infty$.

Příklad 6.25

Mějme rekurenci

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

Pomocí matematické indukce dokažte, že $T(n) = \mathcal{O}(n)$.

Zobrazit řešení

V tomto případě se dostaneme do problémů. Chceme ukázat, že nerovnost

\begin{equation}\label{eq_rek}\tag{6.11} 0 \leq T(n) \leq c n \end{equation}

platí pro nějaké $c > 0$ a všechna dost velká $n$.

Indukční krok: Předpokládejme platnost vztahu $T\left(\frac{n}{2}\right) \leq c \frac{n}{2}$. Potom

\begin{equation*} T(n) = 2 T\left( \frac{n}{2} \right) + 1 \overset{IP}{\leq} 2 \cdot c \frac{n}{2} + 1 = cn + 1. \end{equation*}

Pravou stranu ovšem nikdy neuděláme menší než požadované $cn$.

Pokud ovšem chceme dokázat, že $T(n) = \mathcal{O}(n)$, pak díky tranzitivitě na pravé straně (6.11) stačí mít libovolný $\mathcal{O}(n)$ výraz.

Druhý pokus: V předchozím pokusu jsme „přetekli“, zkusme tento problém vyřešit zpřísněním původního požadavku, pokusme se ukázat nerovnost

\begin{equation*} T(n) \leq c n - b \end{equation*}

pro nějaké konstanty $c,b > 0$ a všechna dost velká $n$.

Indukční krok: Předpokládejme platnost vztahu $T\left(\frac{n}{2}\right) \leq c \frac{n}{2} - b$. Potom

\begin{equation*} T(n) = 2 T\left( \frac{n}{2} \right) + 1 \overset{IP}{\leq} 2 \cdot \left(c \frac{n}{2} - b \right) + 1 = cn + 1 - 2b. \end{equation*}

Požadujeme $1 - 2b \leq -b$, což je ekvivalentní $b \geq 1$.