1 Asymptotisk komplexitetsanalys 2 Lars Larsson 3 4 VT 2007 5 Lars Larsson Asymptotisk komplexitetsanalys 1 Lars Larsson Asymptotisk komplexitetsanalys 2 et med denna föreläsning är att studenterna skall: Förhoppningsvis har behovet av en matematisk och korrekt modell framgått i förra föreläsningen!.. ha förvärvat kunskap om hur asymptotisk analys av algoritmer går till, veta vad är (inklusive dess definition) och kunna analysera en godtycklig algoritm asymptotiskt. Lars Larsson Asymptotisk komplexitetsanalys 3 Lars Larsson Asymptotisk komplexitetsanalys 4
är ett matematiskt sätt att analysera en är ett matematiskt sätt att analysera en 2 Ställa upp ett tidsuttryck T(n) för hur många primitiva operationer som behövs relativt storleken på indatan (n) i värsta fall (även bästa och medelfallet kan vara intressanta). Observera att vi i begreppet indata också räknar in mängden data vi har i vår datastruktur för tillfället. är ett matematiskt sätt att analysera en 2 Ställa upp ett tidsuttryck T(n) för hur många primitiva operationer som behövs relativt storleken på indatan (n) i värsta fall (även bästa och medelfallet kan vara intressanta). Observera att vi i begreppet indata också räknar in mängden data vi har i vår datastruktur för tillfället. 3 Förenkla tidsuttrycket. är ett matematiskt sätt att analysera en 2 Ställa upp ett tidsuttryck T(n) för hur många primitiva operationer som behövs relativt storleken på indatan (n) i värsta fall (även bästa och medelfallet kan vara intressanta). Observera att vi i begreppet indata också räknar in mängden data vi har i vår datastruktur för tillfället. 3 Förenkla tidsuttrycket. 4 Ta fram en funktion som begränsar tidsuttrycket ovanifrån.
Vi associerar en kostnad till varje operation i pseudokoden. Följande operationer har kostnaden 1: Funktions-/metodanrop. Returnera från en funktion/metod. Utföra aritmetiska operationer (+,,,/). Jämförelse mellan tal. Referera till ett objekt eller en variabel. Indexera i en array. är en grov förenkling i vanliga datorer tar operationerna olika lång tid, beroende på hårdvara och andra faktorer. Vad vi dock får är en maskinoberoende analys alltså en analys som är giltig även i framtiden. Lars Larsson Asymptotisk komplexitetsanalys 6 Lars Larsson Asymptotisk komplexitetsanalys 7 currentmax := A[0] for (i = 1 to n - 1) do if (currentmax < A[i]) then currentmax := A[i] return currentmax for (i = 1 to n - 1) do if (currentmax < A[i]) then currentmax := A[i] return currentmax
for (i = 1 to n - 1) do 1+n(1+1)+(n-1)*([]+1+1+1) if (currentmax < A[i]) then currentmax := A[i] return currentmax for (i = 1 to n - 1) do 1+n(1+1)+(n-1)*([]+1+1+1) if (currentmax < A[i]) then 1+1+1+1+1 currentmax := A[i] 1+1+1 return currentmax 1+1 for (i = 1 to n - 1) do 1+n(1+1)+(n-1)*([]+1+1+1) if (currentmax < A[i]) then 1+1+1+1+1 currentmax := A[i] 1+1+1 Att jämföra kurvor av T(n) är både svårt och ger massor data att titta på. Vi gör en asymptotisk analys av funktionen. Detta gör vi genom förenkling och avrundning av T(n). Vi avrundar helt enkelt 3n 2 till n 2 och 5000 till 1. return currentmax 1+1 T(n) = 3 + 1 + 2 n + (n 1) 11 + 2 = 13n 3 Lars Larsson Asymptotisk komplexitetsanalys 9
Vi använder oss av (uttalas stora ordo ), som kan förstås intuitivt med hjälp av figuren där vi ser att f (n) begränsas av c g(n), då n n 0 (punkten där de skär varandra). Vi säger att f (n) är O(g(n)). 250 200 f(x) c * g(x) Definition Givet funktionerna f (n) och g(n) säger vi att f (n) är O(g(n)) om och endast om f (n) c g(n) för n n 0 och c > 0 och n 0 1. 150 Denna definition är viktig! 100 50 0 0 1 2 3 4 5 6 7 Lars Larsson Asymptotisk komplexitetsanalys 10 Lars Larsson Asymptotisk komplexitetsanalys 11 En viktig poäng att beakta är att O(g(n)) är en mängd funktioner, som alla har egenskapen definitionen handlar om. Låt oss återgå till vår funktion T(n) = 13n 3. Vi ska hitta en funktion som begränsar (alltså alltid är större än, efter ett visst värde på n) T(n). De är uppenbarligen oändligt många så vi är intresserad av den minsta. Skippa allting utom den snabbast växande termen i funktionen. Ta bort konstanta faktorer. Några exempel på förenklingen: 10n 5 + 3n 2 + 10000 är O(n 5 ), 7n 3 + 50n 2 + 4 log(n) är O(n 3 ) och 13n 3 är O(n). Mycket enklare! Men vi måste ta hänsyn till c och n 0 också! Lars Larsson Asymptotisk komplexitetsanalys 12 Lars Larsson Asymptotisk komplexitetsanalys 13
T(n) = 13n 3 är O(n) omm vi hittar värden på c och n 0 som uppfyller kraven från definitionen. T(n) = 13n 3 är O(n) omm vi hittar värden på c och n 0 som uppfyller kraven från definitionen. c = lim f (n) g(n) + 1 = lim 13n 3 n + 1 = lim ( 3) 13 + 1 = 14 n c = lim f (n) g(n) + 1 = lim 13n 3 n + 1 = lim ( 3) 13 + 1 = 14 n För n n 0 ska det alltså gälla att 13n 3 14n. Ett lämpligt värde på n 0 är således exempelvis 1. Lars Larsson Asymptotisk komplexitetsanalys 14 Lars Larsson Asymptotisk komplexitetsanalys 14 Vi har vissa namngivna klasser av problem. Dessa är i stigande komplexitet: Konstanta O(1) Logaritmiska O(log(n)) Linjära O(n) Kvadratiska O(n 2 ) Polynoma O(n k ),k 1 Exponentiella O(a n ),a 1 Generellt gäller att vi vill ha en så låg komplexitet som möjligt, och hjälper oss jämföra algoritmer. Men det finns ett problem! Lars Larsson Asymptotisk komplexitetsanalys 15 Lars Larsson Asymptotisk komplexitetsanalys 16
Generellt gäller att vi vill ha en så låg komplexitet som möjligt, och hjälper oss jämföra algoritmer. Men det finns ett problem! Stora konstanter döljs av förenklingen: exempelvis är 10000n en linjär algoritm. Den är ju dock knappast bättre (för små värden på n) än en algoritm som kräver 7n 2 steg, trots att den senare ju är kvadratisk. Ofta kan vi bara titta på en algoritm för att få en grov bild av dess komplexitet: Att initiera en array eller gå igenom en lista elementvis är O(n). Nästlade slingor i k nivåer som alla är beroende av indatans storlek är O(n k ). Lars Larsson Asymptotisk komplexitetsanalys 16 Lars Larsson Asymptotisk komplexitetsanalys 17 Vi har sett hur man räknar ut och jämför komplexiteten av algoritmer. O är en övre gräns för tillväxten av funktionen T(n) som visar hur många primitiva operationer en viss algoritm kräver, relativt storleken n på indatan. Lars Larsson Asymptotisk komplexitetsanalys 18