Föreläsning 1 Introduktion TDDC70/91: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 3 september 2013 Tommy Färnqvist, IDA, Linköpings universitet 1.1 Innehåll Innehåll 1 Administrativ information 1 1.1 Upplägg............................................ 2 2 DALG introduktion 2 2.1 Algoritmanalys........................................ 6 2.2 Övre och undre gränser.................................... 8 2.3 En beräkningsmodell..................................... 9 1.2 1 Administrativ information Lärare och personal Kursledare, examinator, föreläsningar: Tommy Färnqvist tommy.farnqvist@liu.se Assistent, lektioner, labbar: Hannes Uppman hannes.uppman@liu.se Assistent, lektioner, labbar: Victor Lagerkvist victor.lagerkvist@liu.se Assistent, lektioner, labbar: Bogdan Tanasa bogdan.tanasa@liu.se Kursadministratör: Liselotte Lundberg liselotte.lundberg@liu.se 1.3 Litteratur Michael T. Goodrich, Roberto Tamassia Data Structures and Algorithms in Java (5th edition) Wiley 2010 Uppgiftssamling till lektionerna (.pdf på kurshemsidan) Labbkompendium (.pdf på kurshemsidan) 1.4 Examination Skriftlig tentamen (oktober, januari och augusti) 4 laborationsuppgifter Laborationerna skall vara redovisade senast vid första tentamenstillfället. Det är iofs möjligt att redovisa laborationerna senare, men endast i samband med kursens omtentamenstillfällen. Kontakta i så fall laborationsassistenten i god tid. Om laborationskursen inte är godkänd i sin helhet vid andra omtentamenstillfället skall nästa års laborationskurs göras i sin helhet. 1.5 1
1.1 Upplägg Föreläsningar Administration, mål, komplexitet, ordo-notation Algoritmanalys Enkla abstrakta datatyper: stack, kö, lista Hashning, skiplistor Binära sökträd AVL-träd, multivägs-sökträd Prioritetsköer, heapar Sortering I Sortering II ADTn graf Grafsökning, topologisk sortering, kortaste väg Metoder för algoritmdesign Lektioner 5 lektioner i form av räknestugor Uppgiftssamling tillgänglig via kurshemsidan Laborationer Hashning (Java) Binära sökträd (Java) Quick-sort (Java) Ordkedjor (Java) Var vänlig registrera er senast 13 sep i webreg och i KATTIS Bonusproblem Bonuspoäng på tentan 1.6 1.7 1.8 1.9 Din insats i kursen Följ undervisningen (om du vill) Läs kurslitteraturen Plugga under hela kursen Gör datorlabb 1 4 Lös bonusproblem för att få bonuspoäng Tenta! Första chansen är den 28 oktober Kursens hemsida http://www.ida.liu.se/~tddc70/ 1.10 Påbyggnadskurser TDDD20 Konstruktion och analys av algoritmer Grundläggande tekniker. (Giriga algoritmer, dekomposition och dynamisk programmering.) NP-fullständighet. (Teorin för NP-fullständighet och dess konsekvenser.) Inexakta metoder. (Konstruktion och analys av approximationsalgoritmer och randomiserade algoritmer.) TDDD65 Introduction to the Theory of Computation Ändliga automater och reguljära uttryck. Kontextfria grammatiker och pushdown-automater. Turingmaskiner och Church-Turing thesis. Ordonotationen, komplexitetsanalys av algoritmer. Tidskomplexitetsklasser P och NP. NP-kompletta problem. Orientering om rumskomplexitet. 1.11 2 DALG introduktion Kursmål enligt studiehandboken Efter genomgången kurs skall den studerande ha god förmåga att analysera tids- och rumkomplexitet hos iterativa och enkla rekursiva algoritmer. Studenten skall vara väl insatt i de vanligaste abstrakta datatyperna och hur de kan implementeras med olika datastrukturer och algoritmer. Studenten ska vara förtrogen med de vanligaste sorteringsalgoritmerna och vara insatt i etablerade metoder för design (och analys) av algoritmer i allmänhet. 1.12 2
Kursöversikt Datastrukturer Hur lagrar man data effektivt Teoretiskt sett effektiva datastrukturer Praktiskt sett effektiva datastrukturer Algoritmer Hur löser man problem effektivt Analys av komplexitet Exempel på olika slags algoritmer Sorteringsalgoritmer Grafalgoritmer Konstruktionsmetoder 1.13 Simuleringsalgoritmer Numeriskaalgoritmer Scientificcomputing Kodoptimering ikompilator Heltalsprogrammering Analys avprog. repr.i kompilator Strängsökning Linjärprogrammering DALGADTerSorteringGrafer Internetalgoritmer Algoritmer försociala nätverk Datoralgebra Algoritmer förnätverksflöden Kryptografiskaalgoritmer Databaser Beräkningsgeometri Datorgrafikoch multimedia 1.14 Gammalt ursprung, nya möjligheter Studiet av algoritmer har pågått åtminstone sedan Euklides Formaliserades av Chruch och Turing på 1930-talet Vissa viktiga algoritmer upptäcktes av studenter i liknande kurser som denna! För att kunna lösa annars olösbara problem T.ex. nätverkskonnektivitet 3 1.15
1.16 För intellektuell stimulans 1.17 För att bli en kunnig programmerare 1.18 För att DALG kan hjälpa oss att lista ut saker om livet och universum Datorbaserade modeller ersätter matematiska modeller i vetenskapliga undersökningar 1.19 4
DALG grunder Abstrakta datatyp (ADT) maskinoberoende högnivåbeskrivning av data och operationer på data t.ex. Stack, Kö, Mängd,... Datastruktur logisk organisation av datorns minne för att lagra data Algoritm högnivåbeskrivning av konkreta operationer på datastrukturer ADT implementeras med lämpliga datastrukturer och algoritmer Program implementerar algoritmer och datastrukturer i något visst programspråk 1.20 Definition 1 (Algoritm). En algoritm är en ändlig beskrivning av hur man steg för steg löser ett problem. En algoritm tar oftast indata som beskriver en probleminstans och producerar utdata som beskriver probleminstansens lösning. En algoritm kan ses som en funktion A : PROBLEMINSTANSER LÖSNINGAR. A probleminstanser lösningar 1.21 Algoritm Korrekthet att det beräknade utdatat för varje givet indata stämmer med problemets beskrivning Algoritmanalys tids- och minnesåtgång, skalbarhet, effektivitet, värsta fallet, bästa fallet, medelfallet, amorterad analys Algoritmiska paradigm vanligt förekommande problemlösningsstrategier, t.ex. rekursiv nedbrytning, dynamisk programmering, giriga algoritmer,... Pseudokod, boken kapitel 1.9.2 algoritmer beskrivs med pseudokod, en blandning av naturligt språk och programmeringskonstruktioner 1.22 Exempel Implementation av ADTn Lexikon med datastrukturen ordnad array/tabell. function LOOKUPTABLE(table T [1,..., n],key k) for i from 1 to n do if T [i] = k then return true if T [i] > k then return false return false 1.23 5
En annan implementation ADTn Lexikon representerad som en ordnad enkellänkad lista. function LISTSEARCH(pointer List,key k) P List while P null and KEY(P) k DO IF KEY(P)= k THEN return true P NEXT(P) return false 1.24 Diskussion En ADT berättar vad som ska göras: en uppsättning operationer på data. För att beskriva hur detta ska göras väljer vi en datastruktur (en representation i minnet) konstruerar vi algoritmer som utför ADT-operationerna Samma ADT kan implementeras med olika datastrukturer med olika algoritmer Algoritmerna beror på den valda datastrukturen. Välj den mest effektiva lösningen. Vad är effektivitet? 1.25 2.1 Algoritmanalys Analys av algoritmer Vad ska vi analysera? Korrekthet (inte i denna kurs) Terminering (inte i denna kurs) Effektivitet, resursförbrukning, komplexitet Tidskomplexitet hur lång tid tar algoritmen i värsta fallet? som funktion av vad? vad är ett tidssteg? Minneskomplexitet hur stort minne behöver algoritmen i värsta fallet? som funktion av vad? mätt i vad? tänk på att funktions- och proceduranrop också tar minne 1.26 Hur man kan jämföra effektivitet Studera exekveringstid (eller minnesåtgång) som en funktion av storleken på indata. När är två algoritmer lika effektiva? När är en algoritm bättre än en annan? Jämförelse med några elementära funktioner n log 2 n n nlog 2 n n 2 2 n 2 1 2 2 4 4 16 4 16 64 256 6.5 10 4 64 6 64 384 4096 1.84 10 19 1.84 10 19 µsekunder = 2.14 10 8 dagar = 583.5 årtusenden 1.27 6
Förenkla beräkningarna 1.28 Hur komplexitet kan anges växande Ω( ) Θ( ) O( ) Hur ändras komplexiteten för växande storlek n på indata? Asymptotisk komplexitet vad händer när n växer mot oändligheten? Mycket enklare om vi bortser från konstanta faktorer. O( ) växer högst lika snabbt som Ω( ) växer minst lika snabbt som Θ( ) växer lika snabbt som 1.29 Ordo-notation f,g: växande funktioner från N till R + f O(g) omm det existerar c > 0,n 0 > 0 sådana att c g(n) för alla n n 0 Intuition: Bortsett från konstanta faktorer växer f inte snabbare än g f Ω(g) omm det existerar c > 0,n 0 > 0 sådana att c g(n) för alla n n 0 Intuition: Bortsett från konstanta faktorer växer f minst lika fort som g Θ(g(n)) omm O(g(n)) och g(n) O( ) Intuition: Bortsett från konstanta faktorer växer f och g lika snabbt NOTERA: Ω är motsatsen till O, dvs f Ω(g) omm g O( f ). 1.30 7
Jämförelser av tillväxt 4g(n) 3g(n) 2g(n) g(n) n 4g(n) 4g(n) 3g(n) 3g(n) Ω(g),Θ(g),O(g)...? g(n) 2g(n) n 2g(n) g(n) n 1.31 Regler för ordo-notation Om är ett polynom av grad d så gäller O(n d ), dvs Strunta i lägre ordningens termer Strunta i konstanta faktorer Använd minsta möjliga klass av funktioner säg 2n O(n) i stället för 2n O(n 2 ) Använd enklast möjliga representant för klassen säg 3n + 5 O(n) i stället för 3n + 5 O(3n) 1.32 Ett sätt att jämföra tillväxt f,g: växande funktioner från N till R + L = lim n g(n) f O(g) om L < f Ω(g) om L > 0 f Θ(g) om 0 < L < 1.33 2.2 Övre och undre gränser Analys av problem Ringa in ett problems komplexitet! Övre gräns: Ge en algoritm som löser problemet. Algoritmens komplexitet är en övre gräns för problemets komplexitet. Undre gräns: Ofta svårt att ange. Egenskaper hos problemet måste användas. måste titta på alla indata Ω(n) måste producera hela utdata beslutsträd ett visst antal olika fall måste särskiljas 1.34 8
2.3 En beräkningsmodell En farbror Copyright 2009 Los Alamos National Security, LLC All rights reserved John von Neumann (1903 1957) John von Neumann har lämnat viktiga bidrag till den rena matematiken, kvantfysiken, spelteorin, de ekonomiska vetenskaperna och datalogin. Han är en av datavetenskapens banbrytare med bidrag till utvecklingen av logisk design och teorin om cellautomater. Han utvecklade den datorarkitektur som bär hans namn och som utgör grunden för så gott som alla kommersiellt tillgängliga datorer. 1.35 RAM (Random Access Machine) indataband: x 1 x 2... x n programräknare (PC) programsatser minne: r 0 r 1 r 2 r 3. utdataband: y 1 y 2... y n Programmet består av vanliga satser som utförs sekvensiellt (inte parallellt). Varje sats kan bara läsa och påverka ett konstant antal minnesplatser. Bara en symbol kan läsas/skrivas i taget. Varje sats tar konstant tid. På grund av O()-notationens robusthet kan vi strunta i vilka värdena konstanterna har. 1.36 Kostnadsmått Enhetskostnad varje operation tar en tidsenhet varje variabel tar upp en minnesenhet beräkningsmodell: RAM Bitkostnad varje bitoperation tar en tidsenhet varje bit tar upp en minnesenhet beräkningsmodeller: RAM med begränsad ordlängd, turingmaskin Exempel: Addition av två n-bitsheltal tid O(1) med enhetskostnad tid O(n) med bitkostnad 1.37 9