Algoritmer Lars Larsson VT 2007 Lars Larsson Algoritmer 1
1 2 3 4 5 Lars Larsson Algoritmer 2
Ni som går denna kurs är framtidens projektledare inom mjukvaruutveckling. Som ledare måste ni göra svåra beslut som påverkar slutprodukten. Ni måste således ha koll gällande vilka datatyper och algoritmer som är lämpliga i en situation, och framförallt varför. Lars Larsson Algoritmer 3
et med denna föreläsning är att studenterna skall ha förvärvat kunskap om: vad en algoritm är och vilka krav som ställs på dem, hur algoritmer kan beskrivas entydigt, vilka aspekter av algoritmer som kan analyseras, varför algoritmer analyseras och hur algoritmer kan analyseras experimentellt. Lars Larsson Algoritmer 4
Informell definition Formell definition Informellt är en algoritm som ett recept som man följer för att lösa ett givet problem på ett strukturerat sätt: Ett ändligt antal steg beskriver en ändlig process. Lars Larsson Algoritmer 5
Informell definition Formell definition Den formella definition vi använder på kursen är följande: Definition En algoritm är en noggrann plan, en metod för att stegvis utföra något. Lars Larsson Algoritmer 6
Informell definition Formell definition Donald Knuth ställer upp följande krav på algoritmer för att de skall vara korrekta: 1 Ändlighet algoritmer måste sluta. 2 Bestämdhet varje steg måste vara entydigt. 3 Indata måste ha noll eller flera indata. 4 Utdata måste ha ett eller flera utdata. 5 Effektivitet/genomförbarhet varje steg i algoritmen måste gå att utföra på ändlig tid. Lars Larsson Algoritmer 7
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement På grund av Knuths andra krav om bestämdhet måste vi vara mycket noggranna när vi skriver algoritmer. Detta ställer krav på vårt sätt att uttrycka oss. Vi kan välja (bland annat) något av följande sätt: (i stort sett) naturligt språk, flödesscheman, pseudokod. Lars Larsson Algoritmer 8
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Naturligt språk är vanligt språk, så som vi talar till vardags. Vi kan begränsa oss till att åtminstone använda vissa väldefinierade termer, för att undvika synonymer utan att tappa mycket i uttrycksfullhet. Problemet kvarstår dock att naturligt språk inte är precist nog. Lars Larsson Algoritmer 9
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Datorn är en formell beräkningsmodell. Alla algoritmer måste förr eller senare uttryckas på ett formellt korrekt och entydigt sätt för datorn om den som utvecklar algoritmen lämnar något oklart till implementatören, är det upp till implementatören att göra de återstående valen. Lars Larsson Algoritmer 10
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Inte minst de som läser ID kommer med säkerhet att stöta på hierarchical task analysis som är ett mycket smidigt sätt att blanda naturligt språk med en hierarkisk indelning av hur uppgifter löses. Detta kan ses som ett sätt att beskriva algoritmer, och rekommenderas för den intresserade. Se för mer information (finns via UB och på nätet): Shepherd, Andrew (1998). HTA as a framework for task analysis. Ergonomics, Vol. 4. issue 11, sid 1537 1552. Lars Larsson Algoritmer 11
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Flödesscheman visar, som namnet antyder, hur flödet i ett program går. Villkorssatser och slingor representeras grafiskt med hjälp av former som i figuren nedan. Lars Larsson Algoritmer 12
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Det sätt vi vanligtvis presenterar algoritmer (och kommer göra under kursens gång) på är i pseudokod. Pseudokod påminner om ett programmeringsspråk, men vi tillåts (sparsamt) använda vissa konstruktioner som påminner om naturligt språk. Delar av algoritmer som är uppenbara måste inte skrivas ut i kodform, utan kan bara beskrivas med en enkel mening. Lars Larsson Algoritmer 13
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Det sätt vi vanligtvis presenterar algoritmer (och kommer göra under kursens gång) på är i pseudokod. Pseudokod påminner om ett programmeringsspråk, men vi tillåts (sparsamt) använda vissa konstruktioner som påminner om naturligt språk. Delar av algoritmer som är uppenbara måste inte skrivas ut i kodform, utan kan bara beskrivas med en enkel mening. Pseudokod låter oss abstrahera bort sådant som hör implementationen till, exempelvis minneshanteringskod, felkontroller och så vidare. Algoritmen står helt i fokus. Lars Larsson Algoritmer 13
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Pseudokodens utseende varierar mycket beroende på författare, tillfälle och val av notation. Dock gäller Knuths fem krav, så algoritmen måste fortfarande vara entydig. Lars Larsson Algoritmer 14
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Pseudokodens utseende varierar mycket beroende på författare, tillfälle och val av notation. Dock gäller Knuths fem krav, så algoritmen måste fortfarande vara entydig. Det går att ha en egen stil på pseudokoden, men den måste gå att tolka på ett vettigt sätt. Eftersom läsaren antas vara programmerare kan man blanda friskt mellan matematisk notation ({, },,,...) och nyckelord från programmeringsspråk. Lars Larsson Algoritmer 14
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement Beslutsstrukturer: if (...) then... [else...] Villkorsslingor: while (...) do... done eller repeat... until (...) Räkneslingor: for (...) do... done Arrayindexering: A[i] Anrop: function(arg1, arg2,...) eller object.method(arg1, arg2,...) Returnera värden: return value Tilldelning: := (ej att förväxla med jämförelse =) Lars Larsson Algoritmer 15
Naturligt språk Flödesscheman Pseudokod Pseudokod språkelement function arraymax(a, n): input: an array A of n integer values output: the maximum integer in A currentmax := A[0] for (i = 1 to n - 1) do if (currentmax < A[i]) then currentmax := A[i] return currentmax Lars Larsson Algoritmer 16
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Innan vi implementerar vår färska entydiga och välskrivna algoritm i ett programmeringsspråk, vill vi med fördel analysera hur effektiv den är. Baserat på analysen kan vi sedan välja rätt algoritm för situationen. Lars Larsson Algoritmer 17
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Vi kan av olika teoretiska anledningar inte analysera allting om en algoritm. Vi kan dock analysera några väldigt viktiga egenskaper, inte minst deras komplexitet och deras exekveringstid och minnesåtgång. Lars Larsson Algoritmer 18
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Vi analyserar exekveringstid och minnesåtgång för att vi söker algoritmer som är praktiskt körbara och effektiva! En fråga att ta hänsyn till är vad effektivitet innebär i vissa lägen kan det duga med en algoritm som är snabbare att implementera än en som ger exekveringstidsförbättringar men som är jobbigare att implementera. Lars Larsson Algoritmer 19
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Av alla problem som finns är bara en delmängd beräkningsbara, alltså att en dator kan behandla dem överhuvudtaget. Av de beräkningsbara problemen är bara en delmängd hanterbara, alltså att en dator kan behandla dem effektivt. Det finns även problem som vi i nuläget ser som icke-hanterbara, eftersom vi ännu inte har vettiga effektiva lösningar på dem. Lars Larsson Algoritmer 20
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Det finns dock ett sätt att hantera icke-hanterbara problem (de är vanligare än man tror, exempelvis är schemaläggning ett sådant). Vad vi dock kan göra är att: vi löser nästan rätt problem, genom att införa begränsningar och således förenklar problemet eller vi kan också lösa problemet nästan rätt, alltså göra approximationer och nöja oss med ett svar som inte nödvändigtvis är det helt rätta men som duger i sammanhanget. Lars Larsson Algoritmer 21
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Vi kan mäta tidsåtgången och således få en bild av hur komplexiteten för algoritmen är genom att använda en stoppklocka, eller ännu hellre via ett program. I UNIX och på Mac finns exempelvis kommandot time som kan ge oss sådan information. Lars Larsson Algoritmer 22
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Vi kan mäta tidsåtgången och således få en bild av hur komplexiteten för algoritmen är genom att använda en stoppklocka, eller ännu hellre via ett program. I UNIX och på Mac finns exempelvis kommandot time som kan ge oss sådan information. Det finns dock ett problem: hur vet vi att programmet fortfarande körs? Tänk om det har hängt sig? Tänk om det störs av andra processer? Lars Larsson Algoritmer 22
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Antag att vi har en dator som klarar 1 operation på en µs och att vi har en lista som består av n = 10 9 element. Lars Larsson Algoritmer 23
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Antag att vi har en dator som klarar 1 operation på en µs och att vi har en lista som består av n = 10 9 element. Använder vi en dålig sorteringsalgoritm som kräver n 2 antal operationer, så tar det runt 31000 år att sortera listan. Lars Larsson Algoritmer 23
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Antag att vi har en dator som klarar 1 operation på en µs och att vi har en lista som består av n = 10 9 element. Använder vi en dålig sorteringsalgoritm som kräver n 2 antal operationer, så tar det runt 31000 år att sortera listan. Använder vi dock en smart sorteringsalgoritm som kräver n log(n) operationer tar det istället runt 30000 sekunder, ungefär motsvarande en arbetsdag. Lars Larsson Algoritmer 23
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Antag att vi har en dator som klarar 1 operation på en µs och att vi har en lista som består av n = 10 9 element. Använder vi en dålig sorteringsalgoritm som kräver n 2 antal operationer, så tar det runt 31000 år att sortera listan. Använder vi dock en smart sorteringsalgoritm som kräver n log(n) operationer tar det istället runt 30000 sekunder, ungefär motsvarande en arbetsdag. Men, givetvis är datorer snabbare än så! Och de blir snabbare för varje år! Problemet kvarstår dock: med en tusen gånger snabbare dator tar det ändå 31 år i n 2 -fallet... Lars Larsson Algoritmer 23
för analys Varför analys genomförs Beräkningsbarhet och hanterbarhet Experimentell mätning Exekveringstidsexempel Nästa föreläsning, den som följer direkt efter denna, handlar tack och lov om ett matematiskt sätt att bestämma komplexiteten exakt, så vi slipper sådana problem! Lars Larsson Algoritmer 24