Algorithms and Architectures I Rasmus Løvenstein Olsen (RLO), Jimmy Jessen Nielsen (JJE) Mm3: More about recurrences - October 10, 2008 1
Algorithms and Architectures II 1. Introduction to analysis and design of algorithms(rlo) 2. Recursive algorithms and recurrences (RLO) 3. More about recurrences (RLO) 4. Greedy algorithms, backtracking and more recurrences(rlo) 5. Counting, probabilities and randomized algorithms (RLO) 6. More sorting algorithms: Heap sort and quick sort (RLO) 7. A little bit more about sorting - and more times for exercises (RLO) 8. Hash tables, Hashing and binary search trees (RLO) 9. Binary search trees, red-black trees (JJE) 10. Red-black trees continued + string matching (JJE) 2
Dagsorden Lige lidt om linked lists og arrays først Rekursionstræer (fortsat) Eksempler Kompleksiteter med rekursionstræer Master metoden Anvendelse Bevisførelse Opgaver 3
Linked lists Hvorfor linked lister? Tillader at vi kan gemme data strukturer spredt over hele vores data hukommelse Bruges ofte i forhold til Stacks Køer Associative data strukturer Single linked lists 1 2 9 9 3 7 Hvis jeg nu vil indsætte/slette et element 1 2 9 9 3 7 9 9 4
Linked lists Double linked lists 1 2 9 9 3 7 Cirkulære linked lists 1 2 9 9 3 7 5
Linked lists versus arrays Hvad er forskellen mellem linked lists og arrays? Arrays tillader tilfældig adgang i elementer Linked lists tillader kun sekventiel adgang til data elementer Linked lists er bedre end arrays til at holde dynamisk varierende data elementer Array Indeksering O(1) O(n) Linked list Indsæt/slet ved ender O(1) O(1)/O(n) Indsæt/slet i midten O(n) O(1) Persistent No Yes Lokalitet Fixed Dynamic For rekursive algoritmer er vi typisk interesseret i tilfældig indekserring af data elementer, for effektiv opdeling af opgaver... 6
Dagsorden Lige lidt om linked lists og arrays først Rekursionstræer (fortsat) Eksempler Kompleksiteter med rekursionstræer Master metoden Anvendelse Bevisførelse Opgaver 7
Generel opgaveløsning med rekursive algoritmer Initialisering af algoritmen: typisk har rekursive algoritmer behov for en statsværdi. Dette opnåes enten ved parameteroverførsel til funktionen, eller benytte en gateway funktion der ikke er rekursiv til at sætte initialværdier. Kontroller at den nuværende værdi(er) der bliver processeret passer til basis tilfældet. I det tilfælde, så processer og returner resultatet. Hvis ikke, så Omdefiner opgaven til mindre eller simplere delproblemer Kald algoritmen igen med del problemet Kombiner delresultaterne i forhold til det format svaret skal angives i Returner svaret 8
Rekursionstræer I et rekursionstræ representerer en enkelt knude, prisen for et enkelt delproblem Den totale pris for en algoritme er skabt ved summering af de enkelte niveauer og krydssummen af disse over hele træet Træerne egner sig godt til divide-and-conquer algoritmer og kan, som vi har set, danne basis for gode gæt ved bestemmelse af algoritme kompleksitet Hvis vi er omhyggelige, kan vi endog bruge rekursionstræer som endelig bevis på kompleksitetsalgoritme 9
Rekurens træ for merge sort algoritme cn cn cn/2 cn/2 cn cn/4 cn/4 cn/4 cn/4 cn Log 2 (n) c c c c c c c c cn n 10
Et andet eksempel Den rekursive funktion T(n)=3T(n/4) + Θ(n 2 ) Antager at afrundinger ikke betyder noget... cn 2 T(n/4) T(n/4) T(n/4) cn 2 c(n/4) 2 c(n/4) 2 c(n/4) 2 T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) 11
Og endelig det helt store træ cn 2 cn 2 c(n/4) 2 c(n/4) 2 c(n/4) 2 (3/16)cn 2 Log 4 (n) c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 c(n/16) 2 (3/16) 2 cn 2 T(1) T(1) T(1) T(1) Θ(n Log3(4) ) n Log4(3) Og dermed bliver den her O(n 2 ) 12
Et lidt mere kompliceret eksempel Antag T(n) = T(n/3) + T(2n/3) + O(n) cn cn c(n/3) c(2n/3) cn Log 3/2 (n) c(n/9) c(2n/9) c(2n/9) c(4n/9) cn T(1) T(1) T(1) n Log4(3) Hvorfor bliver det ikke cnlog 3/2 (n)?! cnlog 3/2 (n) O(nLog 3/2 (n)) 13
Et lidt mere kompliceret eksempel #2 For store værdier af n, vil der uden tvivl forsvinde nogle grene i træet undervejs c(n/3) Tværsummen gennem hele forløbet er altså ikke cn, men mindskes... c(n/9) c(2n/9) T(1) c(2n/27) T(2n/27) T(4n/27) Men vi kan vise at T(n) < = dnlog 2 (n) for et godt valg af d Konklusion: Så længe d opfylder kravet d>=c/(log 2 (3)-(2/3)) 14
Dagsorden Lige lidt om linked lists og arrays først Rekursionstræer (fortsat) Eksempler Kompleksiteter med rekursionstræer Master metoden Anvendelse Bevisførelse Opgaver 15
Master metoden Vi går lige tilbage til den her: T ( n) = at ( n / b) + f ( n) Så gælder flg. teorem (Master teoremet) 1. Hvis f(n) = O(n Logb(a-ε) ), hvor ε>0, så er T(n) = Θ(n Logb(a) ) 2. Hvis f(n) = Θ(n Logb(a) ), så er T(n) = Θ(n Logb(a) Log 2 (n)) 3. Hvis f(n) = Ω(n Logb(a+ε) ), hvor ε>0, samt af(n/b)<=cf(n) for c>1 og n er et stort tal, så er T(n) = Θ(f(n)) Teoremet kan anvendes som en kogebogsopskrift til løsning af kompleksiteter af rekursive algoritmer på (næsten) samme måde som tidligere set I det følgende undersøger vi dette teorem og den praktiske anvendelse af den 16
Master metoden - hvad betyder den? I alle tilfælde sammenligner vi f(n) med n Logb(a)!! Der er dog ikke blot tale om en simpel sammenligning. For ε!= 0 skal forholdet mellem f(n) og n Logb(a) ikke bare være større/mindre, men være præcis polynomisk større/mindre!! Det betyder f.eks. i 1. at f(n) skal være asymptotisk mindre med en faktor n ε og for 3. at f(n) skal være asymptotisk større med en faktor n ε udover de andre krav. Hvis disse krav ikke overholdes, så kan Master metoden ikke anvendes! I det følgende ser vi på hvad det betyder for os i praksis 17
Et par eksempler med master metoden Betragt T(n) = 9T(n/3) + n Vi ser at a = 9, b = 3 og f(n) = n Dermed har vi at n Logb(a) = n log3(9) = Θ(n 2 ) Vi prøver med flg. f(n) = O(n Log3(9) - ε ) kan ε sættes til 1, hvilket giver f(n) = O(n) = n Dermed er T(n) ifølge Master metode #1 givet ved T(n) = Θ(n Logb(a) ) = Θ(n 2 ) 18
Et par eksempler med master metoden #2 Betragt nu T(n) = T(2n/3) +1 Her er a = 1, b = 3/2, f(n) = 1 Vi ser at n Logb(a) = n Log3/2(1) = n 0 = 1 Vi prøver med f(n) = Θ(n Logb(a) ) = Θ(n Log3/2(1) ) = Θ(n 0 ) = Θ(1) Dermed ser det ud til at algoritmen falder under Master metoden #2, og kompleksiteten bliver dermed T(n) = Θ(n Logb(a) log 2 (n)) = Θ(log 2 (n)) 19
Et par eksempler med master metoden #3 Betragt T(n) = 3T(n/4) + nlog 2 (n) Her er a=3, b=4 og f(n) = nlog 2 (n) Vi ser at n Logb(a) = n Log4(3) = O(n 0.793 ) Vi prøver nu med f(n) = Ω(n Log4(3)+ε ), og med e 0.2, får vi f(n) = Ω(n Log4(3)+ε ) = Ω(n) Bemærk at vi ikke kan opnå noget med O(n Log4(3)-ε ) eller Θ(n Log4(3)-ε ) i forhold til f(n) = nlog 2 (n)!! (n 0.75-ε er praktisk talt noget rod ) Nu mangler vi bare at bevise af(n/b) cf(n) 20
Et par eksempler med master metoden #4 Og endelig den sidste, hvad med T(n) = 2T(n/2) + nlog 2 (n) a = 2, b = 2, f(n) = nlog 2 (n) n Logb(a) = n Log2(2) = O(n) Vi får igen med samme argument som sidst f(n) = Ω(n Log4(3)+ε ), og med e 0.2, får vi f(n) = Ω(n Log4(3)+ε ) = Ω(n) Nu mangler vi bare at bevise af(n/b) cf(n) Konklusion: Blot fordi den ligner en kendt, er det ikke sikker vi kender kompleksiteten af algoritmen!! 21
Bevis for Master metoden Beviset tager udgangspunkt i den funktion vi har set før: Θ(1) T ( n) = 2T ( n / 2) + Θ( n) Beviset baserer sig på to trin 1. Analyse af metoden under antagelse af n = 1, b, b 2, b 3,... 2. Generalisering af analysen til alle positive heltal af n Første del af beviset foregår over tre lemmaer ; n ; n = 1 > 1 22
Bevis for Master metoden #1 Første lemma Lad a >= 1 og b > 1, og lad f(n) være en positiv funktion med input n = b k Så vil den rekursive funktion T ( n) Θ(1) = 2T ( n / 2) + Θ( n) ; n ; n = 1 > 1 kunne opskrives som T ( n) = Θ( n log ( a) logb ( n) 1 j a j= 0 Beviset har vi egentlig set før, men lad os lige se det grafisk vha. et rekursionstræ b ) + f ( n / b j ) 23
Rekurens træ over vores generelle funktion f(n) f(n) f(n/b) f(n/b) f(n/b) af(n/b) Log b (n) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) f(n/b 2 ) a 2 f(n/b 2 ) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(n logb(a) ) n Logb(a) Total: Θ( n log b ( a) ) + logb ( n) 1 j a j= 0 f ( n / b j ) 24
Andet lemma Lad a >= 1 og b > 1, og lad f(n) være en positiv funktion med input n = b k Betragt funktionen g(n) g( n) logb ( n) 1 j a j= 0 så kan vi sige 1. Hvis f(n) = O(n Logb(a-ε) ), hvor ε>0, så er g(n) = O(n Logb(a) ) 2. Hvis f(n) = Θ(n Logb(a) ), så er g(n) = Θ(n Logb(a) Log 2 (n)) 3. Hvis af(n/b)<=cf(n) for c<1 og for alle n>=b, så er g(n) = Θ(f(n)) = f ( n / b j ) 25
Trejde lemma Lad a >= 1 og b > 1, og lad f(n) være en positiv funktion med input n = b k Betragt igen den rekursive funktion T ( n) Θ(1) at ( n / b) + Θ( n) ; n = 1 ; n = b = i Så kan vi med grænsedefinitionerne på hhv. O, Θ og Ω bevise at 1. Hvis f(n) = O(n Logb(a-ε) ), hvor ε>0, så er T(n) = Θ(n Logb(a) ) 2. Hvis f(n) = Θ(n Logb(a) ), så er T(n) = Θ(n Logb(a) Log 2 (n)) 3. Hvis f(n) = Ω(n Logb(a+ε) ), hvor ε>0, samt af(n/b)<=cf(n) for c>1 og n er et stort tal, så er T(n) = Θ(f(n)) 26
Bevis for Master metoden #2 Vi skal nu fokusere på øvre og nedre grænser af T ( n) = at ( n / b) + f ( n) T ( n) = at ( n / b) + f ( n) 27
Rekurens træ over vores generelle funktion f(n) f(n) f(n 1 ) f(n 1 ) f(n 1 ) af(n 1 ) Log b (n) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) f(n 2 ) a 2 f(n 2 ) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(1) Θ(n logb(a) ) n Logb(a) n = n n ; j = 0 > j 1 / b ; j 0 Total: Θ( n log b ( a) ) + logb ( n) 1 j a j= 0 f ( n j ) 28
Andet lemma (gentaget, og dog) Lad a >= 1 og b > 1, og lad f(n) være en positiv funktion med input n = b k Betragt funktionen g(n) g( n) = logb ( n) 1 j a j= 0 f ( n så kan vi sige 1. Hvis f(n) = O(n Logb(a-ε) ), hvor ε>0, så er g(n) = O(n Logb(a) ) 2. Hvis f(n) = Θ(n Logb(a) ), så er g(n) = Θ(n Logb(a) Log 2 (n)) 3. Hvis af(n/b)<=cf(n) for c<1 og for alle n>=b, så er g(n) = Θ(f(n)) j ) 29
Opsummering af dagens lektion Vi kiggede på arrays og linked lister og deres egenskaber Hvilke egenskaber de forskellige data strukturer har Fordele, ulemper og anvendelsesområder Vi kiggede lidt mere på rekursive algoritmer Træstrukturer som analyse af algoritme kompleksitet Master metoden Anvendelse Bevisførelse 30
Og et sidste dagens lille hik Recursion See "Recursion". eller med indbygget terminering Recursion If you still don't get it, See: "Recursion". 31
Opgaver Opgave 4.2-1, 4.2-2, 4.2-3 Opgaver 4-1, 4-4, 4-6 32