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