Twierdzenie główne jest narzędziem służącym do rozwiązywania relacji powtarzalności, które powstają w analizie algorytmów dziel i zwyciężaj. Twierdzenie główne zapewnia systematyczny sposób rozwiązywania relacji powtarzalności w postaci:
T(n) = aT(n/b) + f(n)
- gdzie a, b i f(n) są funkcjami dodatnimi, a n jest wielkością problemu. Twierdzenie Główne dostarcza warunków rozwiązania powtarzania się w postaci O(n^k) dla pewnej stałej k i podaje wzór na określenie wartości k.
- Zaawansowana wersja Twierdzenia Głównego zapewnia bardziej ogólną formę twierdzenia, która może obsługiwać relacje powtarzania, które są bardziej złożone niż forma podstawowa. Zaawansowana wersja twierdzenia głównego może obsługiwać powtarzające się terminy z wieloma terminami i bardziej złożonymi funkcjami.
- Należy zauważyć, że Główne Twierdzenie nie ma zastosowania do wszystkich relacji rekurencyjnych i nie zawsze może zapewnić dokładne rozwiązanie danej rekurencji. Jest to jednak przydatne narzędzie do analizy złożoności czasowej algorytmów dziel i zwyciężaj i stanowi dobry punkt wyjścia do rozwiązywania bardziej złożonych powtórzeń.
Twierdzenie główne służy do wyznaczania czasu działania algorytmów (algorytmów dziel i zwyciężaj) w kategoriach notacji asymptotycznej.
Rozważmy problem, który można rozwiązać za pomocą rekurencji.
function f (input x size n) if (n else divide x into a subproblems of size n/b call f recursively to solve each subproblem Combine the results of all sub-problems>
Powyższy algorytm dzieli problem na A podproblemów, każdy o rozmiarze n/b, i rozwiązuj je rekurencyjnie, aby obliczyć problem, a dodatkową pracę wykonaną dla problemu wyraża się przez f(n), tj. czas na utworzenie podproblemów i połączenie ich wyników w powyższej procedurze.
Zatem zgodnie z twierdzeniem głównym czas wykonania powyższego algorytmu można wyrazić jako:
T(n) = aT(n/b) + f(n)>
gdzie n = rozmiar problemu
a = liczba podproblemów w rekurencji i a>= 1
n/b = rozmiar każdego podproblemu
f(n) = koszt pracy wykonanej poza wywołaniami rekurencyjnymi, taki jak podział na podproblemy i koszt połączenia ich w celu uzyskania rozwiązania.
Nie wszystkie relacje rekurencji można rozwiązać za pomocą twierdzenia głównego, tj. Jeśli
- T(n) nie jest monotoniczne, np.: T(n) = sin n
- f(n) nie jest wielomianem, np.: T(n) = 2T(n/2) + 2N
Twierdzenie to jest zaawansowaną wersją twierdzenia głównego, którego można użyć do określenia czasu działania algorytmów dziel i zwyciężaj, jeśli powtarzalność ma następującą postać: -

gdzie n = rozmiar problemu
a = liczba podproblemów w rekurencji i a>= 1
n/b = rozmiar każdego podproblemu
b> 1, k>= 0 i p jest liczbą rzeczywistą.
Następnie,
- jeśli a> bk, wówczas T(n) = θ(ndziennikBA)
- jeśli a = bk, Następnie
(a) jeśli p> -1, to T(n) = θ(ndziennikBAdziennikp+1N)
(b) jeśli p = -1, to T(n) = θ(ndziennikBAzaloguj się)
(c) jeśli p <-1, to T(n) = θ(ndziennikBA)
- Jeśli k., zatem
(a) jeśli p>= 0, to T(n) = θ(nkdziennikPN)
(b) jeśli p < 0, to T(n) = θ(nk)
Analiza złożoności czasu –
- Przykład 1: Wyszukiwanie binarne – T(n) = T(n/2) + O(1)
a = 1, b = 2, k = 0 i p = 0
Bk= 1. Zatem a = bkoraz p> -1 [Przypadek 2.(a)]
T(n) = θ(ndziennikBAdziennikp+1N)
T(n) = θ(logn) Przykład-2: Sortowanie przez scalanie – T(n) = 2T(n/2) + O(n)
a = 2, b = 2, k = 1, p = 0
Bk= 2. Zatem a = bkoraz p> -1 [Przypadek 2.(a)]
T(n) = θ(ndziennikBAdziennikp+1N)
T(n) = θ(nlogn) Przykład-3: T(n) = 3T(n/2) + n2
a = 3, b = 2, k = 2, p = 0
Bk= 4. Zatem a k i p = 0 [Przypadek 3.(a)]
T(n) = θ(nkdziennikPN)
T(n) = θ(n2)
Przykład-4: T(n) = 3T(n/2) + log2N
a = 3, b = 2, k = 0, p = 2
Bk= 1. Zatem a> bk[Przypadek 1]
T(n) = θ(ndziennikBA)
T(n) = θ(ndziennik23)
Przykład 5: T(n) = 2T(n/2) + nlog2N
a = 2, b = 2, k = 1, p = 2
Bk= 2. Zatem a = bk[Przypadek 2.(a)]
T(n) = θ(ndziennikBAdziennikp+1N )
T(n) = θ(ndziennik22dziennik3N)
T(n) = θ(nlog3N)
Przykład 6: T(n) = 2NT(n/2) + nN
Tego powtarzania nie można rozwiązać powyższą metodą, ponieważ funkcja nie ma postaci T(n) = aT(n/b) + θ(nkdziennikPN)
Pytania praktyczne GATE –
- GATE-CS-2017 (zestaw 2) | Pytanie 56
- Brama IT 2008 | Pytanie 42
- BRAMA CS 2009 | Pytanie 35
Oto kilka ważnych punktów, o których należy pamiętać w związku z Twierdzeniem Głównym:
- Dziel i zwyciężaj nawroty: Główne twierdzenie zostało specjalnie zaprojektowane do rozwiązywania relacji powtarzania, które powstają w analizie algorytmów dziel i zwyciężaj.
- Forma rekurencji: Główne twierdzenie ma zastosowanie do relacji rekurencji w postaci T(n) = aT(n/b) + f(n), gdzie a, b i f(n) są funkcjami dodatnimi, a n jest wielkością problemu.
- Złożoność czasowa: Główne Twierdzenie zapewnia warunki rozwiązania powtarzania się w postaci O(n^k) dla pewnej stałej k i podaje wzór na określenie wartości k.
- Wersja zaawansowana: Zaawansowana wersja Głównego Twierdzenia zapewnia bardziej ogólną formę twierdzenia, która może obsługiwać relacje powtarzania, które są bardziej złożone niż forma podstawowa.
- Ograniczenia: Główne Twierdzenie nie ma zastosowania do wszystkich relacji rekurencji i nie zawsze może zapewnić dokładne rozwiązanie danej rekurencji.
- Przydatne narzędzie: Pomimo swoich ograniczeń, Twierdzenie Główne jest użytecznym narzędziem do analizy złożoności czasowej algorytmów dziel i zwyciężaj i stanowi dobry punkt wyjścia do rozwiązywania bardziej złożonych powtórzeń.
- Uzupełnione innymi technikami: W niektórych przypadkach twierdzenie główne może wymagać uzupełnienia innymi technikami, takimi jak metoda podstawienia lub metoda iteracji, aby całkowicie rozwiązać daną relację powtarzania.