Innehåll Föreläsning 5 Algoritmer Experimentell komplexitetsanalys Kapitel 2.1-2.2, Kapitel 12.1-12.4 Algoritmer Algoritm Definition: Algoritm är en noggrann plan, en metod för att stegvis utföra något Ordet algoritm härstammar från en man, al- Khwarizmi (latinsk form Algorismus) enligt sidan http://home.swipnet.se/pelewin/prog/algoritmer.html Hans arbete (början av 800-talet) ligger till grund för modern aritmetik och algebra algebra lär komma från titeln på hans viktigaste verk al- Kitab al-mukhtasar fi hisab al-jabr wál muqabala, Kompendium i ekvationslära Han utarbetade en beräkningsmetod för att lösa ekvationer. Beräkningar gjorda enligt bestämda mönster i flera steg: algoritmer. Krav på algoritmer Bilden är tagen från sidan http://en.wikipedia.org/wiki/donald_knuth Olika sätt att beskriva en algoritm Ändlighet Algoritmen måste sluta Bestämdhet Varje steg måste vara entydigt Indata Måste ha noll eller flera indata Utdata Måste ha ett eller flera utdata Genomförbarhet Varje steg i algoritmen måste gå att utföra på ändlig tid Donald Knuth, 1938- The Art of Computer Programming (första versionen 1968) Kallas ibland algoritmanalysens fader Naturligt språk - man förklarar problemlösningen med vanlig text med införda variabel- och funktionsnamn. Blockdiagram - man visar en grov struktur av problemlösningen i form av ritade "boxar". Varje box kan vara ett delproblem. Flödesschema/flödesdiagram, strukturdiagram - man ritar algoritmen med olika symboler, som visar när och hur saker skall ske i programmet. Finare indelning än blockdiagram, t.ex. kan varje block beskrivas som flödesschema för ett delproblem. Pseudokod - man skriver en blandning av programmeringsspråk och vanlig text, dvs man har variabler, funktioner, kontrollstrukturer etc
Exempelproblem Algoritm naturligt språk Jag ska bjuda på mums mums till kaffet. Hur många förpackningar måste jag köpa? Vi antar följande: Varje förpackning innehåller 4 mums mums Varje person äter i snitt 3 mums mums om de är färska annars äter de bara 2 mums mums i snitt. Detta exempel är inspirerat av korvexemplet på sidan http://www.idt.mdh.se/kurser/cd5310/vt04rjn/lectures/f1-problemsolving.pdf 1. Fråga efter antalet personer; kalla talet för Personer. 2. Fråga om mums mumsen är färska; kalla svaret ärfärska. 3. Om ärfärska är sann 1. Multiplicera Personer med 3 (antalmumsmums) 4. Annars 1. Multiplicera Personer med 2 (antalmumsmums) 5. Dela antalmumsmums med 4. 6. Avrunda svaret uppåt till närmaste heltal; kalla detta tal för. 7. Svara med talet. Algoritm blockdiagram Personer och ärfärska Program Antal mums mums-paket Beräkna antal mums mums Beräkna Dela antal mumsmums med 4 och avrunda uppåt Visa Algoritm flödesdiagram mumsmums = personer * 3 Start personer ärfärska Är ärfärska sann? paket = mumsmums/4 avrunda uppåt mumsmums = personer * 2 Visa Stop Algoritm pseduokod Pseudokod write( antalet personer ) read(personer) write( är mumsmumsen färska? ) read(ärfärska) If ärfärska Then antalmumsmums Personer * 3 Else antalmumsmums Personer * 2 round(antalmumsmums/4) write(paket) Kursen använder pseudokod för att beskriva algoritmer Det finns inget universellt språk utan många dialekter Alla döljer mycket av programspråkens designval, dvs. pseudokoden är programspråksoberoende
Pseudokod programkonstruktioner Pseudokod exempel Beslutsstrukturer: if(...)then...[else...] Villkorsloopar: while(...)do... done eller repeat... Until(...) Räkneloopar: for(...)do... done Arrayindexering: A[i] Anrop: function(args)eller object.metod(args) Returnera värden: return value Tilldelning: Jämförelse: = Algorithm arraymax(a,n) input: An array A storing n integers output: The maximum element in A currentmax A[0] for i 1 to n-1 do if currentmax < A[i] then currentmax A[i] done return currentmax Algoritmer mer formellt Beräkningsbarhet i praktiken Algoritmiska problem & beräkningsbarhet En klass av problem Beräkningsbar omm det finns en Turingmaskin som löser problemet Turing maskin Tid och rum är begränsande resurser Ibland finns bara ett fixt utrymme Ibland blir det dyrare ju mer som används Hanterlig Försöker fånga begreppet praktisk beräkningsbarhet Ett problem är hanterligt om o o Man känner till en lösning där resurserna som krävs kan begränsas av polynomfunktioner i uppgiftens storlek (n). 2 2 3 log n, n, n,(log n), nlog n, n, n, n Problemet kan lösas på polynomtid 10000 Ohanterliga problem Hantera ohanterbarhet Problem som vi (ännu) inte funnit en hanterlig lösning på. n n Komplexiteten kan vara tex 2, n!, n Superpolynomiska: Komplexiteten överstiger varje polynomfunktion P(n) för stora n. Många ohanterliga problem är triviala att förstå och viktiga att lösa! Schemaläggning Handelsresande problemet Heuristik Lösa nästan rätt problem o Förenkling o Tex. schemalägg en lärare i taget Lösa problemet nästan rätt o Approximation o Tex. finna minimum genom att systematiskt söka av ett område med tänkbara lösningar tills skillanden mellan två sökningar är mindre än ett visst värde.
NP-kompletta problem En speciell klass av ohanterliga problem som alla är ekvivalenta: Ekvivalenta: Kan transformeras på polynomtid Högst exponentiell kompexitet Saknar bevis för ohanterbarhet Detta innebär att om vi finner lösning på ett enda av de NP-kompletta problemen så kan vi lösa alla andra problem! Schemaläggningsproblemet är ett NP-komplett problem. Hanterbara - polynom 1+n 2 +3*n Beräkningsbar/hanterbar Icke hanterbara - superpolynom (n!, nn, ) Beräkningsbara Alla (matematiska)problem Ej beräkningsbara Hanterligt eller ej... Analys av algoritmer Enligt definitionen är n 101000 hanterligt medan 1.00001 n inte är hanterligt. Vad vill man analysera hos en algoritm? Exekveringstid Minnesåtgång Korrekthet Varför analysera algoritmer? Är algoritmen praktiskt körbar? Vi vill ha den snabbaste! o Att implementera o Att köra Litet räkneexempel Exekveringstider - en dator med 1 MIPS, 1*10 6 op/sek Antag att 1 operation tar 1μs och att vi har n = 10 9 element i en lista som ska sorteras Om algoritmen i medel kräver n 2 operationer tar det 31000 år att sortera listan! Krävs n*log(n) operationer tar det 30000s 1 arbetsdag. Det spelar inte så stor roll? Datorerna blir ju dubbelt så snabba med jämna mellanrum! n 2 och dubbelt så snabb => 15500 år n 2 och 1000 gånger så snabb => 31år N 2 N 5 2 N N N 10 1/10000 1/10 1/1000 2.8 tim. 20 1/2500 3.2 sek. 1 s 3.3 billioner år 50 1/400 5.2 min. 35.7 år Drygt 10 miljarder μs på en dag 1*10 24 μs sedan Big Bang 7000 100 1/100 2.8 tim. 40000 billioner år 18500 300 9/100 28.1 dag. 7500 76800
Mäta tidsåtgången Exempel Hur ska vi mäta tidsåtgången? Experimentell analys o Implementera algoritmen o Kör programmet med varierande datamängd Storlek Sammansättning o Använd metoder för tidtagning så som System.currentTimeMillis() o Plotta uppmätt data t(ms) n Bästa, värsta & medel Experimentell analys Medel Värsta Bästa Begränsningar med metoden Måste implementera och testa algoritmen Svårt att veta om programmet har stannat eller fast i beräkningarna. T ex. 2 n ; n=100 => 40000 billioner år 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.