Analys av algoritmer Beräkningsbar/hanterbar Stora Ordo O(definition)

Analys av algoritmer
• Vad kan analyseras?
Datastrukturer och
algoritmer
- Exekveringstid
- Minnesåtgång
- Implementationskomplexitet
Föreläsning 2
Analys av Algoritmer
- Förstålighet
- Korrekthet
-
29
30
Varför analysera algoritmer?
Johan Eliasson
Beräkningsbar/hanterbar
• Exekveringstid/minnesåtgång
Alla (mattematiska)problem
- Är algoritmen praktiskt körbar
Icke hanterbara - superpolynom
Beräkningsbara
(n!, nn, …)
- Vi vill ha den snabbaste!
Ej beräkningsbara
✴Att implementera
✴Att köra
31
Hanterbara - polynom
1+n2+3*n
Johan Eliasson
Stora Ordo
f(n) ≤ c*g(n) => f(n) är av O(g(n))
Johan Eliasson
O(definition)
cg(n)
f(n)
n0
32
Definition:
Givet funktionerna f(n) och g(n) säger vi att f(n) är
O(g(n)) omm f(n) ≤ c*g(n) för n ≥ n0 och c >0 och n0≥1
Storlek på indata
33
Johan Eliasson
34
Johan Eliasson
Litet räkneexempel
f(n) är O(g(n))
• Varför inte f(n) ≤ O(g(n)) • 1 operation tar 1µs
• 1*10 element i en lista
• Kvadratisk sorteringsalgoritm n
eller f(n) ≈ O(g(n))
•
9
Borde vara
2
- f(n) tillhör O(g(n)) ty O(g(n)) är en mängd
funktioner,
- 31000år
• Sorteringsalgoritm O(n*log(n))
✴Se bilden.
- 30000s ≈ 1 arbetsdag
- Men vi skriver f(n) är O(g(n))
•n
•n
2 och
dubbelt så snabb => 15500 år
2 och1000
35
gånger så snabb => 31år
36
Johan Eliasson
Exekveringstider - en dator med 100 000 MIPS, 1*10
11
op/sek
Johan Eliasson
Ohanterbarhet
• Många triviala att förstå och viktiga att lösa
10
20
50
100
300
N2
1*10-9
2.5*10-8
1/400
1*10-7
9*10-7
- Schemaläggning
N5
1*10-6
3.2*10-5
3.1*10-3
0.1
24,3 s
- Handelsresande
2N
1*10-8
1*10-5
3 tim
4*1011 år
6,5*1071
år
NN
0.1
33
2.8*1066
miljoner år år
9*10162 år
1.4 *10632
år
• Moore’s lag förändrar den situationen?
• Hur hanterar vi ohanterbarhet?
! Drygt 10 miljarder µs på en dag
! 1*1024 µs sedan ”Big Bang”
37
38
Johan Eliasson
Hantera ohanterbarhet
Johan Eliasson
NP-kompletta problem
• Heuristik
• En speciell klass av ohanterliga problem
• Har problem X en lösning med egenskaperna Y
• Ekvivalenta:
Icke hanterbara - - Lösa nästan rätt problem
✴Förenkling
- Transformeras
- Lösa problemet nästan rätt
superpolynom
(n!, nn, …)
- Högst exponentiella
✴Approximation
- Saknar bevis för ohanterbarhet
39
Johan Eliasson
40
Johan Eliasson
Mäta tidsåtgången
Exempel
• Hur ska vi mäta tidsåtgången?
t(ms)
- Experimentell analys
✴ Implementera algoritmen
✴ Kör programmet med varierande datamängd
• Storlek
• Sammansättning
✴ Använd metoder för tidtagning så som
• time (ger tiden i sekunder sedan 1970), clock (ger processortid
med hyfsad precision) eller gettimeofday (bättre precision än
time, men ej standard i c)
n
✴ Plotta uppmätt data
41
Johan Eliasson
Bästa, värsta & medel
42
Johan Eliasson
Experimentell analys…
• Begränsningar med metoden
- Måste implementera och testa algoritmen
Värsta
- Svårt att veta om programmet har stannat eller fast i
beräkningarna. T ex. 2n; n=100 => 40000 billioner år
Medel
Bästa
- Experimenten kan endast utföras på en begränsad mängd av
data, man kan missa viktiga testdata
- Hårdvaran och mjukvaran måste vara den samma för alla
implementationer
43
Johan Eliasson
Kontrollera sin slutsats
44
Johan Eliasson
Generellare metod behövs
• Plotta uppmätna tiden/uppskattade ( f(n)/g(n) enl.
använder en högnivåbeskrivning av algoritmerna
• Som
istället för en implementation av den
ordodef.)
• Borde gå mot konstant eller 0 för stora värden om
korrekt
• Tar hänsyn till alla möjliga indata
• Analys oberoende av hårdvaran och mjukvaran
• Asymptotisk analys
n
45
Johan Eliasson
46
Johan Eliasson
Asymptotisk analys
Lite matematik behövs…
• Logaritmer
• Utgår från pseudokoden
• Räkna operationer
- logb(xy) = logb(x) + logb(y)
- Ställ upp ett uttryck för antalet
operationer beroende av
problemstorleken
- logb(x/y) = logb(x) - logb(y)
- logb(xα) = α logb(x)
• Förenkla tidsuttrycket
• Ta fram en funktion som
- logb(a) =logx(a)/logx(b)
begränsar tidsuttrycket
ovanifrån…
47
48
Johan Eliasson
Kanske lite mer…
Och ännu mer matte…
• Exponenter
• Summor är bra att kunna…
a(b +c ) = a b a c
- Generell definition
a bc = (a b ) c
t
∑ f (i) = f (s) + f (s + 1) + f (s + 2) + ... f (t)
i= s
a b /a c = a(b−c )
b = a log a (b )
€
Johan Eliasson
- Geometrisk utveckling (n≥0 och 0<a ≠ 1)
n
€
∑a
i
= 1+ a + a 2 + a 3 + ...+ a n =
i= 0
€
b c = a c*log a (b )
1− a n +1
1− a
✴Växer exponentiellt (om a>1)
€
€
49
€
50
Johan Eliasson
Johan Eliasson
€
Sista matten för denna gång…
• Aritmetisk tillväxt, summera alla tal från 1 t o m 100
Analys av algoritmer
• Primitiva operationer
- Lågnivå beräkningar som är i stort sett oberoende av
programspråk och kan definieras i termer av pseudokod:
n+1
n
✴ Anropa en metod/funktion
✴ Returnera från en metod/funktion
✴ Utföra en aritmetisk operation (+, -, …)
1
n
∑ i = 1+ 2 + 3 + ...+ n =
i=1
€
2
n +n
2
0
1
2 3
n/2
✴ Jämföra två tal, etc.
n
✴ Referera till en/ett variabel/objekt
✴ Indexera i en array
51
Johan Eliasson
52
Johan Eliasson
Exempel 1
Mer analys av algoritmer…
• Inspektera pseudokoden och räkna antalet
Algorithm addAllEven(n)
primitiva operationer.
• Väldig abstraktion, vi bortser från hårdvaran, och
att olika operationer tar olika lång tid, …
•
Alternativet är att titta på de verkliga tiderna för
de olika operationerna
- Ger en maskinberoende analys
sum <- 0
1
i <- 2
1
while i<=n do
(n/2+1)*1 +(n/2)*[]
sum <- sum+i
1+1
i <- i+2
1+1
return sum;
1
T(n)=1+1+(n/2+1)*1 +(n/2)*(1+1+1+1)+1=4n+n/2+4
53
54
Johan Eliasson
Exempel 2
Jämföra T(n)
• Rita kurvor för T(n) och jämför…svårt…
• Alternativet är asymptotisk notation/analys
Algorithm arrayMax(A,n)
input: An array A storing n integers
output: The maximum element in A
currentMax ←
for i ←
Johan Eliasson
- Förenkla jämförelsen genom att avrunda T(n)
//1+1
A[0]
" 1.000001 ≈ 1
" 3n2 ≈ n2
//1+n(1+1)+(n-1)*([]+1)
1 to n-1 do
//1+1+1
if currentMax < A[i] then
//1+1
currentMax ← A[i]
//1
return currentMax
Tmax(n)= 3+2n+(n-1)*6 +1 = 8n-2
Tmin(n)= 3+2n+(n-1)*4 +1 = 6n
55
56
Johan Eliasson
Stora Ordo
f(n) ≤ c*g(n) => f(n) är av O(g(n))
Johan Eliasson
Mer ordo
cg(n)
•
f(n) = 7n -3 hitta en funktion som begränsar f(n)?
- Oändligt många, hitta den ”minsta”/enklaste
f(n)
- Droppa allt utom den ledande termen dvs. lägre ordningens
termer och konstanter
✴7n-3 är O(n)
✴8n2log(n) + 5n2+n är O(n2log(n))
n0
Storlek på indata
57
Johan Eliasson
58
Johan Eliasson
Exempel
Specialla klasser av algoritmer
• Logaritmiska O(log(n))
O(n)
• Linjära
O(n )
• Kvadradiska
O(n ); k≥1
• Polynoma
• Exponentiella O(a ); n≥1
• log(n) <<n<<n <<n <<2
•
n
n
€
59
f (n)
+1
g(n)
60
Johan Eliasson
O(sammanfattning)
Johan Eliasson
O(varning)
används för att utrycka antalet primitiva
• O(n)
operationer som utförs som en funktion av storleken
på indata
• En övre gräns för tillväxt
• arrayMax är en linjär algoritm dvs O(n)
• En algoritm som körs på O(n) är bättre än en O(n ),
2
men O(log(n)) är bättre än O(n)
- log(n) <<n<<n2<<n3<<2n
61
n →∞
% 7n − 3 (
%
3(
lim'
* + 1 = lim' 7 − * + 1 ⇒ c = 8
n →∞&
n →∞&
n )
n)
#n0?
$7n-3≤8n; n0 =1? €
$Ok!
k
3
lim
- Hitta c
2
2
F(n) = 7n-3 är O(n)
•
Var aktsam, stora konstanter ställer till det
– T(n)=1000000n är en linjär algoritm O(n), men i många fall
mycket mindre effektiv på data mängder än en algoritm med
T(n) = 2n2 som är O(n2)
- O-notationen är en stor förenkling, dvs en övre gräns, det
finns släktingar som begränsar nedåt
- Samt tagit bort kopplingen
till hårdvaran.
62
Johan Eliasson
O(genväg)
Johan Eliasson
O(exempel 1)
• Man kan många gånger skippa vägen över T(n)
Algorithm prefixAv1(X);
Input: An n-element Array of numbers
- Väldigt grov uppskattning av tillväxten
Output: An n-element Array of numbers such that A[i] is the
- Man gör en okulärbesiktning av algoritmen
average of X[0],…,X[i].
Let A be an array of numbers
✴ Initiera en array är O(n)
for i ← 0 to n-1 do
✴ Nästlade loopar är O(n)*O(n)*…*O(n)≈O(nk)
a ← 0
Analys: Tb(n) = ? Tw(n) = ?
Men algoritmen är av O(n2)
for j ← 0 to i do
a ← a+X[j]
A[i] ←a/(i+1)
return A
63
Johan Eliasson
64
Johan Eliasson
O(exempel 2)
Fler definitioner
• T(n)=Ω(g(n)) omm det finns positiva konstanter c och
Algorithm prefixAv1(X);
Input: An n-element Array of numbers
n0 så att T(n)≥cg(n) när n≥ n0
Output: An n-element Array of numbers such that A[i] is the
average of X[0],…,X[i].
• T(n)=Θ(h(n)) omm T(n)=O(h(n)) och T(n)= Ω(h(n))
• T(n)=o(p(n)) omm T(n) = O(p(n)) och T(n)≠Θ(p(n))
Let A be an array of numbers
s ← 0
Analys: T(n) = ?
Men algoritmen är av O(n)
for i ← 0 to n-1 do
s ← s+X[i]
A[i] ←s/(i+1)
return A
65
Johan Eliasson
Beräkna minnesåtgång
• Vi kan använda liknande metoder som för asymptotisk
analys.
- Men i stället för att beräkna primitiva operationer
så räknar vi hur mkt minne vi behöver utöver den
initiala problembeskrivningen
- Glöm inte minnet för lokala variabler etc som läggs
upp på stacken vid rekursion
67
Johan Eliasson
66
Johan Eliasson