Algoritmanalys
Algoritmanalys och sortering
Programmeringsmetodik A – mom 2
1
Ordo
Att söka efter ett visst element i en vektor är direkt beroende
på antalet element, n, i vektorn.
Programmeringsmetodik A – mom 2
2
Ordo
3
Exempel
Även om varje steg i sökningen kräver flera operationer, kan
vi sätta c till ett högre tal och problemet växer enbart av n.
Att leta ett element i ett balanserat binärt sökträd är
8(log2(n)).
Programmeringsmetodik A – mom 2
Programmeringsmetodik A – mom 2
4
g(n)
Att söka ett element i en vektor är 8(n).
Till hjälp tar man då en matematisk
funktionsdefinition som kallas ordo, 8.
f(n) anger antalet beräkningar en algoritm gör om
storleken på datat är n.
g(n) anger en godtycklig funktion.
Om det finns ett c så att f(n) <= c ⋅ g(n) ∀n > n0 sägs
f(n) vara 8(g(n)).
Programmeringsmetodik A – mom 2
För att avgöra om en viss algoritm är bra, kollar man
oftast sämsta fallet.
Intressant att kolla hur algoritmen växer med
storleken på problemet.
5
I g(n) vill man enbart ha den del som växer fortast.
Konstanter är INTE viktigt.
Ex. n2, nlog(n), n3.
Att kolla på hur fort ett problem växer är för små
problem ofta inte så intressant, men för stora problem
kan det vara helt avgörande.
Programmeringsmetodik A – mom 2
6
1
Exempel
Sortering
n
log2(n)
n2
n3
2n
2
1
4
8
4
4
2
8
64
16
16
4
256
4096
65.536
256
8
65.536
16 milj
1.15⋅1077
1024
10
1 milj
1 mrd
1.79⋅10308
Programmeringsmetodik A – mom 2
7
Bubble sort
En av de vanligare operationerna på vektorer/arrayer.
Komplex operation
Varje element måste jämföra sig med alla de övriga
I grunden en 8(n2) operation
Kan den göras på ett bättre sätt?
Programmeringsmetodik A – mom 2
8
Bubble-sort
Enklaste och mest intuitiva sorteringsalgoritmen.
Elementen ''bubblar'' upp genom fältet.
Går igenom vektorn och byter plats mellan två
intilliggande elements som inte är i ordning.
Upprepar detta tills hela vektorn är sorterad (max n
ggr).
Många implementationer enligt samma princip.
''Pseudo''-kod:
do {
changed = false;
for (i=1; i<length; i++) { // OBS! i=1
if (v[i-1] > v[i]) {
changed = true;
swap(v[i-1],v[i]);
}
}
} while(changed);
Programmeringsmetodik A – mom 2
9
Exempel
Programmeringsmetodik A – mom 2
Merge sort
Programmeringsmetodik A – mom 2
10
11
Jobbar med en extra array.
Splittar vektorn för att sedan utnyttja att del-arrayer
redan är sorterade.
''Divide and conquer''
Bygger upp nya del-arrayer genom att parvis jämföra
frontelementen.
Programmeringsmetodik A – mom 2
12
2
Exempel
Quick sort
Programmeringsmetodik A – mom 2
13
'Divide and conquer''
Använder ett ''pivot''-element.
Lägger alla element mindre än pivot-elementet på en
sida och de andra på den andra.
Upprepar proceduren för del-arrayerna.
När alla del-arrayer består av som mest ett element är
de sorterade.
Svårighet att hitta bra pivot-element "snabbt".
Programmeringsmetodik A – mom 2
14
Jämförelse
Bubblesort är 8(n2).
Merge-sort och Quick-sort är 8(n ⋅ log(n)).
Merge-sort och Quick-sort kräver en intelligent
implementering/mer minne. Kritiskt för stora
datamängder.
Merge-sort och Quick-sort är rekursiva algoritmer.
Programmeringsmetodik A – mom 2
15
3