Föreläsig 2 Algoritmaalys TDDC70/91: DALG Utskriftsversio av föreläsig i Datastrukturer och algoritmer 5 september 2013 Tommy Färqvist, IDA, Liköpigs uiversitet 2.1 Iehåll Iehåll 1 Aalys av värsta fallet 1 1.1 Iterativa algoritmer...................................... 2 1.2 Rekursiva algoritmer..................................... 3 1.3 Valiga tillväxttakter..................................... 4 2 Aalys av medelfallet 4 2.1 Amorterad aalys....................................... 5 2.2 Olika tekiker Fråga gäller: tillväxttakte hos... miesavädig exekverigstid Situatioer att aalysera: värsta fallet, bästa fallet, förvätade fallet, amorterat: e sekves av arop till algoritme Tekiker: algebraiskt (räka iteratioer) lös rekurresrelatioer (rekursiva algoritmer) probabilistisk aalys (lista ut beteedet i medelfallet) 2.3 1 Aalys av värsta fallet Algoritmaalys hur då? E algoritm bör (ormalt) fugera för idata av godtycklig storlek. Beskriv resursförbrukige (tid/mie) som e icke avtagade fuktio av idatastorlek. Fokusera på beteedet i värsta fallet! Igorera kostata faktorer aalyse bör vara maskioberoede; kraftfullare CPU uppsabbig med kostat faktor. Studera skalbarhet/asymptotiskt beteede för stora problemstorlekar: igorera lägre ordiges termer, fokusera på domierade termer. 2.4 1
1.1 Iterativa algoritmer Exekverigstid för iterativa algoritmer Elemetära operatioer: begräsade av kostat tid tilldela ett värde till e variabel aropa e fuktio/metod/procedur utföra e aritmetisk operatio jämföra två tal idexera i e array följa e objektreferes returera frå e fuktio/metod/procedur Sekveser av operatioer: summa av kompoetera Loop (for... och while... ): tide (i värsta fallet) av villkoret plus kroppe gåger atalet iteratioer (i värsta fallet) N: t while = N (t cod +t body ) Villkorssats (if... the... else): tide (i värsta fallet) för att evaluera villkoret plus de maximala tide (i värsta fallet) av de två greara t i f = t cod + max(t the,t else ) Algoritmaalys hur i praktike? 1: fuctio FIND(A[1,...,],t) 2: for i 1 to do 3: if A[i] == t the 4: retur true 5: retur false Hur ser värstafallsistase ut? Exempel: Två loopar 1: fuctio FIND(A[1,...,],B[1,...,],t) 2: for i 1 to do 3: if A[i] == t the 4: retur true 5: for i 1 to do 6: if B[i] == t the 7: retur true 8: retur false Hur ser värstafallsistase ut? Exempel: Två ästlade loopar 1: fuctio COMMON(A[1,...,],B[1,...,]) 2: for i 1 to do 3: for j 1 to do 4: if A[i] == B[ j] the 5: retur true 6: retur false Hur ser värstafallsistase ut? Exempel: Två adra ästlade loopar 1: fuctio DUPLICATE(A[1,..., ]) 2: for i 1 to do 3: for j i + 1 to do 4: if A[i] == A[ j] the 5: retur true 6: retur false Hur ser värstafallsistase ut? 2.5 2.6 2.7 2.8 2.9 2
Exempel: Biärsökig Trivialt att implemetera? Första algoritme publicerad 1946; första buggfria publicerad 1962. Java-bugg i Arrays.biarysearch() upptäckt 2006. Värstafallstid: c 1 + maxit c 2 + c 3, där maxit är maximalt atal iteratioer av while-loope. 2.10 1.2 Rekursiva algoritmer Exekverigstid för rekursiva algoritmer Karakterisera exekverigstide med e rekurresrelatio Fi e lösig (på slute form) till rekurresrelatioe Om du ite käer ige rekurresrelatioe ka du Rulla upp relatioe ågra gåger för att få fram e hypotes om e möjlig lösig: T () =... Bevisa hypotese om T () med matematisk iduktio. Om det ite går bra, modifiera hypotese och prova ige... 2.11 Exempel: Fakultetsfuktioe fuctio FACT() if = 0 the retur 1 else retur FACT( 1) Exekverigstid: tid för jämförelse: t c tid multiplikatio: t m tid för arop och retur försummas Total exekverigs tid T (). T (0) = t c T () = t c +t m + T ( 1), om > 1 Alltså, för > 0: T () = (t c +t m ) + (t c +t m ) + T ( 2) = = (t c +t m ) + (t c +t m ) + (t c +t m ) + T ( 3) =... = = (t c +t m ) +... + (t c +t m ) +t c = (t c +t m ) +t c O() }{{} ggr 2.12 Exempel: Biärsökig fuctio BINSEARCH(v[a,..., b],x) if a < b the m a+b 2 if v[m].key < x the retur BINSEARCH(v[m + 1,...,b],x) else retur BINSEARCH(v[a,...,m],x) if v[a].key = x the retur a else retur ot foud 3
Låt T () vara tide, i värsta fall, att söka blad tal med BINSEARCH. { Θ(1) om = 1 T () = T ( 2 ) + Θ(1) om > 1 Om = 2 m får vi Vi ka då sluta oss till att T () = Θ(log). { Θ(1) om = 1 T () = T ( ) 2 + Θ(1) om > 1 2.13 Mästarmetode Sats 1 ( Master theorem ). Om a 1, b > 1, d > 0 så har rekurresrelatioe { T () = ( at b ) + f () T (1) = d de asymptotiska lösige T () = Θ( log b a ) om f () = O( log b a ε ) för ågot ε > 0 T () = Θ( log b a log) om f () = Θ( log b a ) T () = Θ( f ()) om f () = Ω( log b a+ε ) för ågot ε > 0 och a f ( b ) c f () för ågo kostat c < 1 för alla tillräckligt stora. 2.14 1.3 Valiga tillväxttakter Valiga tillväxttakter tillväxttakt typisk kod beskrivig exempel T (2)/T () 1 a = b + c sats lägga ihop två tal 1 log 2 while ( > 1) dela på { = / 2;...} hälfte biärsökig 1 for (it i = 0; i <, i++) hitta loop maximum 2 log 2 se föreläsig om mergesort divide ad coquer mergesort 2 for (it i = 0; i <, i++) dubbel kolla 2 for (it j = 0; j <, j++) loop alla par 4 for (it i = 0; i <, i++) for (it j = 0; j <, j++) trippel- kolla alla 3 for (it k = 0; k <, k++) loop tripplar 8 2 se sista föreläsige totalsökig kolla alla delmägder T () 2.15 2 Aalys av medelfallet Medelfallsaalys Betrakta TABLESEARCH: sekvesiell sökig i e tabell Idata: ett av tabellelemete, atag att det är valt med likformig saolikhet över alla elemet. fuctio TABLESEARCH(T [0,..., 1],K) for i 0 to 1 do if T [i] = K the retur i. Förvätad söktid t c + 2t c + 3t c +... + t c = = (1 + 2 + 3 +... + )t c ( + 1) t c = + 1 2 2 t c O() = 2.16 4
2.1 Amorterad aalys E utökigsbar array Vi vill ha e y typ av array som ökar si storlek är de blivit full (atalet elemet isatta,, är samma som kapacitete, N). Atag att isättig hela tide sker i arrayes första lediga positio. Vi aväder följade strategi: Allokera e y array B med kapacitet 2N Kopiera A[i] till B[i], för i = 0,...,N 1 Låt A = B, dvs vi låter B ta över rolle A har haft. I termer av effektivitet kaske det här sättet att utöka arraye verkar lågsamt. Me, tide för att lägga till ett ytt elemet blir O(1) i de flesta falle O() för kopierig av elemet och O(1) för isättig är reallokerig behövs. 2.17 Amorterad aalys Geom att aväda amorterig ka vi visa att körtide för e sekves av operatioe att lägga till ett elemet till vår utökigsbara array faktiskt är gaska effektiv. Propositio 2 (6.2 i kursboke). Låt S vara e tabell implemeterad med hjälp av e utökigsbar array A, som ova. De totala tide för att sätta i elemet i S, med start frå e tom tabell S (vilket betyder att A har kapacitet N = 1) är O(). 2.18 5