Om Kurset og Analyse av Algoritmer Lars Vidar Magnusson 8.1.2014 Praktisk informasjon om kurset Hva er en algoritme? (kapittel 1) Hvordan analysere en algoritme? (kapittel 2)
Praktisk Informasjon Introduction to Algorithms (Third Edition) - Cormen, Leiserson, Rivest & Stein - ISBN-13 978-0262033848 Forelesninger Onsdager 8.15-10.00 D1-055/056 Fredager 12.15-14.00 D1-052 Øvingstimer?? 4 obligatoriske innleveringer 4 timers skriftlig eksamen
Kodeeksempler Fagboken bruker pseudokode for alle kodeeksempler. Dette frigjør boken fra språklige tilpasninger. Alle eksempler gitt av faglærer vil bli gitt i to programmeringsparadigmer. Imperativ (Java) Funksjonell (SML)
Om Kurset Algoritmer og Datastrukturer er et helt essensielt kurs i en utviklingsorientert IT utdannelse. Kurset er derfor lagt opp etter internasjonal standard. Kurset er både vanskelig og omfattende. Vi legger opp til å unngå de tyngste teoretiske emnene, men vi legger samtidig til rette for at studentene kan sette seg så dypt inn i temaet som ønskelig. Kurset gir studenten de nødvendige ferdighetene for å kunne bedømme den beste måten å løse et hvilket som helst problem. Innsikt i algoritmer og datastrukturer er det som skiller en informatiker fra en applikasjonsutvikler.
Hva er en algoritme? Utdrag fra fagboken (CLRS) Informally, an algorithm is any well-defined computational proceduce that takes some value, or set of values, as input and produces some value, or set of values, as output. An algorithm is thus a sequence of computational steps that transform the input into the output. Dette er en uformell definisjon av en algoritme, men enda løsere definisjoner er også vanlige e.g En sekvens av faste steg som utfører en bestemt oppgave.
Hva brukes algoritmer til? The Human Genome Project er avhengig av kompliserte datastrukturer og algoritmer for lagring og analyse av alle genene i menneskelig DNA. Internettet er avhengig av algoritmer for å sende data langs den mest effektive ruten, og søkemotorene bruker avanserte algoritmer for å gjøre innholdet søkbart. Elektronisk handel er avhengig av krypteringsalgoritmer for å sikre alle elektroniske transaksjoner....
Algoritmer og Effektivitet Algoritmer som løser det samme problemet har ikke nødvendigvis samme effektivitet e.g. insertion sort vs merge sort. Effektiviteten til en algoritme er ofte viktigere enn hastigheten på maskinvaren. Maskin A med kapasitet på 10 milliarder operasjoner i sekundet kjører insertion sort, og maskin B med kapasitet på 10 millioner operasjoner i sekundet kjører merge sort. Begge maskiner skal sortere 10 millioner tall. Kjøretid A = Kjøretid B = (10 7 ) 2 instruksjoner = 10.000 sekunder 10 10 instruksjoner per sekund 107 log 10 7 instruksjoner 23 sekunder 10 7 intruksjoner per sekund
Motivasjonshistorie - Matching Edmonds publiserte i 1965 en effektiv algoritme for maximum matching i en graf [Edmonds(1965)]. Artikkelen skal i utgangspunktet ha blitt avvist på grunnlag av at en algoritme var overflødig siden problemet kunne løses ved å teste alle mulige paringer (brute force). Edmonds skal da ha kommet opp med et enkelt eksempel som illustrerte hvorfor dette raskt vil føre til problemer.
Motivasjonshistorie - Matching - Brute Force Eksempel Si at man ønsker å finne den beste paringen mellom 100 gutter og 100 jenter hvor man enkelt kan se om et par er en god match eller ikke. Dette kan løses ved å teste alle mulige kombinasjoner av enten guttene eller jentene. Dette resulterer i å teste 100! mulige kombinasjoner. 100! = 100 99 1 9.3326215 10 157 > 10 156 La oss anta at vi kan teste 10 10 kombinasjoner i sekundet og at det er 10 8 sekunder i et år (som er nokså kraftige overdrivelser). I løpet av et år vil vi da kunne teste 10 10+8 = 10 18 kombinasjoner. Vi ender da opp med at det vil ta i overkant av 10 156 18 = 10 138 år å teste alle kombinasjonene. Til sammenligning har det ikke gått mer enn 1.4 10 10 år siden universets begynnelse.
Vår Første Algoritme - Insertion-Sort Insertion-Sort er en effektiv inkrementell sorteringsalgoritme for små inputstørrelser i.e. korte sekvenser av elementer å sortere. Algoritmen er gitt under i pseudokode. Insertion-Sort(A) 1 for j = 2 to A.length 2 key = A[j] 3 / Insert A[j] into the sorted sequence A[1.. j 1]. 4 i = j 1 5 while i > 0 and A[i] > key 6 A[i + 1] = A[i] 7 i = i 1 8 A[i + 1] = key
Loop Invarianter og Insertion-Sort På ethvert steg i kjøringen av Insertion-Sort på listen A med n elementer representerer A[1.. j 1] allerede sorterte elementer, eller keys, og A[j.. n] gjenstående elementer å sortere. Dette kalles en loop invariant. Initialization: Den skal være sann før første iterasjon løkken. Maintenance: Hvis den er sann før en iterasjon skal den være sann før neste. Termination: Loop invarianten gir riktigheten av algoritmen. Sjekk riktigheten av Insertion-Sort!
Analyse av Insertion-Sort Kjøretiden til Insertion-Sort avhenger av størrelsen på input i.e. sekvensen som skal sorteres. I beste fall (best-case analysis) er kjøretiden lineær. Dette forekommer når listen allerede er sortert. I verste fall (worst-case analysis) er kjøretiden kvadratisk. Dette forekommer når listen er sortert i motsatt rekkefølge. I gjennomsnitt (average-case analysis) er kjøretiden ofte sammenlignbar med verste fall. I tilfellet med Insertion-Sort hvert element må i gjennomsnitt sammenlignes med halvparten av de sorterte elementene. Vi kommer tilbake til dette i detalj senere.
Effektivitet vs. Order of Growth Når vi analyserer effektiviteten til algoritmer er vi normalt ikke interessert i konstantfaktorene og andre detaljer av regnestykket da disse gir oss mere informasjon enn vi trenger. Vi er bare opptatt av hvordan kjøretiden endrer seg i forhold til inputstørrelsen n. Dette kalles gjerne rate of growth eller order of growth. Vi skal se nærmere på dette i neste forelesning.
Vår Andre Algoritme - Merge-Sort Vår andre algoritme er også en sorteringsaloritme, men Merge-Sort har et annet designe en Insertion-Sort. Merge-Sort er en såkalt divide-and-conquer algoritme. Divide (Del) problemet inn i delproblemer av samme problem. I dette tilfellet innebærer det å dele listen i to like store lister Conquer (Løs) delproblemene. I Merge-Sort gjøres dette ved å sortere delproblemen rekursivt. Combine (Kombiner) de løste delproblemene. De to sorterte dellistene kombineres for å produsere det endelige resultatet. I Merge-Sort håndteres de to første stegene av Merge-Sort selv, mens det tredje steget håndteres av en hjelpefunksjon Merge.
Vår Andre Algoritme - Merge Pseudokode Merge(A, p, q, r) 1 n 1 = q p + 1 2 n 2 = r q 3 let L[1.. n 1 + 1] and R[1.. N 2 + 1] be new arrays 4 for i = 1 to n 1 5 L[i] = A[p + i 1] 6 for j = 1 to n 2 7 R[j] = A[q + j] 8 L[n 1 + 1] = 9 R[n 2 + 1] = 10 i = 1 11 j = 1 12 for k = p to r 13 if L[i] R[j] 14 A[k] = L[i] 15 i = i + 1 16 else A[k] = R[j] 17 j = j + 1
Vår Andre Algoritme - Merge-Sort Pseudokode Merge algoritmen benyttes i combine steget i divide-and-conquer algoritmen Merge-Sort. Pseudokoden for sorteringsalgoritmen er listet under. Merge-Sort(A, p, r) 1 if p < r 2 q = (p + r)/2 3 Merge-Sort(A,p,q) 4 Merge-Sort(A,q+1,r) 5 Merge(A,p,q,r)
Bibliography Jack Edmonds. Maximum matching and a polyhedron with 0, 1 vertices. J. of Res. the Nat. Bureau of Standards, 69 B:125 130, 1965.