Datastrukturer och algoritmer Föreläsig 2 Aalys av Algoritmer Aalys av algoritmer Vad ka aalyseras? - Exekverigstid - Miesåtgåg - Implemetatioskomplexitet - Förstålighet - Korrekthet - - 29 30 Varför aalysera algoritmer? Exekverigstid/miesåtgåg - Är algoritme praktiskt körbar - Vi vill ha de sabbaste! Att implemetera Att köra Beräkigsbar/haterbar Icke haterbara - superpolyom (!,, ) Beräkigsbara Alla (mattematiska)problem Ej beräkigsbara 3 Haterbara - polyom + 2 +3* 32 Stora Ordo f() c*g() => f() är av O(g()) cg() f() Defiitio: O(defiitio) Givet fuktioera f() och g() säger vi att f() är O(g()) omm f() c*g() för 0 och c >0 och 0 0 Storlek på idata 33 34
f() är O(g()) Varför ite f() O(g()) eller f() O(g()) Borde vara - f() tillhör O(g()) ty O(g()) är e mägd fuktioer, Se bilde. - Me vi skriver f() är O(g()) Litet räkeexempel operatio tar µs *0 9 elemet i e lista Kvadratisk sorterigsalgoritm 2-3000år Sorterigsalgoritm O(*log()) - 30000s arbetsdag 2 och dubbelt så sabb => 5500 år 2 och000 gåger så sabb => 3år 35 36 Exekverigstider - e dator med 00 000 MIPS, *0 op/sek 0 20 50 00 300 N 2 *0-9 2.5*0-8 /400 *0-7 9*0-7 N 5 *0-6 3.2*0-5 3.*0-3 0. 24,3 s 2 N *0-8 *0-5 3 tim 4*0 år 6,5*0 7 år N N 0. 33 miljoer år 2.8*0 66 år 9*0 62 år.4 *0 632 år Ohaterbarhet Måga triviala att förstå och viktiga att lösa - Schemaläggig - Hadelsresade Moore s lag förädrar de situatioe? Hur haterar vi ohaterbarhet?! Drygt 0 miljarder µs på e dag! *0 24 µs seda Big Bag 37 38 Hatera ohaterbarhet Heuristik - Lösa ästa rätt problem Föreklig - Lösa problemet ästa rätt Approximatio NP-kompletta problem E speciell klass av ohaterliga problem Har problem X e lösig med egeskapera Y Ekvivaleta: - Trasformeras - Högst expoetiella - Sakar bevis för ohaterbarhet Icke haterbara - superpolyom (!,, ) 39 40
Mäta tidsåtgåge Hur ska vi mäta tidsåtgåge? - Experimetell aalys Implemetera algoritme Kör programmet med varierade datamägd Storlek Sammasättig Aväd metoder för tidtagig så som time (ger tide i sekuder seda 970), clock (ger processortid med hyfsad precisio) eller gettimeofday (bättre precisio ä time, me ej stadard i c) Plotta uppmätt data Exempel t(ms) 4 42 Bästa, värsta & medel Värsta Medel Bästa Experimetell aalys Begräsigar med metode - Måste implemetera och testa algoritme - Svårt att veta om programmet har staat eller fast i beräkigara. T ex. 2 ; =00 => 40000 billioer år - Experimete ka edast utföras på e begräsad mägd av data, ma ka missa viktiga testdata - Hårdvara och mjukvara måste vara de samma för alla implemetatioer 43 44 Kotrollera si slutsats Plotta uppmäta tide/uppskattade ( f()/g() el. ordodef.) Borde gå mot kostat eller 0 för stora värde om korrekt Geerellare metod behövs Som aväder e högivåbeskrivig av algoritmera istället för e implemetatio av de Tar häsy till alla möjliga idata Aalys oberoede av hårdvara och mjukvara Asymptotisk aalys 45 46
Asymptotisk aalys Utgår frå pseudokode Räka operatioer - Ställ upp ett uttryck för atalet operatioer beroede av problemstorleke Förekla tidsuttrycket Ta fram e fuktio som begräsar tidsuttrycket ovaifrå Lite matematik behövs Logaritmer (xy) = log b (x) + log b (y) (x/y) = log b (x) (y) (x α ) = α log b (x) (a) =log x (a)/log x (b) 47 48 Kaske lite mer Och äu mer matte Expoeter a (b +c ) = a b a c a bc = (a b ) c a b /a c = a (b c ) b = a log a (b ) b c = a c*log a (b ) Summor är bra att kua - Geerell defiitio t f (i) = f (s) + f (s +) + f (s + 2) +...f (t) i= s - Geometrisk utvecklig ( 0 och 0<a ) i= 0 + a i =+ a + a 2 + a 3 +...+ a a = a Växer expoetiellt (om a>) 49 50 Sista matte för dea gåg Aritmetisk tillväxt, summera alla tal frå t o m 00 + Aalys av algoritmer Primitiva operatioer - Lågivå beräkigar som är i stort sett oberoede av programspråk och ka defiieras i termer av pseudokod: Aropa e metod/fuktio i= i =+ 2 + 3 +...+ = 2 + 2 0 2 /2 3 Returera frå e metod/fuktio Utföra e aritmetisk operatio (+, -, ) Jämföra två tal, etc. Referera till e/ett variabel/objekt Idexera i e array 5 52
Mer aalys av algoritmer Ispektera pseudokode och räka atalet primitiva operatioer. Väldig abstraktio, vi bortser frå hårdvara, och att olika operatioer tar olika låg tid, Alterativet är att titta på de verkliga tidera för de olika operatioera - Ger e maskiberoede aalys Exempel Algorithm addalleve() sum <- 0 i <- 2 while i<= do sum <- sum+i i <- i+2 retur sum; (/2+)* +(/2)*[] + + T()=++(/2+)* +(/2)*(+++)+=4+/2+4 53 54 Exempel 2 Algorithm arraymax(a,) iput: A array A storig itegers output: The maximum elemet i A curretmax A[0] //+ for i to - do //+(+)+(-)*([]+) if curretmax < A[i] the //++ curretmax A[i] //+ retur curretmax // Jämföra T() Rita kurvor för T() och jämför svårt Alterativet är asymptotisk otatio/aalys - Förekla jämförelse geom att avruda T() ".00000 " 3 2 2 T max ()= 3+2+(-)*6 + = 8-2 T mi ()= 3+2+(-)*4 + = 6 55 56 Stora Ordo f() c*g() => f() är av O(g()) cg() f() Mer ordo f() = 7-3 hitta e fuktio som begräsar f()? - Oädligt måga, hitta de mista /eklaste - Droppa allt utom de ledade terme dvs. lägre ordiges termer och kostater 7-3 är O() 8 2 log() + 5 2 + är O( 2 log()) 0 Storlek på idata 57 58
Specialla klasser av algoritmer Logaritmiska O(log()) Lijära O() Kvadradiska O( 2 ) Polyoma O( k ); k Expoetiella O(a ); log() <<<< 2 << 3 <<2 Exempel F() = 7-3 är O() - Hitta c # 0? f () lim g() + % 7 3( % lim' * += lim & ) 7 3 ( ' & * + c = 8 ) $7-3 8; 0 =? $Ok! 59 60 O(sammafattig) O() aväds för att utrycka atalet primitiva operatioer som utförs som e fuktio av storleke på idata E övre gräs för tillväxt arraymax är e lijär algoritm dvs O() E algoritm som körs på O() är bättre ä e O( 2 ), me O(log()) är bättre ä O() - log() <<<< 2 << 3 <<2 O(varig) Var aktsam, stora kostater ställer till det T()=000000 är e lijär algoritm O(), me i måga fall mycket midre effektiv på data mägder ä e algoritm med T() = 2 2 som är O( 2 ) - O-otatioe är e stor föreklig, dvs e övre gräs, det fis släktigar som begräsar edåt - Samt tagit bort kopplige till hårdvara. 6 62 O(geväg) Ma ka måga gåger skippa väge över T() - Väldigt grov uppskattig av tillväxte - Ma gör e okulärbesiktig av algoritme O(exempel ) Algorithm prefixav(x); Iput: A -elemet Array of umbers Output: A -elemet Array of umbers such that A[i] is the average of X[0],,X[i]. Iitiera e array är O() Nästlade loopar är O()*O()* *O() O( k ) Let A be a array of umbers for i 0 to - do a 0 for j 0 to i do a a+x[j] A[i] a/(i+) retur A Aalys: T b () =? T w () =? Me algoritme är av O( 2 ) 63 64
O(exempel 2) Algorithm prefixav(x); Iput: A -elemet Array of umbers Output: A -elemet Array of umbers such that A[i] is the average of X[0],,X[i]. Let A be a array of umbers s 0 for i 0 to - do s s+x[i] Aalys: T() =? Me algoritme är av O() Fler defiitioer T()=Ω(g()) omm det fis positiva kostater c och 0 så att T() cg() är 0 T()=Θ(h()) omm T()=O(h()) och T()= Ω(h()) T()=o(p()) omm T() = O(p()) och T() Θ(p()) A[i] s/(i+) retur A 65 66 Beräka miesåtgåg Vi ka aväda likade metoder som för asymptotisk aalys. - Me i stället för att beräka primitiva operatioer så räkar vi hur mkt mie vi behöver utöver de iitiala problembeskrivige - Glöm ite miet för lokala variabler etc som läggs upp på stacke vid rekursio 67