Twierdzenie o rekurencji uniwersalnej: Różnice pomiędzy wersjami
[wersja nieprzejrzana] | [wersja nieprzejrzana] |
Usunięta treść Dodana treść
{{integruj|Rekurencja uniwersalna}} |
m WP:SK, drobne techniczne |
||
Linia 2:
'''Twierdzenie o rekurencji uniwersalnej''' jest twierdzeniem matematycznym pozwalającym w łatwy sposób znajdować [[ograniczenie asymptotyczne]] pewnej klasy [[Funkcja (matematyka)|funkcji]] zdefiniowanych [[Rekurencja|rekurencyjnie]].
== Twierdzenie o rekurencji uniwersalnej ==
Jeżeli funkcja <math>\! T(n)</math>, dla <math>\! a\
▲Jeżeli funkcja <math>\! T(n)</math>, dla <math>\! a\ge 1, b>1, n>0</math> i [[funkcja dodatnia|funkcji dodatniej]] <math>\! f</math>, jest zdefiniowana następująco:
▲<math>T(n)=\left\{ \begin{matrix} \ \Theta (1) &: 1\le n < b\\ \ a\cdot
▲T(\frac{n}{b}) + f(n)&:n\ge b \end{matrix} \right.</math>
to:
Linia 14 ⟶ 12:
:* Jeżeli <math>\! f(n) = O(n^{log_ba-\epsilon})</math> dla pewnej stałej <math>\! \epsilon > 0</math>, to <math>\! T(n) = \Theta (n^{log_ba})</math>
:* Jeżeli <math>\! f(n) = \Theta(n^{log_ba})</math>, to <math>\! T(n) = \Theta (n^{log_ba}\cdot \lg\ n)</math>
:* Jeżeli <math>\! f(n) = \Omega(n^{log_ba+\epsilon})</math> dla pewnej stałej ε > 0 i jeżeli <math>\! a\cdot f(\frac{n}{b})\
Tak zdefiniowane funcje ''T'' stanowią pewien schemat działania algorytmów typu "[[dziel i zwyciężaj]]" - problem o rozmiarze <math>\! n</math> dzielony jest na <math>\! a</math> podproblemów, każdy wielkości <math>\! \frac{n}{b}</math>, funkcja <math>\! f</math> przedstawia koszt dzielenia problemu, oraz połączenia rozwiązań podproblemów.
== 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 "większa". Gdy znana jest odpowiedź na to pytanie, automatycznie znane jest asymptotyczne ograniczenie danej rekursji - jest nią owa "większa funkcja".
== "Dziury" rekurencji uniwersalnej ==
Należy zdawać sobie sprawę, że twierdzenie o rekurencji uniwersalnej nie wyczerpuje wszystkich przypadków, nawet rekursji "typu" <math>\! T(\frac{n}{b}) + f(n)</math> - pomiędzy przypadkami twierdzenia istnieją "dziury". W pierwszym przypadku funkcja ''f'' musi być '''wielomianowo''' mniejsza od <math>\! n^{log_ba}</math>. W trzecim przypadku oprócz '''wielomianowej''' mniejszości wymagana jest pewna "regularność", "gładkość" funkcji. Jeżeli funkcja ''f'' należy do którejś z tych funkcji dla których nie ma "wielomianowej różnicy", to twierdzenie o rekursji uniwersalnej nie pozwala znaleźć asymptotycznego oszacowania rekursji.
== Dowód twierdzenia o rekurencji uniwersalnej ==
=== Dla n będących potęgą b ===
Niech ''n'' będzie [[potęga (matematyka)|potęgą]] liczby rzeczywistej ''b'', takiej, że <math>b>1</math>
==== Lemat 1 ====
Niech zmienne ''a'', ''b'' i funkcja ''f'' będą zdefinowane jak powyżej. Jeśli dla pewnej dodatniej liczby całkowitej ''i'' funkcja ''T'' jest zdefinowana następująco:
: <math>T(n)=\left\{ \begin{matrix} \ \Theta (1) &: n\ =\ 1 \\ \ a\cdot
T(\frac{n}{b}) + f(n)&:n\ =\ b^i \end{matrix} \right.</math>
to
: <math>\! T(n)\ =\ \Theta (n^{log_ba})\ +\ \sum_{j = 0}^{\log_bn-1} a^j\cdot f(\frac{n}{b^j})</math> (*)
===== Dowód =====
Rozważmy [[drzewo rekursji]] funkcji ''T'' zdefiniowanej jak wyżej.
Linia 44 ⟶ 42:
* Ogólniej, dla <math>j<b</math> istnieje <math>\! a^j</math> węzłów o koszcie <math>\! f(\frac{n}{b^j})</math> oddalonych od korzenia o odległość ''j''.
** Koszt każdego liścia wynosi <math>\! T(1)\ =\ \Theta (1)</math>, a ponieważ <math>\! \frac{n}{b^{log_bn}}\ =\ 1</math> to każdy liść znajduje się na głębokości <math>\! log_bn</math>. Drzewo rekursji posiada <math>\! a^{log_bn}\ =\ n^{log_ba}</math> liści.
Sumując koszty wszystkich poziomów drzewa otrzymamy równanie (*), ponieważ koszt wszystkich "poziomów" węzłów właściwych (tj. nie będących liśćmi) wynosi <math> \sum_{j = 0}^{\log_bn-1} a^j\cdot f(\frac{n}{b^j})</math> a koszt liści to <math>\! \Theta (n^{log_ba})</math>
==== 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(\frac{n}{b^j})</math>
To dla ''n'' będących potęgami ''b'' funkcję ''g'' można oszacować:
Linia 57 ⟶ 55:
:* Jeżeli <math>\! f(n) = O(n^{log_ba-\epsilon})</math> dla pewnej stałej <math>\! \epsilon > 0</math>, to <math>\! g(n) = \Theta (n^{log_ba})</math>
:* Jeżeli <math>\! f(n) = \Theta(n^{log_ba})</math>, to <math>\! g(n) = \Theta (n^{log_ba}\cdot \ln\ n)</math>
:* Jeżeli <math>\! f(n) = \Omega(n^{log_ba+\epsilon})</math> dla pewnej stałej ε > 0 i jeżeli <math>\! a\cdot f(\frac{n}{b})\
=====Dowód=====▼
===== Dowód =====
Korzystając z oszacowania z lematu 2 dla sumy (*). Dla kolenych przypadków z lematu 2 zachodzi:
* <math>\! T(n)\ =\ \Theta (n^{log_ba})\ +\ O(n^{log_ba})\ =\ \Theta(n^{log_ba})</math>
* <math>\! T(n)
* <math>\! T(n)
=== Dla dowolnych n ===
Dla dowolnych ''n'' (nie będących potęga ''b'') wartość argumentu <math>\! \frac{n}{b} </math> może oznaczać <math>\left\lfloor \frac{n}{b} \right\rfloor</math> lub <math>\left\lceil\frac{n}{b} \right\rceil</math>.
Odpowiednio górne i dolne oszacowanie dla funkcji
:: <math>\! T(n)
i
:: <math>\! T(n)
jest banalne do znalezienia, przy wykorzystaniu własności <math>\! \left\lfloor \frac{n}{b} \right\rfloor \
Równanie rekurencyjne można oszacować z góry w następujący sposób:
Linia 92 ⟶ 89:
Wtedy schodzenie w dół rekursji oznacza jej rekurencyjne wywoływanie kolejno dla argumentów <math>\! n[0],\ n[1],\ n[2],\ \cdots</math>
:: <math>\! T(n)
Korzystając z nierówności <math>\left\lceil a \right\rceil \
* <math>n[0] \
* <math>n[1] \
* <math>n[2] \
* <math>n[3] \
* <math>\cdots </math>
* <math>n[i] \
Dla <math>i
: <math>\! n[i]
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.
|