Analiza Algorytmów Moduł 3 Rekurencje Aleksandra Orpel Spis treści 1 Rekurencja - rozwiazania dokładne 2 1.1 Rekurencje pierwszego rzędu... 2 1.2 Rekurencje liniowe wyższych rzędów... 3 2 Rekurencje - oszacowania asymptotyczne 5 3 Algorytmy typu dziel i zwyciężaj 10 4 Sortowanie przez scalanie 12 5 Bibliografia 18 1
1 Rekurencja - rozwiazania dokładne 1.1 Rekurencje pierwszego rzędu Twierdzenie 1. Niech fx n g n2n rekurencji jest nastepuj ac a R. Jawna postać ci agu danego za pomoca a 0 =1 a n = x n a n 1 dla n > 0 a n = Y 1 k n (1) x k dla n > 0. (2) Przykład 1. Podstawiaj ac x n = n, wzór (1) daje a n = n!, natomiast dla x n =2z (1) dostajemy a n =2 n. Twierdzenie 2. Ciag dany za pomoc a rekurencji a 0 =0 a n = y n + a n 1 dla n > 0, gdzie fy n g n2n R, ma nastepuj ac ajawn apostać a n = y k dla n > 0. 1 k n (3) Twierdzenie 3. Niech fx n g n2n i fy n g n2n bedaci agmi liczb rzeczywistych i x n 6=0dla dowolnego n>0. Rozwi azaniem równania rekurencyjnego a 0 =0 (4) a n = y n + x n a n 1 dla n > 0 jest ciag postaci a n = y n + y j x j+1 x j+2... x n (5) dla n>0. 1 j n 1 Dowód. Podzielmy obie strony równości (4) przez iloczyn x 1 x 2...x n 1 x n. Mamy wówczas dla każdego n>0 a n y n a n 1 = +. (6) x 1 x 2... x n 1 x n x 1 x 2... x n 1 x n x 1 x 2... x n 1 Połóżmy b 0 =0 a b n = n x 1 x 2 ::: x n 1 x n dla n > 0 2
i y n z n = dla dowolnego n 2 N. x 1 x 2... x n 1 x n Równość (6)można zapisać wpostaci b n = z n + b n 1 dla n>0. Korzystajac z twierdzenia 2 mamy b n = z k = y k. x 1 x 2... x k 1 x k Stad 1 k n 1 k n a n = x 1 x 2... x n 1 x n 1 k n = x 1 x 2... x n 1 x n y k x 1 x 2... x k 1 x k 1 k n y k x 1 x 2...x k 1 x k y n + y k x k+1 x k+2... x n 1 x n. 1 k n 1.2 Rekurencje liniowe wyższych rzędów Twierdzenie 4. (O rozwiazaniach rekurencji liniowych, jednorodnych ze stałymi współczynnikami) Ogół rozwiazań rekurencji postaci a n = x 1 a n 1 + x 2 a n 2 +... + x t a n t dla n t (7) ( x t 6=0)jestdanyjakoliniowakombinacja(owspółczynnikach zależnych od warunków poczatkowych a 0,a 1,..., a t ) wyrażeń n j β n, 0 j<v, gdzie - β jest pierwiastkiem nastepuj acego wielomianu q(z) =z t x 1 z t 1 x 2 z t 2... x t (8) - v jest krotnościa pierwiastka β. Wielomian q nazywamy wielomianem charakterystycznym równania rekurencyjnego (7), natomiast ciagi n j β nª n2n, gdzie 0 j<v, jego rozwiazaniami szczególnymi. (Oczywiście β może być pierwiastkiem zespolonym). 3
Uwaga: Rozwiazanie jawne rekurencji (7) jest zdeterminowane przez warunki poczatkowe, z których wyznaczamy współczynniki liniowej kombinacji opisujacej ogół rozwiazań. W pewnych przypadkach właśnie od wartości poczatkowych zależy rodzaj otrzymanego rozwiazania. Majac tę sam azależność rekurencyjna izmieniaj ac tylko warunki poczatkowe możemy zmienić charakter rozwiazania, uzyskujac ciag stały, wykładniczy lub naprzemienny. Dzieje się tak na przykład wtedy, gdy niektóre współczynniki znikaja lub gdy pierwiastki wielomianu charaktery maja tesamemoduły. Jak duży wpływ na ostatecznapostaćci agu fa n g n2n maja wartości poczatkowe a 0,..., a t 1 pokazuje przykład opisany w punkcie (d) Zadania 2. Rozważymy teraz rekursję, która uzyskujemy z (7) dodajac do prawej strony wzoru ciag fb n g n2n. Otrzymana w ten sposób rekurencja nazywa się niejednorodna. Wyznaczajac jej rozwiazanie będziemy wykorzystywać twierdzenie 4. Istotnym problemem, który pojawia się wówczas, jest znalezienie rozwiazania szczególnego rekurencji niejednorodnej. W przypadku, gdy fb n g n2n jest ciagiem stałym, można podać proste procedury pozwalajace wyznaczyć takie rozwiazanie. Twierdzenie 5. (O istnieniu rozwiazania równania niejednorodnego) Ogół rozwiazań rekurencji postaci a n = x 1 a n 1 + x 2 a n 2 +... + x t a n t + b dla n t (9) jest sumaogółurozwi azań równania (7) oraz rozwi azania szczególnego równania (9). Twierdzenie 6. (O postaci rozwiazania szczególnego rekurencji niejednorodnej) 1. Jeżeli P i=1;:::;t x i 6= 1to rozwiazaniem szczególnym jest ciag stały fx n g n2n o wyrazach x n = c, gdzie c = b 1 P i=1;:::;t x. i 2. Jeżeli P i=1;:::;t x i =1i P i=1;:::;t ix i 6= 0to rozwiazaniem szczególnym jest ciag fcng n2n, gdzie b c = P i=1;:::;t ix. i 3. Ogólnie: rozwiazaniem szczególnym rekursji niejednorodnej (9) jest ciag fcn m g n2n, gdzie m jest pewnaliczb anaturaln amniejsz aodt. (Stała c wyznaczamy podstawiajac wyrazy ciagu do równania (9) 4
2 Rekurencje - oszacowania asymptotyczne Przedstawimy trzy metody wyznaczania rozwiazań asymptotycznych rekurencji: metodę podstawiania, iteracyjna oraz metodę opartanatwierdzeniu o rekurencji uniwersalnej. 1. Metoda podstawiania - polega na odgadnięciu oszacowania, a następnie wykazaniu, że jest ono trafne. 2. Metoda iteracyjna - gdzie przekształcamy rekurencję w sumę, a następnie korzystamy z różnych technik szacowania sum. (Obie metody omówimy na przykładach - ćwiczenia do Modułu 3) 3. Metoda rekurencji uniwersalnej - stosowana jest dla rekursji postaci T (n) =at (n/b)+f(n) (10) gdzie a 1, b>1, fjest pewna funkcjanieujemn aokreślona na podzbiorze liczb naturalnych. Rekurencja (10) opisuje czas działania algorytmu, który dzieli problem rozmiaru n na a podproblemów o rozmiarze n/b. Każdy z a podproblemów jest rozwiazywany rekurencyjnie w czasie T (n/b). Koszt dzielenia problemu oraz łaczenia rezultatów częściowych jest opisany funkcja f. Twierdzenie 6. (Twierdzenie o rekurencji uniwersalnej). Zał óżmy, że a 1 i b>1 sastałymi, f jest funkcjaokreślon a na zbiorze liczb naturalnych, a T bedzie ciagiem zdefiniowanym dla liczb całkowitych n 0 wzorem (10), gdzie n/b oznacza bn/bc lub dn/be. Wówczas T (n) może być ograniczony asymptotycznie w nastepuj acy sposób: 1. jeżeli istnieje ε>0 takie, że f(n) =O(n log b a " ), to T (n) =Θ(n log b a ); 2. jeżeli f(n) =Θ(n log b a ), to T (n) =Θ(n log b a lg n); 3. jeżeli istnieje ε>0takie, że f(n) =Ω(n log b a+" ) ijeśli dodatkowo istnieje stała 0 <c<1 taka, że dla dostatecznie dużych n 2 N ( n b) zachodzi nastepuj acy warunek (zwany warunkiem regularności) to T (n) =Θ(f(n)). af(n/b) cf(n), Dowód: Pierwsza część dowoduzawiera analizę zależności rekurencyjnej przy założeniu, że n jest potęga liczby b > 1, gdzie b niekoniecznie jest liczba całkowita. Dowód ten przeprowadzimy w trzech etapach, w których zakładamy, 5
że a 1, b>1 i f jest pewna funkcjanieujemn azdefiniowanadladokładnych potęg b oraz Θ(1) dla n =1 T (n) = at (n/b)+f(n) dla n = b i (11), gdzie i 1. Etap 1. Wykażemy, że T (n) =Θ(n log b a )+ log b n 1 a j f(n/b j ). (12) W tym celu przekształcimy rekurencję wsumęzapomoca odpowiedniej liczby (równej log b n) iteracji wzoru (11): T (n) =f(n)+at (n/b) =f(n)+af(n/b)+a 2 T (n/b 2 )= f(n)+af(n/b)+a 2 f(n)+a 3 f(n/b 3 )+... + a log b n 1 f(n/b log b n 1 )+a log b n T (1). Biorac pod uwagę równości a log b n = n log b a oraz T (1) = Θ(1) iwłasności notacji Θ, otrzymujemy a log b n T (1) = Θ n log b a. Ostatecznie uzyskujemy zależność (12). Etap 2. Rozważmy funkcję g: n 2 N,istnieje j 2 N takie, że n = b jª! R zdefiniowananastępuj aco: g(n) = log b n 1 a j f(n/b j ). (13) Pokażemy, że może ona być ograniczona asymptotycznie dla dokładnych potęg b w jeden z poniższych sposobów: A-jeżeli f(n) =O(n log b a " ) dla pewnej stałej ε>0, to g(n) =O(n log b a ); B-jeżeli f(n) =Θ(n log b a ), to g(n) =Θ(n log b a lg n); C -jeżeli af(n/b) cf(n) dla pewnej stałej c<1iwszystkichn b, to g(n) =Θ(f(n)). Istotnie; w³ przypadku A zzałożenia dotyczacego funkcji f wnioskujemy, iż f( n b )=O n logb j b a ", co,wobecdefinicji g, daje j à logb! n 1 ³ n g(n) =O a j logb a ". (14) b j Jednocześnie prawdziwy jest ciag równości log b n 1 ³ log a j n logb a " b n 1 µ = n log b a " ab " b j 6 b log b a j = n log b a " log b n 1 (b " ) j
µ µ = n log b a " 1 b " log b n = n log 1 b " b a " n " 1. b " 1 Z uwagi na fakt, iż b i ε sastałymi, ostatnie wyrażenie redukuje siędon log b a " O (n " ). Ostatecznie uzyskujemy żadan a równość: W przypadku B mamy f( n b j )=Θ ³ n b j logb a, zatem g(n) =Θ g(n) =O(n log b a ). (15) Ã logb n 1 Postępujac jak poprzednio, uzyskujemy log b n 1 a j ³ n b j log b a = n log b a log b n 1 a j ³ n b j log b a! ³ log a j b n 1 b log b a = n log b a. 1=n log b a log b n idalej g(n) =Θ n log b a log b n = Θ n log b a lg n. W przypadku C należy najpierw zauważyć, że definicja funkcji g implikuje oszacowanie g(n) =Ω(f(n)) dla dokładnych potęg b. Jednocześnie założony warunek regularności implikuje, iż dlakażdego j =0, 1,..., log b n zachodzi a j f(n/b j ) c j f(n). (16) (Indukcyjny dowód tego faktu pozostawiamy jako ćwiczenie). Korzystajac z (16), możemy oszacować z góry g(n) wnastępujacy sposób g(n) log b n 1 ³ n a j f b j log b n 1 c j f (n) f(n) 1 c j = f(n) 1 c = O(f(n)). Etap 3. Biorac pod uwagę zależność (15), obliczamy sumę (12) dla pierwszego przypadku twierdzenia: W przypadku 2. otrzymujemy T (n) =Θ(n log b a )+O(n log b a )=Θ(n log b a ). T (n) =Θ(n log b a )+Θ(n log b a lg n) =Θ(n log b a lg n). W ostatnim przypadku mamy T (n) =Θ(n log b a )+Θ(f(n)), 7
co wobec założenia f(n) =Ω(n log b a+" ) przy pewnym ε>0, pozwala orzec, iż T (n) =Θ(f(n)). To kończy dowód dla dokładnych potęg b. Druga część dowodu,będzie rozszerzeniem powyższej analizy na przypadek dowolnych liczb naturalnych. W tej sytuacji w rekurencji pojawiasię funkcje sufitu lub podłogi. Zauważmy, że otrzymanie dolnego oszacowania dla T (n) =at (dn/be)+f(n) (17) lub górnego dla T (n) =at (bn/bc)+f(n) (18) wynika bezpośrednio z własności funkcji podłogiisufitu ( n b n b n b ). Na istotne trudności napotykamy dopiero wtedy, gdy próbujemy uzyskać górne oszacowanie dla (17) i dolne dla (18). Omówimy jedynie pierwszy z problemów, ponieważ analiza drugiego z nich jest analogiczna. Główna idea dowodu jest oczywiście taka sama, jak dla dokładnych potęg b, ztaróżnic a, że pojawiaja się nieco bardziej pracochłonne rachunki. Przedstawimy zatem tylko kluczowe elementy dowodu. Etap 1. Zauważmy, że iterujac rekurencję (17) uzyskujemy ciag rekurencyjnych wywołań dla argumentów n, dn/be, ddn/be /be, dddn/be /be /be,... itd. Dla wygody oznaczmy i. element tego ciagu przez przez n i, gdzie n gdy i =0 n i = dn i 1 /be gdy i > 0. Zpowyższej definicji i własności funkcji sufitu (dxe < x +1) uzyskujemy oszacowanie n i n b + i 1 1 i b n j b + b (19) i b 1 dla dowolnego i>0. Podobnie jak w etapie 1. pierwszej części dowodu przekształcamy rekurencję wsumę, wielokrotnie stosujac wzór (17), przy czym kończymy iterację dlai 0 = blog b nc. (Wówczas n i0 b + b b 1.) Stad mamy T (n) =f(n 0 )+at (n 1 )=f(n 0 )+af(n 1 )+a 2 T (n 2 ) (20) f(n 0 )+af(n 1 )+a 2 f(n 2 )+... + a blog b nc 1 f(n blogb nc 1)+a blog b nc T (n blogb nc) = Θ(n log b a )+ blog b nc 1 a j f(n j ). W ten sposób otrzymujemy dla dowolnych liczb naturalnych n zależność podobna do (12). 8
Etap 2. Możemy teraz oszacować sumę g(n) = blog b nc 1 a j f(n j ) wkażdym z trzech omawianych w twierdzeniu przypadków, w zależności od warunków nałożonych na f. Rozważmy przypadek pierwszy, gdy dla pewnej liczby ε>0 f(n) =O(n log b a " ). Wówczas dla każdego 0 j blog b nc istnieje stała c > 0 taka, że dla dostatecznie dużych n zachodzi µ n c b + b j b 1 ³ µ µ n logb a " b j b = c 1+ b j n b 1 logb a " b c b 1 f(n j ) cn log b a " j logb a " logb a " (21) µ µ µ µ n log b a " b j = c 1+ 1+ b logb a " n log b a " a j b "j n b 1 a j b, "j (przy czym druga nierówność wynika z (19), natomiast ostatnie przejście jest konsekwencja nierówności j blog b nc). Oznacza to f(n j )=O( nlog b a " ). a j b "j Podobnie postępujemy, gdy f(n) =Θ(n log b a ) (przypadek drugi twierdzenia). Wykonujac oszacowania analogiczne do (21) (pomijamy ε i wykorzystujemy własności notacji Θ), pokazujemy, że f(n j )=O( nlog b a ). a j W przypadku trzecim należy zauważyć, że z warunku regularności: af(dn/be) cf(n) dla n>b+ b/(b 1) przy stałej 0 <c<1, wynika a j f(n j ) c j f(n) dla j =0, 1,..., blog b nc, co wykazujemy tak, jak w pierwszej części dowodu. Wykorzystujac powyższe wyniki możemy sumę g(n) odpowiednio oszacować i wyznaczyć rozwiazanie T jak dla dokładnych potęg b. Uwaga: Istotne jest, że w każdym z trzech przypadków porównujemy funkcję f z funkcja testujac a n 7! n log b a. Intuicyjnie na podstawie tezy twierdzenia możemy powiedzieć, że rozwiazanie zależy od większej z nich. W pierwszym przypadku funkcja f nie tylko musi być mniejsza od funkcji testujacej, ale musi być odniejwielomianowo mniejsza, tj. musi istnieć taka liczba ε>0, że f jest mniejsza od funkcji testujacej o czynnik n ". W trzecim przypadku funkcja f nie tylko musi być większa od funkcji testujacej, ale musi być odniej 9
wielomianowo większa oraz spełniać dodatkowy warunek regularności, który zachodzi dla większości wielomianowo ograniczonych funkcji. Uwaga: Warto zauważyć, że warunek regularności implikuje istnienie liczby ε > 0 takiej, że f(n) = Ω n log b a+" Mimo to w sformułowaniu trzeciego przypadku twierdzenia o rekurencji uniwersalnej występuje powyższa równość, gdyż upraszcza ona wstępna klasyfikację badanej rekurencji (patrz poprzednia uwaga). Uwaga: Trzy przypadki opisane w twierdzeniu o rekurencji uniwersalnej nie wyczerpuja wszystkich możliwych relacji między f a funkcja testujac a. Jest luka między przypadkiem 1 i 2, kiedy to f jest mniejsza od funkcji testujacej, ale nie jest mniejsza wielomianowo. Podobnie dla przypadków 2 i 3, istnieja rekurencje typu (10), w których funkcja f jest większa od n 7! n log b a, ale nie wielomianowo. Wobec tego, gdy f wpada w jednaztychlukniemożemy stosować twierdzenia o rekurencji uniwersalnej. Wówczas pozostajanammetody iteracyjna i podstawiania. Możemy także starać się oszacować rekurencję zgóry lub z dołu w ten sposób, aby otrzymać rekurencję, która można już rozwiazaćza pomoca jednego z przypadków twierdzenia 6. Należy jednak pamiętać, że wtedy otrzymujemy górne lub dolne oszaconie rozwiazania wyjściowej rekurencji. Przykład 2. Pokażemy, że dla rekurencji T (n) =2T (n/2) + n log 2 n nie można zastosować powyższego twierdzenia. Istotnie; kładac a = b =2mamy następujac a funkcję testuj aca n 7! n log b a = n. Jednocześnie f(n) =n log 2 n. Ponieważ f jest asymptotycznie większa od funkcji n 7! n log b a, więc może się wydawać, że stosować będziemy przypadek 3. Przypuśćmy zatem, że istnieje ε>0 takie, że f(n) =Ω(n 1+" ), co oznacza istnienie liczby A>0 spełniajacej relację f(n) n 1+" dla dostatecznie dużych n 2 N idalej log 2 n n " dla dostatecznie dużych n 2 N. To jednak przeczy równości lim Zatem przykład ten wpada w lukę między przypadkami 2 i 3. n!1 log 2 n n " =0. twierdzenie 2. Przyjmujac oznaczenia twierdzenia 6, można wykazać, że z warunku regularności wynika istnienie ε>0, dla którego zachodzi oszacowanie f(n) =Ω(n log b a+" ). 3 Algorytmy typu dziel i zwyciężaj Metoda dziel i zwyciężaj" polega na podziale problemu na kilka mniejszych podproblemów (tj. podproblemów o mniejszych rozmiarach danych wejściowych) 10
podobnych do pierwotnego. Podproblemy te sa rozwiazywane rekurencyjnie, a następnie ich rozwiazania sa łaczone w celu uzyskania rozwiazania wyjściowego problemu. W podejściu dziel i zwyciężaj każdy poziom rekursji składa się z następujacych etapów: Dziel: Dzielimy problem na podproblemy. Zwyciężaj: Rozwiazujemy podproblemy rekurencyjnie, chyba, że saonetak małego rozmiaru, że nie wymagaja zastosowania rekursji - używamy wtedy metod bezpośrednich. Połacz: Łaczymy rozwiazania podproblemów, aby otrzymać rozwiazanie problemu wyjściowego. Wobec powyższego analiza czasu działania algorytmów opartych na metodzie dziel i zwyciężaj polega na ocenie złożoności czasowej wszystkich trzech etapów. Rozważymy teraz pewien szczególny rodzaj tego typu algorytmów. Niech T (n) oznacza czas działania algorytmu dla problemu o rozmiarze n. Jeśli rozmiar problemu jest wystarczajaco mały n c dla pewnej stałej c, to jego rozwiazanie zajmuje czas stały Θ(1). Załóżmy, że dzielimy problem wyjściowy na a (a 1) podproblemów, każdy o rozmiarze n/b (dokładniej n b lub n b ), gdzie b>1, a,b2 Z. Niech dalej D(n) jest czasem dzielenia problemów na podproblemy, zaś C(n) czasem scalania ich rozwiazań wpełne rozwiazanie oryginalnego problemu. Wówczas czas działania takiego algorytmu dany jest następujac a rekurencja: T (n) = Θ(1) gdy n c at ( n b )+f(n) gdy n > c, (22) dla f(n) = C(n) +D(n). Jak pamiętamy twierdzenie 1 (wykład 4) podaje metodę rozwiazania tego typu rekurencji. Przeanalizujmy drzewo rekursji (22), aby pokazać, jakich algorytmów dotycza poszczególne przypadki opisane w twierdzeniu o rekurencji uniwersalnej. 11
Zauważmy, że funkcja n! n log b a informuje o liczbie podproblemów o najmniejszym rozmiarze, a zatem, wobec przyjętych założeń, algorytm potrzebuje n log b a Θ(1) jednostek czasu, aby rozwiazać wszystkietepodproblemy.funkcja f reprezentuje czas podziału problemu na podproblemy i łaczenie ich rozwiazań w rozwiazanie problemu wyjściowego. Stad przypadek pierwszy twierdzenia o rekurencji uniwersalnej (f(n) = O(n log b a " ), dla pewnego ε > 0) obejmuje algorytmy, w których koszt rozwiazania podproblemów o rozmiarach n<c,jest wielomianowo większy niż połaczone koszty etapów I-Dzieli III - Połacz algotytmu. Odwrotna sytuację opisuje punkt 3. twierdzenia, tam funkcja f jest co najmniej rzędu niż n log b a+", przy pewnym ε>0. Jeśli zaś koszt wszystkich etapów jest tego samego rzędu (rozkłada się on równomiernie po wszytkich poziomach drzewa rekursji), to złożoność czasowa algorytmu jest opisana przez przypadek 2. twierdzenia o rekurencji uniwersalnej. 4 Sortowanie przez scalanie Algorytm sortowania przez scalanie (łaczenie) jest przykładem zastosowania metody "dziel i zwyciężaj", wobec tego jego działanie można opisać zapomoca schematu charakterystycznego dla tego podejścia: Dziel Dzielimy n -elementowyci ag na dwa podciagi o rozmiarach, odpowiednio bn/2c i dn/2e każdy. Zwyciężaj Sortujemy otrzymane podciagi, używajac rekurencyjnie sortowania 12
przez scalanie. Połacz Łaczymy posortowane podciagi w jeden posortowany ciag. (Mechanizm rekursji nie uruchamia się, gdy ciag przeznaczony do sortowania ma długość 1.) Zapiszemy teraz badany algorytm nieco dokładniej, wykorzystujac przyjęty pseudojęzyk Mergesort(l, r : naturalne) Dane wejściowe: ciag elementów a =[a[l],..., a[r]], której bedziemy sortować; Dane wyjściowe: ciag [a[i 1 ],..., a[i r l+1 ]], bed acy permutacjaci agu a, spełniajac a warunek a[i 1 ] a[i 2 ]... a[i r l+1 ]; var i,j,k,m: naturalne begin if r l>0 then begin m := (r + l)div2; Mergesort(l, m); Mergesort(m +1,r); for i := 1 to m l +1do b[i] :=a[l + i 1]; for j:=m+1 to r do c[j-m]:=a[j]; i:=1;j:=1; b[m+1]:=max; c[r-m+1]:=max; 13
end; end. for k:=l to r do if b[i]<c[j] then begin a[k]:=b[i]; i:=i+1;end; else begin a[k]:=c[j]; j:=j+1; end; Chcac posortować cała tablicę a = [a[1],..., a[n]], wywołujemy Mergesort dla l =1ir = n. Wpowyższym zapisie występuje zmienna max, która jest największa z liczb w ustalonej reprezentacji liczb całkowitych. Wprowadzenie jej pozwoliło uniknać testu końca tablic b i c. Analizę powyższego algorytmu rozpoczniemy od wyznaczenia rzędu złożoności czasowej. Twierdzenie 7. Procedura Mergesort dla ciagu n - elementowego działa w czasie Θ(n lg n). Dowód: Niech T (n) oznacza czas potrzebny do posortowania n -elementowego ciagu. Zgodnie ze schematem "dziel i zwyciężaj" musimy zbadać, ile czasu potrzebanarealizację poszczególnych etapów: Dziel: Wyznaczenie środka przedziału - punktu podziału n+1 2 -zajmuje czas stały D(n) =Θ(1). Zwyciężaj: Rozwiazujemy rekurencyjnie dwa problemy każdy rozmiaru n/2 ( bn/2c lub dn/2e),co zajmuje czas 2T (n/2). Połacz: Procedura łaczenia działa w czasie C(n) =Θ(n) -trzypętle wykonuj ace co najwyżej n przebiegów każda. Przyjmujac, że sortowanie tablicy jednoelementowej odbywa się w czasie stałym Θ(1), uzyskujemy następujac a zależność rekurencyjna określajac a złożoność czasowa algorytmu Mergesort Θ(1) gdy n =1 T (n) = 2T ( n 2 )+C(n)+D(n) gdy n > 1 idalej T (n) = Θ(1) gdy n =1 2T ( n 2 )+Θ(n) gdy n > 1. 14
Kładac a =2, b =2if(n) =D(n) +C(n) =Θ(n) i korzystajac z punktu drugiego twierdzenia o rekurencji uniwersalnej mamy T (n) =Θ(n lg 2 lg n) =Θ(n lg n). Stwierdziliśmy już, że złożoność czasowa Mergesort jest rzędu liniowo-logarytmicznego. Nie zadowolimy się jeszcze ta informacja, gdyżniewiemy, jakiwspółczynnik kryje sięwnotacjiθ,może to być 2,3,4 wówczas otrzymany wynik odzwieciedla zachowanie algorytmu dla większości n. Jednak powyższa analiza nie pozwala nam wykluczyć przypadku, gdy współczynnik jest równy 10 20, 10 30, itd. Wtedy możemy powiedzieć, że czas działania jest liniowo-logarytmiczny tylko dla danych wejściowych o gigantycznych rozmiarach. Aby zbadać, jak jest w rzeczywistości, zajmijmy się ocena dokładnej liczby operacji dominujacych - porównań elementów ciagu sortowanego - wykonywanych przez Mergesort. Twierdzenie 8. Aby posortować n -elementow a tablicęzapomoc a sortowania przez scalanie należy wykonać n logn + O(n) porównań. Dowód: Dla uproszczenia tego dowodu zajmiemy się tylko tymi liczbami naturalnymi, które sa potęgami liczby 2. Niech C(n) oznacza liczbę porównań wykonywanych przez Mergesort przy sortowaniu n - elementowej tablicy. Wówczas liczba porównań wykonywanych w rekurencyjnych wywołaniach procedury po pierwszym podziale - sortowanie tablic dn/2e i bn/2c elemetowej - jest równa, odpowiednio C(dn/2e) oraz C(bn/2c). Liczba porównań wykonywanych w celu scalenia wynosi n - jedno dla każdej wartości k =1,..., n. Zatem całkowita liczba operacji dominujacych dana jest za pomoca rekurencji C(dn/2e)+C(bn/2c)+n dla n 2 C(n) = (23) 0 dla n =1. Ponieważ roważamy jedynie liczby naturalne n postaci n =2 k, dla pewnego k 2 N, rekurencję (23) możemy zapisać wnastępujacej formie 2C(2 C(2 k )= k 1 )+2 k dla k 1 0 dla k =0. Dzielac obie strony przez 2 k dostajemy C(2 k ) = C(2k 1 ) +1. 2 k 2 k 1 Iterujac k-krotnie powyższy wzór mamy C(2 k ) = C(2k 1 ) +1= C(2k 2 ) +2= C(2k 3 ) +3=... = C(20 ) + k = k, 2 k 2 k 1 2 k 2 2 k 3 2 0 15
co oznacza, że dla n =2 k rozwiazanie powyższej rekurencji jest C(n) =n log 2 n. W przypadku, gdy n jest dowolna liczba naturalna rozwiazanie rekurencji (23) wymaga pewnych dodatkowych obliczeń wykorzystujacych następujacy wzór sumacyjny: Lemat 9. Niech n 2 N. Dla dowolnej liczby naturalnej b 2 zachodzi blog b kc =(n +1)blog b nc bblog b nc+1 b. b 1 1 k n Twierdzenie 10. Dla dowolnego n 2 N liczba porównań wykonywanych przez Mergesort w celu posortowania n elementowej tablicy opisana jest rekurencja (23), której dokładne rozwiazanie ma postać C(n) =n blg nc +2n 2 blg nc+1. (24) Dowód: Wobec analizy przedstawionej w dowodzie twierdzenia 6. wystarczy jedynie wyznaczyć dokładne rozwiazanie rekurencji (23) dla dowolnych n 2 N. Rozważmy pomocniczo ciag 2 dla n =1 D(n) = C(n +1) C(n) dla n 2. Zauważmy, że D(bn/2c)+1 dla n 2 D(n) = 2 dla n =1. Istotnie, dla n parzystych mamy D(n) =C(d(n +1)/2e)+C(b(n +1)/2c)+n +1 C(dn/2e) C(bn/2c) n = C(n/2+1)+C(n/2) + n +1 C(n/2) C(n/2) n C(n/2+1) C(n/2) + 1 = D(bn/2c)+1. Podobnie postępujemy dla n nieparzystych D(n) =C(d(n +1)/2e)+C(b(n +1)/2c)+n +1 C(dn/2e) C(bn/2c) n (25) = C((n +1)/2) + C((n +1)/2) + n +1 C((n +1)/2) C((n 1)/2) n C((n 1)/2+1) C((n 1)/2) + 1 = D(bn/2c)+1. Zaten dla dowolnego n 2 zachodzi wzór (25). Wyznaczymy teraz jawnapostać ciagu D : D(n) =D(bn/2c)+1=D(bbn/2c /2c)+1+1 16
= D( n/2 2 j )+2=... = D( n/2 blg nck )+blg nc = blg nc +2. Stad C(n +1)=C(n)+blg nc +2 dla dowolnych n 1. Iteracja powyższego wzoru (odpowiednie twierdzenie 2 z wykładu o rozwiazaniach dokładnych rekurencji) pozwalajastwierdzić, że n C(n +1)= (blg kc +2) idalej,dlan 2 n 1 n 1 C(n) = (blg kc +2)=2n 2+ blg kc. k=1 k=1 k=1 Korzystajac zlematu3.możemy wyznaczyć wartość sumy n 1 blg kc =(n +1)blg nc 2 blg nc+1 +2 blg nc, k=1 ast ad mamy ostatecznie C(n) =n blg nc +2n 2 blg nc+1. Ćwiczenie 1. Zbadać własności funkcjibędacej rozwiazaniem rekurencji (23). Pokazać, że C(n) =n lg n + nθ(1 flg ng), gdzie θ(x) =1+x 2 x przyjmuje wartości dodatnie w przedziale (0, 1) idodatkowospełnia warunki θ(0) = θ(1) = 0 oraz 0 <θ(x) < 0.087 dla x 2 (0, 1). Rozwiazanie: Podstawiajac blg nc =lgn flg ng do wzoru (24), otrzymujemy C(n) =n lg n nflg ng+2n 2 lg n flg ng+1 1 flg ng = n lg n nflg ng+2n n2 = n lg n + n(2 flg ng 2 1 flg ng )=nlg n + nθ(1 flg ng). Aby uzyskać żadane oszacowanie wystarczy wyznaczyć wartość największa funkcji θ w przedziale [0, 1]. W tym celu wyznaczmy punkty stacjonarne, tzn. miejsca zerowe pochodnej funkcji θ : θ 0 (x) =1 2 x ln 2. 17
Jak łatwo wyliczyć (szczególnie za pomoca dowolnego programu matematycznego rozwiazaniem równania 1 2 x ln(ln 2) ln 2 = 0 jest liczba x 0 = ln 2 (¼ 0.528 77). Ponieważ θ(0) = θ(1) = 0 i θ(x 0 ) ¼ 8.607 1 10 2, wnosimy, że maksymalna wartość funkcji θ w przedziale [0, 1] nie przekracza 0.087, co ilustruje poniższy rysunek y 0.1 0.075 0.05 0.025 0 0 0.25 0.5 0.75 1 Wykres funkcji [0, 1] 3 x! θ(x) x 5 Bibliografia 1. Banachowski L., Diks K., Algorytmy i struktury danych, Wydawnictwo Naukowo-Techniczne, Warszawa 1996. 2. Cormen T.H., E.Leiserson Ch., Rivest R.L., Wprowadzenie do algorytmów, Wydawnictwo Naukowo-Techniczne, Warszawa, 2001. 3. Manber U., Introduction to Algorithms, Addison-Wesley Publishing Company, New York, 1989. 4. Sedgewick R., Flajolet P., An introduction to the Analysis of Algorithms, Addison-Wesley Publishing Company, New York, 1996. 18