Datastrukturer och algoritmer

Relevanta dokument
Datastrukturer och algoritmer

Datastrukturer och algoritmer

Datastrukturer. föreläsning 3. Stacks 1

Datastrukturer och algoritmer

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

Föreläsning 4 Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

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

Datastrukturer och algoritmer

Föreläsning 3. Stack

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

Föreläsning 14 Innehåll

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 Datastrukturer (DAT036)

Föreläsning 3. Stack

Tentamen Datastrukturer (DAT036)

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

Seminarium 13 Innehåll

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

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer och algoritmer

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

Föreläsning 9 Innehåll

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Tentamen Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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.

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.

Föreläsning 9 Datastrukturer (DAT037)

Länkade strukturer. (del 2)

Tentamen Datastrukturer, DAT037 (DAT036)

Lösningar Datastrukturer TDA

Föreläsning Datastrukturer (DAT037)

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

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

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

Föreläsning 3 Datastrukturer (DAT037)

Datastrukturer och algoritmer

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

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

Tentamen i Algoritmer & Datastrukturer i Java

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 13 Datastrukturer (DAT037)

Tentamen kl Uppgift 4. Uppgift 5

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

Magnus Nielsen, IDA, Linköpings universitet

Sökning och sortering

Föreläsning 10. ADT:er och datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning Datastrukturer (DAT036)

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

Tentamen, Algoritmer och datastrukturer

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

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 13 Innehåll

Datastrukturer och algoritmer

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 7. Träd och binära sökträd

Föreläsning 2 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

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

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

Datastrukturer. föreläsning 10. Maps 1

Datastrukturer och algoritmer

Programmering för språkteknologer II, HT2014. Rum

Trädstrukturer och grafer

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

Föreläsning 11. ADT:er och datastrukturer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Algoritmer och datastrukturer TDA Fredrik Johansson

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Algoritmer och datastrukturer TDA143

Tentamen Datastrukturer (DAT037)

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT037)

Tentamen TEN1 HI

Tentamen Datastrukturer för D2 DAT 035

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Transkript:

Datastrukturer och algoritmer Föreläsning 5 Innehåll Vi har tittat på Abstrakta datatyper o Lista, Cell, Fält, Tabell, Stack, Kö, Träd (ordnade och binära), Graf, Mängd, Lexikon, Prioritetskö, Heap, Trie, Binärt sökträd, AVL-träd, B-tree, Algoritmdesign o Traversering, Sökning, Sortering, Maximalt flöde, Minimalt uppspännande träd, Kortaste vägen etc o Tids- och rumskomplexitet Vad finns det för generella teorier? Kapitel 9 Abstrakta datatyper Operationskategorier (l) 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. 4 Konstruktorer - skapar/bygger upp och returnerar ett objekt av aktuell ADT Grundkonstruktorer o saknar argument av den aktuella ADT:n o Empty, Make, Create Vidareutvecklande konstruktorer o ett argument av den aktuella ADT:n o List-Insert, Stack-Push Kombinerande konstruktorer o flera argument av den aktuella ADT:n o Set-Union Operationskategorier () 5 Inspektorer - Undersöker ett objekts inre uppbyggnad på olika sätt Avläsning eller sondering av elementvärden eller strukturella förhållanden o Inspect-value, Stack-Top, Table-Lookup, Set-Choose Test av olika extremfall av struktur och värden o Binary-tree-has-left-child, Set-member-of Mätning av objekt o Isempty, Has-value Operationskategorier () 6 Modifikatorer Ändrar ett objekts struktur och/eller elementvärden Insättning, borttagning, tilldelning omstrukturering o 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 o List-First, List-End, List-Next, Binary-tree-left-child Komparatorer jämför objekt av den aktuella ADTn med varandra Equal, Set-Subset

Uttrycksfullhet Uttrycksfullhet 7 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?? 8 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 9 Objektfullständighet Är det svagaste kriteriet. 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 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! 0 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. o Vill man veta varför: Läs artikeln (Kapur, Srivas Computability and implementability issues in abstract data types ). Alltså: Algoritmfullständighet = objektfullständighet + likhetstest 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 o plocka ut vart och ett av elementen i stacken o hitta strukturen, ordningen på dem o utifrån detta kan stacken återskapas

Praktisk uttrycksfullhet Att utforma en gränsyta 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. o Utskrifter, längdfunktioner eller kopieringsfunktioner tex. Hur skapar man en gränsyta? 4 Utgå från de operationer som ger 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. Fördelar med en stram gränsyta Programspråksstöd för ADTs 5 Utbytbarhet Börja med enkla implementationer och sedan byta ut mot allt effektivare. Portabilitet Mindre problem att flytta ett program Integritet Mindre risk för att operationer läggs till som strider mot grundidén med ADTn. 6 ML abstype Operationerna är samlade på ett ställe. Starkt stöd för att dölja implementationen. Man kan bara nå typen via operationen inte gena och utnyttja intern struktur. exception EmptyStack abstype 'a stack = Stack of 'a list with val emptystack = Stack [ ] fun isemptystack (Stack S) = (S = [ ]) fun push (Stack S, v) = Stack (v::s) fun top (Stack [ ]) = raise EmptyStack top (Stack (x::xs)) = x fun pop (Stack [ ]) = raise EmptyStack pop (Stack (x::xs)) = Stack xs end Programspråksstöd för ADTs Generisk Stack i Java 7 Java Man har ett interface eller en abstrakt klass som definierar ADTn. Finns inget naturligt stöd för att ta bort/dölja vissa delar av gränsytan. Före version.5... Skapar underklasser för olika implementationer av ADTn. Utnyttjas Object kan man inte se till att alla element är av samma typ. Från och med.5 finns Generics 8 public interface Stack<E> { public boolean isempty(); public void push(e elem); public E top() throws EmptyStackException; public E pop() throws EmptyStackException; public class EmptyStackException extends Exception{ public EmptyStackException(){ super(); public EmptyStackException(String s){ super(s);

Generisk Stack i Java Generisk Stack i Java 9 public class ArrayStack<E> implements Stack<E> { public static final int CAPACITY = 000; private E stack[]; private int top = -; public ArrayStack(){ stack = (E[])new Object[CAPACITY]; public boolean isempty(){ return (top < 0); 0 public void push(e obj){ if ((top+) < CAPACITY){ top = top + ; stack[top] = obj; public E top(){ return stack[top]; public E pop(){ E elem; elem = stack[top]; stack[top] = null; top = top - ; return elem; Programspråksstöd för ADTs Design av algoritmer Många språk ger mycket litet eller inget stöd alls. Då krävs: Konventioner o Namngivning o Operationsval God dokumentation av olika val som görs. Disciplin o Inte gå in och peta i interna strukturer Problemlösningsstrategier Top-down Bottom-up Typer av algoritmer (lösningstekniker) Brute-force Giriga algoritmer (Greedy-algorithms) Söndra och härska (Divide and Conquer) Dynamisk programmering Biologiskt inspirerade algoritmer Brute-force Brute-force: Exempel Rättfram ansats, 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 4 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 () 5 Brute force enda kända lösningen för många problem. Ger ofta hög tillväxt på tidskomplexiteten Speciellt för problem där antalet svar ökar snabbt med ökad problemstorlek Naiva algoritmer går ofta att effektivisera Avbryt sökningen när man nått en lösning o Bättre med en lösning än den bästa. Avbryt så fort man inser att vägen inte leder till en lösning 6 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. o 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 algoritmer 7 Exempel på giriga algoritmer 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 (Diijsktras algoritm) Huffman-kodning 8 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 ( x w ) Maximera: med begränsningen: x i i i i W i S i S Regel: För varje gång ta elementet med maximalt värde (förtjänst/vikten). O(n log n) b / 9 0 Söndra och härska (Divide and Conquer) METOD: 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(nlogn) är vanligt Merge-sort och Quick-sort Kan ställa krav på implementering av ADT

Ex: Finn minsta elementen i en lista Söndra och härska algoritm kanske? Första försöket: Sortera listan O(nlogn) Ta fram de två första elementen O() Alternativ Hitta en effektiv lösning på ett enklare problem o lösa nästan rätt problem vs lösa problemet nästan rätt o Enklare att hitta bara det minsta elementet! O(n) n-l jämförelser o Konvertera till originalproblemet. Vad får vi då? O(*n)? Hitta en ineffektiv lösning på originalproblemet Hur skall vi dela data? Två halvor och söka efter minsta i båda halvorna? o Detta ger inte en korrekt lösning Om vi sorterar båda halvorna och sedan i sammanslagningen hitta de två elementen då? o Merge-sort eller? o Ineffektiv för detta problem Kan vi dela data på något annat sätt? o Byta delnings faktor till, ger det något? Njet o Men. Om vi delar upp listan i par Dynamisk programmering N/ par, sortera dessa Det första paret (a, b) Conquer-fasen Stega igenom paren (x i y i ), det finns fyra fall: o ingen ändring, o x i mindre än b men inte a o x i mindre än båda men inte y i o Båda nya mindre än de förra Vi behöver bara ställa två frågor för att täcka alla 4 fallen o T(n) = (n/-l)+n/ (sorteringen) -> T(n) = n/- 4 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. o För varje nytt anrop kollar man om man redan löst det problemet och hämtar det o Om inte löser man det och sätter in lösningen i tabellen. Exempel Exempelproblem: 5 l-dimensionell k! = fac(n) = l*** *n o Utnyttja att man vet (n-l)! när n! ska beräknas Multi-dimensionell dynamisk programmering Matrisbaserad shortest path 0-l knapsack o Här får man alltså inte delar av elementen utan måste ta allt på en gång. 6 Du ska skapa ett program som spelar ett spel mot en person med följande regler. Det ligger 0 tändstickor på bordet. Spelarna får plocka upp,, eller 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? Dynamisk programmering 7 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 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? o Om motspelaren startar ett spel med bara 5 stickor: o OK, hur få motspelaren att hamna med 5 stickor? Se till att denne hamnar med 9 stickor! o Fortsätt tänka bottom-up, 5, 9,, 7,, 5, 9 Alltså ska datorn alltid starta med att bara dra en sticka! Motspelare Motspelare Dator Dator Kvar Kvar 5 5 5 Biologiskt insperade algoritmer Grundidé 9 Evolutionär programmering Genetiska algoritmer (Holland) Genetisk programmering Sociala algoritmer Myralgoritmer Flockalgoritmer Foraging Simulated annealing Grundstommen: Population av individer och/eller lösningar Fitness funktion som kan jämföra individer Urvalsoperator Mutation Rekombination för att skapa nya individer Genetiska algoritmer Evolutionära strategier 4 Utvecklades på 50-talet Fokus på recombination, dvs hur man skapar nya individer från gamla. Holland 4 Utvecklades på 60-talet Utveckling av flygplansvinge Väljer individerna efter avkommorna skapats istället för innan. Mutationen viktigare än i GA.

4 Evolutionär programmering (Genetisk programmering) Utvecklades på 60-talet, populärt på 80-talet Har ingen recombination -operator. Ingen avkomma, bara mutationer