Datastrukturer och algoritmer



Relevanta dokument
Datastrukturer och algoritmer

Datastrukturer och algoritmer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Datastrukturer och algoritmer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Datastrukturer och algoritmer

Datastrukturer och algoritmer

Rekursion. Rekursiv lösningsstrategi. Algoritmkonstruktion. Exempelproblem Hitta största elementet i en sekvens v i där i 1... n.

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 12. Söndra och härska

Innehåll. Föreläsning 10. Specifikation. Mängd. Specifikation. Konstruktion av mängd. Mängd Lexikon Hashtabell

Programkonstruktion och Datastrukturer

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 12. Söndra och härska

Datastrukturer och algoritmer

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13. Dynamisk programmering

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Föreläsning 8 Innehåll

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Datastrukturer och algoritmer

Vad har vi pratat om i kursen?

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 13. Dynamisk programmering

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 2 Datastrukturer (DAT037)

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Föreläsning 11. Giriga algoritmer

Föreläsning 11 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Programmering = modellering

Problemlösning. Planering av program. Konstruktion. Programmeringsmetaforer. Problemlösning. Programmering = Problemlösning

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning 13 Datastrukturer (DAT037)

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

Föreläsning 11. Giriga algoritmer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 5. Rekursion

TDDC74 Programmering, abstraktion och modellering. Tentamen

Föreläsning 1. Introduktion. Vad är en algoritm?

Föreläsning 13 Datastrukturer (DAT037)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Tentamen Datastrukturer (DAT037)

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Tentamen: Programutveckling ht 2015

Tentamen Datastrukturer D DAT 036/INN960

Datastrukturer och algoritmer

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT036)

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Tentamen Datastrukturer, DAT037 (DAT036)

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 4: Kombinatorisk sökning

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Teoretisk del. Facit Tentamen TDDC (6)

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Tommy Färnqvist, IDA, Linköpings universitet

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Problemlösning och funktioner Grundkurs i programmering med Python

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Innehåll. Föreläsning 11. Organisation av Trie. Trie Ytterligare en variant av träd. Vi har tidigare sett: Informell specifikation

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning Datastrukturer (DAT036)

Länkade strukturer, parametriserade typer och undantag

Föreläsning 5. Rekursion

Algoritmer, datastrukturer och komplexitet

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Tentamen, Algoritmer och datastrukturer

Tommy Färnqvist, IDA, Linköpings universitet

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

Datastrukturer och algoritmer

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Algoritmer och datastrukturer TDA143

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Innehåll. Inblandade personer. ÿkurspresentation Inblandade personer Administration Målsättning Förkunskaper Kursutvärdering Upplägg Översikt

Rekursion och induktion för algoritmkonstruktion

Datastrukturer och algoritmer. Innehåll. Trie. Informell specifikation. Organisation av Trie. Föreläsning 13 Trie och Sökträd.

Transkript:

Innehåll Datastrukturer och algoritmer Föreläsning14 Abstrakta datatyper Generella teorier Algoritmer Problemlösningsstrategier Typer av algoritmer 418 419 Abstrakta datatyper Ett koncept för att kunna diskutera och jämföra olika typer av datastrukturer. Ligger på en hög abstraktionsnivå. Främst intresserad av struktur och organisation, inte implementation. Operationerna ger datatypen karaktär och specifikationen visar datatypens uttrycksfullhet. 420 Operationskategorier (l) Konstruktorer - skapar/bygger upp och returnerar ett objekt av aktuell ADT Grundkonstruktorer som saknar argument av den aktuella ADT:n Empty, Make, Create Vidareutvecklande konstruktorer som tar ett argument av den aktuella ADT:n List-Insert, Stack-Push Kombinerande konstruktorer som tar flera argument av den aktuella ADT:n Set-Union 421 Operationskategorier (2) Inspektorer - Undersöker ett objekts inre uppbyggnad på olika sätt Avläsning eller sondering av elementvärden eller strukturella förhållanden Inspect-value, Stack-Top, Table-Lookup, Set-Choose Test av olika extremfall av struktur och värden Binary-tree-has-left-child, Set-member-of Mätning av objekt Isempty, Has-value 422 Operationskategorier (3) Modifikatorer Ändrar ett objekt struktur och/eller elementvärden Insättning, borttagning, tilldelning omstrukturering Array-Set-Value, Table-Remove, Stack-Pop, Set-Insert Navigatorer Används för att ta fram ett objekts struktur Landmärken (kända positioner), lokala förflyttningar, traverseringar List-First, List-End, List-next, Binary-tree-left-child Komparatorer jämför objekt av den aktuella ADTn med varandra Equal, Set-Subset 423

Uttrycksfullhet Abstrakt datatyp = objekt + konstruktion av gränsytan. Frågor att fundera kring vid skapande av ADT: Vilken är värdemängden? Vilka interna resp. externa egenskaper har objekten? Vad ska man göra med objekten? Specificera en gränsyta informellt och formellt. Överväga olika implementationsmöjligheter. Kan jag göra det jag vill kunna göra med objekten?? Uttrycksfullhet 424 Uttrycksfullhet Datatypsspecifikationen har två roller: Slå fast hur datatypen är beskaffad, vilka egenskaper den har. Fungerar som en regelsamling för användningen av datatypen. Specifikationens uttrycksfullhet kan mätas med tre begrepp Objektfullständighet Algoritmfullständighet Rik gränsyta 425 Är det svagaste kriteriet. Objektfullständighet Det ska vara möjligt att konstruera och skilja mellan alla objekt som anses höra till datatypen. Man ska kunna skilja på två objekt A och B med en sekvens av operationer I O l O 2 O n (n!0) (I = Inspektor, O = Operation) Om vi tittar på en tabell Empty, Insert och Max (största definierade tabellvärdet) är inte objektfullständigt. Kan inte skilja på två tabeller med samma max-värde. Empty, Insert och Lookup räcker! 426 Algoritmfullständighet (Expressive completeness) Starkare än (och implicerar) objektfullständighet. Man ska kunna implementera alla algoritmer i denna datatyp. Dvs allt som man kan göra med datatypen ska också gå att implementera utifrån specifikationens operatorer. Räcker att visa att man kan implementera ett test av likhet mellan två dataobjekt med hjälp av operationerna. Vill man veta varför: Läs artikeln (Kapur, Srivas Computability and implementability issues in abstract data types ). Alltså: Algoritmfullständighet = objektfullständighet + likhetstest 427 Rik gränsyta (Expressive richness) Starkaste kriteriet, implicerar både objektfullständighet och algoritmfullständighet. Även om man har algoritmfullständighet så kan vissa algoritmer bli hopplöst ineffektiva. Krav: Man ska med hjälp av gränsytan kunna implementera speciella analysfunktioner som kan Ta fram all information som krävs ur ett dataobjekt för att sedan kunna rekonstruera objektet med enbart komposition av analysfunktionerna. De olika analysfunktionerna får varken innehålla iteration eller rekursion i sin definition. Rik gränsyta-exempel Stack-specifikationen har en rik gränsyta. Isempty kan avgöra om stacken är Empty eller konstruerad som push(x, s) för något x och s. Top ger x och Pop ger s. För vilken stack som helst kan ändliga kompositioner av dessa analysfunktioner plocka ut vart och ett av elementen i stacken hitta strukturen, ordningen på dem utifrån detta kan stacken återskapas 428 429

Praktisk uttrycksfullhet Vi har teoretiska mått på uttrycksfullhet Objektfullständighet, algoritmfullständighet och rik gränsyta. Måste man uppfylla alla tre kraven? Ibland blir en rik gränsyta opraktisk, man saknar vissa operationer. Utskrifter, längdfunktioner eller kopieringsfunktioner tex. Hur skapar man en gränsyta? 430 Att utforma en gränsyta Man utgår från de operationer som bidrar till att ge ADTn sin speciella karaktär. Sedan applicerar man de teoretiska begreppen. Lägger till vissa operationer och tar bort andra. Målet är att operationerna Ger en objektfullständig gränsyta Är primitiva (kan inte delas upp i mindre operationer) Ger en algoritmfullständig gränsyta Är oberoende, kan inte ta bort en enda operation och ändå ha kvar en algoritmfullständig gränsyta. Detta ger en rätt stram yta med få operationer. 431 Fördelar med en stram gränsyta Utbytbarhet Man kan börja med enkla implementationer och sedan byta ut mot allt effektivare. Portabilitet Mindre problem att flytta ett program med få op. Integritet Mindre risk för att operationer läggs till som strider mot grundidén med ADTn. Programspråksstöd för ADTs Många språk ger mycket litet eller inget stöd alls. Då krävs: Konventioner Namngivning Operationsval God dokumentation av olika val som görs. Disciplin Inte gå in och peta i interna strukturer 432 433 Design av algoritmer Typer av algoritmer (lösningstekniker) Brute force Giriga algoritmer (Greedy-algorithms) Söndra och härska (Divide and Conquer) Dynamisk programmering Brute force En rättfram ansats där man utgår direkt från problemställningen och de definitioner som finns där. Om problemet är kombinatoriskt så gör man en fullständig sökning Genererar och numrerar alla tänkbara svar/lösningar Välj den bästa lösningen Bra metod att starta med Garanterar en korrekt lösning om en sådan finns MEN garanterar inte effektivitet Ofta väldigt enkla algoritmer 434 435

Brute force: Exempel Linjär sökning Söka det minsta talet i en lista Antar att alla element är det lägsta Kolla alla mot alla Handelsresande problemet Besöka alla städer bara en gång På minst kostsamma sätt Brute force (2) Många problem vet man inte av någon bättre lösning än brute force till. Ger ofta hög tillväxt på tidskomplexiteten Speciellt för problem där antalet svar ökar snabbt med ökad problemstorlek Går ofta att effektivisera de naiva algoritmerna Avbryta en sökning när man nått en lösning Bättre med en lösning än den bästa. Avbryta så fort man inser att vägen inte leder till en lösning 436 437 Giriga (Greedy) algoritmer METOD: I varje steg titta på alla möjliga steg och välj den för tillfället bästa vägen. Bra för optimeringsproblem I många fall får vi optimal lösning med en greedy algoritm. Om den optimala lösningen kan nås via stegvisa lokala förändringar av starten Heuristisk metod vs. greedy Garanti för optimal lösning " greedy Bra alternativ till brute force Exempel Att lämna tillbaka växel Minimalt antal mynt i växel Ta alltid det största möjliga myntet i varje loopvarv Minimalt uppspänt träd Kruksals algoritm Prims algoritm Kortaste vägen i en graf (Dijkstras algoritm) Huffman-kodning algoritmer 438 439 The Fractional Knapsack Problem Givet, en mängd p med n element där element i har värde/ förtjänst b i (benefit) > 0 och en vikt w i > 0 Mål: Välja element med maximal förtjänst utan att den totala vikten blir mer än den maximala vikten W. I The Fractional Knapsack Problem får man ta bitar av elementen (fractions). Låt x i vara mängden vi tar av element i Maximera:!! med begränsningen: Regel: För varje gång ta elementet med maximalt värde (förtjänst/vikten). 440 441 O(n log n)

METOD: Söndra och härska (Divide and Conquer) Söndra: Dela upp datat/problemet i två eller flera delar som löses rekursivt. Dessa delar bör vara ungefär lika stora. Härska: Konstruera en slutlösning från dellösningarna. Leder till rekursiva algoritmer med minst två rekursiva anrop. Kan vara en lösning när det är svårt hitta iterativa lösningar Är ibland effektivare även om det finns iterativ lösning Ibland beräknas en dellösning många gånger (= ineffektivt) O(n log n) är vanligt Merge-sort och Quick-sort Kan ställa krav på implementationen av ADT:n 442 Exempel: x n Beräkna iterativt eg x*x*x*...*x ger algoritm som är O(n) Divide and conquer: vi kan bryta ner problemet och beräkna x ciel(n/2) *x floor(n/2) rekursivt Fast det ger inget :( I de båda rekursiva anropen så beräknar vi i stort sett alltid samma värden... Kan vi utnyttja detta och vinna något? 443 Dynamisk programmering Undviker problemet med söndra och härska, dvs att samma problem kan lösas flera gånger. METOD: Lös större och större problem tills man har löst sitt problem av storlek n, och använd information från föregångarna för i varje steg Ställ upp en tabell som håller reda på redan kända lösningar. För varje nytt anrop kollar man om man redan löst det problemet och hämtar det Om inte löser man det och sätter in lösningen i tabellen. Exempel l-dimensionell Fib(n) = Fib(n-1)+Fib(n-2); Fib(0)=1;Fib(1)=1 Multi-dimensionell dynamisk programmering Matrisbaserad shortest path (Floyd) 0-l knapsack Där får man alltså inte delar av elementen utan måste ta allt på en gång. 444 445 Exempelproblem: Du ska skapa ett program som spelar ett spel mot en person med följande regler. Det ligger 30 tändstickor på bordet. Spelarna får plocka upp 1, 2, eller 3 tändstickor varje gång och spelet pågår tills den sista stickan plockas upp. Den som tar upp sista stickan förlorar. Om datorn alltid får börja, hur ska den se till att den vinner? Vilken algoritm? Brute-force Testa alla varianter och leta fram den bästa Giriga algoritmer Hur vet man i varje steg vilken väg som är den bästa? Divide and Conquer Hur ska man dela upp? Dynamisk programmering 446 447

Dynamisk programmering Vi börjar med problemet nedifrån och upp. Målet: Datorns sista drag ska lämna en sticka kvar. Hur kan jag hamna i det läget? Om motspelaren startar ett spel med bara 5 stickor: OK, hur få motspelaren att hamna med 5 stickor? Se till att denne hamnar med 9 stickor! Fortsätt tänka bottom-up 1, 5, 9, 13, 17, 21, 25, 29 Alltså ska datorn alltid starta med att bara dra en sticka! Dator 448 Kvar 3 1 1 2 2 1 1 3 1 Motspelare Motspelare Dator Kvar 3 1 5 2 2 5 1 3 5 THE END (start på repetition) 449