Twierdzenie o rekurencji uniwersalnej: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
Usunięta treść Dodana treść
m drobne techniczne |
|||
Linia 2:
== Twierdzenie o rekurencji uniwersalnej ==
Jeżeli funkcja <math>T(n),</math>
:: <math>T(n) = \begin{cases}
\Theta (1) &: 1\leqslant n < b \\
a\cdot T\left(\frac{n}{b}\right) + f(n)&: n\geqslant b
\end{cases}</math>
to:
* Jeżeli <math>f(n) = O(n^{\log_ba-\epsilon})</math> dla pewnej stałej <math>\epsilon > 0,</math>
* Jeżeli <math>f(n) = \Theta(n^{\log_ba}),</math>
* Jeżeli <math>f(n) = \Omega(n^{\log_ba+\epsilon})</math> dla pewnej stałej ε > 0 i jeżeli <math>a\cdot f\left(\frac{n}{b}\right)\leqslant c\cdot f(n)</math> dla pewnej stałej <math>c \in (0,1),</math>
Tak zdefiniowane funkcje ''T'' stanowią pewien schemat działania algorytmów typu
== Intuicyjna interpretacja ==
Każdy z trzech przypadków rekurencji uniwersalnej sprowadza się do stwierdzenia, która z funkcji <math>n^{\log_ba}</math> i ''f'' jest
==
Należy zdawać sobie sprawę, że twierdzenie o rekurencji uniwersalnej nie wyczerpuje wszystkich przypadków, nawet rekursji
== Dowód twierdzenia o rekurencji uniwersalnej ==
Linia 29:
:: <math>T(n) = \begin{cases}
\Theta (1) &: n=1 \\
a\cdot T\left(\frac{n}{b}\right) + f(n)&:n=b^i
\end{cases}</math>
to
: <math>T(n) = \Theta (n^{\log_ba}) + \sum_{j = 0}^{\log_bn-1} a^j\cdot f\left(\frac{n}{b^j}\right)</math> (*)
===== Dowód =====
Rozważmy [[drzewo rekursji]] funkcji ''T'' zdefiniowanej jak wyżej.
* Koszt korzenia drzewa wynosi ''f(n)'', a jego każdego z ''a'' synów
* Ogólniej, dla <math>j<b</math> istnieje <math>a^j</math> węzłów o koszcie <math>f\left(\frac{n}{b^j}\right)</math> oddalonych od korzenia o odległość ''j''.
** Koszt każdego liścia wynosi <math>T(1) = \Theta (1),</math>
Sumując koszty wszystkich poziomów drzewa otrzymamy równanie (*), ponieważ koszt wszystkich
==== Lemat 2 ====
Niech ''a'', ''b'' i ''f'' będą określone jak powyżej. Jeżeli ''g'' jest funkcją określoną dla ''n'' będących potęgami ''b'' w następujący sposób:
:: <math>g(n) = \sum_{j = 0}^{\log_bn-1} a^j\cdot f\left(\frac{n}{b^j}\right)</math>
To dla ''n'' będących potęgami ''b'' funkcję ''g'' można oszacować:
** Jeżeli <math>f(n) = O(n^{\log_ba-\epsilon})</math> dla pewnej stałej <math>\epsilon > 0,</math>
** Jeżeli <math>f(n) = \Theta(n^{\log_ba}),</math>
** Jeżeli <math>f(n) = \Omega(n^{\log_ba+\epsilon})</math> dla pewnej stałej ε > 0 i jeżeli <math>a\cdot f\left(\frac{n}{b}\right)\leqslant c\cdot f(n)</math> dla pewnej stałej <math>c \in (0,1),</math>
==== Dowód ====
Linia 60:
* <math>T(n) = \Theta (n^{\log_ba}) + \Theta(n^{\log_ba}\cdot \log n) = \Theta(n^{\log_ba}\cdot \log n)</math>
* <math>T(n) = \Theta (n^{\log_ba}) + \Theta(f(n)) = \Theta(f(n)),</math>
=== Dla dowolnych n ===
Dla dowolnych ''n'' (nie będących potęga ''b'') wartość argumentu <math>\frac{n}{b}
Odpowiednio górne i dolne oszacowanie dla funkcji
Linia 81:
\end{cases}</math>
Wtedy schodzenie w dół rekursji oznacza jej rekurencyjne wywoływanie kolejno dla argumentów <math>n[0],\ n[1],\ n[2],\
:: <math>T(n) = T\left(\left\lceil \frac{n}{b} \right\rceil\right) = T\left(\left\lceil \frac{\left\lceil \frac{n}{b} \right\rceil }{b} \right\rceil\right) = \cdots
Korzystając z nierówności <math>\left\lceil a \right\rceil \leqslant a + 1</math> mamy:
Linia 89:
* <math>n[2] \leqslant \frac{n}{b^2} + \frac{1}{b} + 1</math>
* <math>n[3] \leqslant \frac{n}{b^3} + \frac{1}{b^2} + \frac{1}{b} + 1</math>
* <math>\cdots
* <math>n[i] \leqslant \frac{n}{b^i} + \sum_{k = 0}^{i-1} \frac{1}{b^k} < \frac{n}{b^i} + \sum_{k = 0}^
Dla <math>i = \left\lfloor \log_bn \right\rfloor</math>
:: <math>
Oznacza to, że dla wywołań rekursji na poziomie co najmniej <math>n[\left\lfloor \log_bn \right\rfloor ]</math> i większych rozmiar problemu jest stały.
|