Datastrukturer och algoritmer Frelsning 15 Anders Broberg Lena
Datastrukturer och algoritmer Föreläsning 15 © Anders Broberg, Lena Kallin Westin, 2007
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 2 Innehåll u 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 o u Vad Traversering, Sökning, Sortering, Maximalt flöde, Minimalt uppspännande träd, Kortaste vägen etc Tids- och rumskomplexitet finns det för generella teorier? u Kapitel 9
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 3 Abstrakta datatyper u Ett koncept för att kunna diskutera och jämföra olika typer av datastrukturer. u Ligger på en hög abstraktionsnivå. ØFrämst intresserad av struktur och organisation, inte implementation. u Operationerna ger datatypen karaktär och specifikationen visar datatypens uttrycksfullhet.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 4 Operationskategorier (l) u Konstruktorer - skapar/bygger upp och returnerar ett objekt av aktuell ADT ØGrundkonstruktorer o o saknar argument av den aktuella ADT: n Empty, Make, Create ØVidareutvecklande konstruktorer o o ett argument av den aktuella ADT: n List-Insert, Stack-Push ØKombinerande konstruktorer o o flera argument av den aktuella ADT: n Set-Union
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 5 Operationskategorier (2) u 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
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 6 Operationskategorier (3) u Modifikatorer – Ändrar ett objekts struktur och/eller elementvärden Ø Insättning, borttagning, tilldelning omstrukturering o Array-Set-Value, Table-Remove, Stack-Pop, Set-Insert u 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-kext, Binary-tree-left-child u Komparatorer – jämför objekt av den aktuella ADTn med varandra Ø Equal, Set-Subset
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 7 Uttrycksfullhet u Abstrakt datatyp = objekt + konstruktion av gränsytan. u 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. u Kan jag göra det jag vill kunna göra med objekten? ?
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 8 Uttrycksfullhet u Datatypsspecifikationen har två roller: ØSlå fast hur datatypen är beskaffad, vilka egenskaper den har. ØFungerar som en regelsamling för användningen av datatypen. u Specifikationens uttrycksfullhet kan mätas med tre begrepp ØObjektfullständighet ØAlgoritmfullständighet ØRik gränsyta
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 9 Objektfullständighet u Är det svagaste kriteriet. u Det ska vara möjligt att konstruera och skilja mellan alla objekt som anses höra till datatypen. u Man ska kunna skilja på två objekt A och B med en sekvens av operationer I Ol O 2… On (n 0) (I = Inspektor, O = Operation) u 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!
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 10 Algoritmfullständighet (Expressive completeness) u Starkare än (och implicerar) objektfullständighet. u 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”). u Alltså: Algoritmfullständighet = objektfullständighet + likhetstest
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 11 Rik gränsyta (Expressive richness) u Starkaste kriteriet, implicerar både objektfullständighet och algoritmfullständighet. u Även om man har algoritmfullständighet så kan vissa algoritmer bli hopplöst ineffektiva. u 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.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 12 Rik gränsyta – exempel u 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 o o plocka ut vart och ett av elementen i stacken hitta strukturen, ordningen på dem utifrån detta kan stacken återskapas
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 13 Praktisk uttrycksfullhet u Teoretiska mått på uttrycksfullhet ØObjektfullständighet, algoritmfullständighet och rik gränsyta. u Måste man uppfylla alla tre kraven? ØIbland blir en rik gränsyta opraktisk, man saknar vissa operationer. o u Hur Utskrifter, längdfunktioner eller kopieringsfunktioner tex. skapar man en gränsyta?
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 14 Att utforma en gränsyta u Utgå från de operationer som ger ADTn sin speciella karaktär. u 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. u Detta ger en rätt stram yta med få operationer.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 15 Fördelar med en stram gränsyta u Utbytbarhet ØBörja med enkla implementationer och sedan byta ut mot allt effektivare. u Portabilitet ØMindre problem att flytta ett program u Integritet ØMindre risk för att operationer läggs till som strider mot grundidén med ADTn.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 16 Programspråksstöd för ADTs u 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 Empty. Stack abstype 'a stack = Stack of 'a list with val empty. Stack = Stack [ ] fun is. Empty. Stack (Stack S) = (S = [ ]) fun push (Stack S, v) = Stack (v: : S) fun top (Stack [ ]) = raise Empty. Stack | top (Stack (x: : xs)) = x fun pop (Stack [ ]) = raise Empty. Stack | pop (Stack (x: : xs)) = Stack xs end
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 17 Programspråksstöd för ADTs u 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. u Före version 1. 5. . . ØSkapar underklasser för olika implementationer av ADTn. ØUtnyttjas Object kan man inte se till att alla element är av samma typ. u Från och med 1. 5 finns Generics
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 18 Generisk Stack i Java public interface Stack<E> { public boolean is. Empty(); public void push(E elem); public E top() throws Empty. Stack. Exception; public E pop() throws Empty. Stack. Exception; } public class Empty. Stack. Exception extends Exception{ public Empty. Stack. Exception(){ super(); } public Empty. Stack. Exception(String s){ super(s); } }
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 19 Generisk Stack i Java public class Array. Stack<E> implements Stack<E> { public static final int CAPACITY = 1000; private E stack[]; private int top = -1; public Array. Stack(){ stack = (E[])new Object[CAPACITY]; } public boolean is. Empty(){ return (top < 0); }
Generisk Stack i Java public void push(E obj){ if ((top+1) < CAPACITY){ top = top + 1; stack[top] = obj; } } public E top(){ return stack[top]; } © Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 20 public E pop(){ E elem; elem = stack[top]; stack[top] = null; top = top - 1; return elem; } }
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 21 Programspråksstöd för ADTs u Många språk ger mycket litet eller inget stöd alls. Då krävs: ØKonventioner o o Namngivning Operationsval ØGod dokumentation av olika val som görs. ØDisciplin o Inte gå in och peta i interna strukturer
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 22 Design av algoritmer u Problemlösningsstrategier ØTop-down ØBottom-up u Typer av algoritmer (lösningstekniker) Ø”Brute-force” ØGiriga algoritmer (Greedy-algorithms) ØSöndra och härska (Divide and Conquer) ØDynamisk programmering ØBiologiskt inspirerade algoritmer
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 23 Brute-force u Rättfram ansats, utgår direkt från problemställningen och de definitioner som finns där. u 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 u Bra metod att starta med ØGaranterar en korrekt lösning om en sådan finns ØMEN garanterar inte effektivitet… ØOfta väldigt enkla algoritmer
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 24 Brute-force: Exempel u Linjär sökning u Söka det minsta talet i en lista ØAntar att alla element är det lägsta ØKolla alla mot alla u Handelsresande problemet ØBesöka alla städer bara en gång ØPå minst kostsamma sätt
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 25 Brute-force (2) u Brute force enda kända lösningen för många problem. u Ger ofta hög tillväxt på tidskomplexiteten ØSpeciellt för problem där antalet svar ökar snabbt med ökad problemstorlek u 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
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 26 Giriga (Greedy) algoritmer u METOD: ØI varje steg titta på alla möjliga steg och välj den för tillfället bästa vägen. u 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 u Heuristisk metod vs. greedy ØGaranti för optimal lösning greedy u Bra alternativ till brute-force algoritmer
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 27 Exempel på giriga algoritmer u Att lämna tillbaka växel ØMinimalt antal mynt i växel ØTa alltid det största möjliga myntet i varje ”loopvarv” u Minimalt uppspänt träd ØKruksals algoritm ØPrims algoritm u Kortaste vägen i en graf (Diijsktras algoritm) u Huffman-kodning
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 28 ”The Fractional Knapsack Problem” u u Givet, en mängd p med n element där element i har värde/förtjän Mål: Välja element med maximal förtjänst utan att den totala vik Ø I ”The Fractional Knapsack Problem” får man ta bitar av elementen (frac u Låt xi vara mängden vi tar av element i Maximera: u u med begränsningen: Regel: För varje gång ta elementet med maximalt värde (förtjän O(n log n)
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 29
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 30 Söndra och härska (Divide and Conquer) u 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. u 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) u u u O(nlogn) är vanligt Merge-sort och Quick-sort Kan ställa krav på implementering av ADT
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 31 Ex: Finn 2 minsta elementen i en lista u Första försöket: ØSortera listan O(nlogn) ØTa fram de två första elementen O(1) u Alternativ ØHitta en effektiv lösning på ett enklare problem o o o ”lösa nästan rätt problem” vs ”lösa problemet nästan rätt” Enklare att hitta bara det minsta elementet! O(n) – n-l jämförelser Konvertera till originalproblemet. Vad får vi då? O(2*n)? ØHitta en ineffektiv lösning på originalproblemet
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 32 Söndra och härska algoritm kanske? u 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 o Merge-sort eller …? Ineffektiv för detta problem Ø Kan vi dela data på något annat sätt? o o Byta delnings faktor till 3, ger det något? Njet Men ….
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 33 Om vi delar upp listan i par u N/2 par, sortera dessa u Det första paret (a, b) u ”Conquer-fasen” ØStega igenom paren (xi yi), det finns fyra fall: o o ingen ändring, xi mindre än b men inte a xi mindre än båda men inte yi 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) = 2(n/2 -l)+n/2 (sorteringen) -> T(n) = 3 n/2 -2
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 34 Dynamisk programmering u Undviker problemet med söndra och härska, dvs att samma problem kan lösas flera gånger. u 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 o 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 © Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 35 u l-dimensionell Øk! = fac(n) = l*2*3*…*n o Utnyttja att man vet (n-l)! när n! ska beräknas u 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.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 36 Exempelproblem: u Du skapa ett program som spelar ett spel mot en person med följande regler. u 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. u Om datorn alltid får börja, hur ska den se till att den vinner?
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 37 Vilken algoritm? u Brute-force ØTesta alla varianter och leta fram den bästa… u Giriga algoritmer ØHur vet man i varje steg vilken väg som är den bästa? u Divide and Conquer ØHur ska man dela upp? u Dynamisk programmering
© Anders Broberg, Lena Kallin Westin, 2007 Dynamisk programmering Mot. Dator Kvar spelare 1 1 2 1 Ø Målet: Datorns sista drag ska lämna en sticka 1 kvar. 3 Ø Hur kan jag hamna i det läget? 1 u Vi 38 3 börjar med problemet nedifrån och upp. 2 o o o Mot. Dator Kvar Om motspelaren startar ett spel med bara 5 stickor: spelare OK, hur få motspelaren att hamna med 5 stickor? 3 1 5 – Se till att denne hamnar med 9 stickor! 2 2 5 Fortsätt tänka ”bottom-up” – 1, 5, 9, 13, 17, 21, 25, 29 1 3 5 – Alltså ska datorn alltid starta med att bara dra en sticka!
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 39 Biologiskt insperade algoritmer u Evolutionär programmering ØGenetiska algoritmer (Holland) ØGenetisk programmering u Sociala algoritmer ØMyralgoritmer ØFlockalgoritmer ØForaging u Simulated annealing
Grundidé © Anders Broberg, Lena Kallin Westin, 2007 u 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 40
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 41 Genetiska algoritmer u Utvecklades på 50 -talet u Fokus på ”recombination”, dvs hur man skapar nya individer från gamla. u Holland
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 42 Evolutionära strategier u Utvecklades på 60 -talet u Utveckling av flygplansvinge u Väljer individerna efter avkommorna skapats istället för innan. u Mutationen viktigare än i GA.
© Anders Broberg, Lena Kallin Westin, 2007 Do. A VT -07 43 Evolutionär programmering (Genetisk programmering) u Utvecklades på 60 -talet, populärt på 80 -talet u Har ingen ”recombination”-operator. ØIngen avkomma, bara mutationer
- Slides: 43