Datastrukturer och algoritmer Frelsning 15 Datastrukturer och algoritmer












































- Slides: 44
Datastrukturer och algoritmer Föreläsning 15
Datastrukturer och algoritmer Innehåll 2 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
Datastrukturer och algoritmer Abstrakta datatyper 3 u Koncept för att 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.
Datastrukturer och algoritmer Operationskategorier (l) u Konstruktorer - skapar/bygger upp och returnerar ett objekt av aktuell ADT Ø Grundkonstruktorer o o Ø Vidareutvecklande konstruktorer o o ett argument av den aktuella ADT: n List-Insert, Stack-Push Ø Kombinerande konstruktorer o 4 saknar argument av den aktuella ADT: n Empty, Make, Create o flera argument av den aktuella ADT: n Set-Union
Datastrukturer och algoritmer Operationskategorier (2) 5 u Inspektorer - Undersöker ett objekts inre uppbyggnad på olika sätt Ø Avläsning/sondering av elementvärden eller strukturella förhållanden o Inspect-value, Stack-Top, Table-Lookup, Set-Choose Ø Test av extremfall av struktur och värden o Binary-tree-has-left-child, Set-member-of Ø Mätning av objekt o Isempty, Has-value
Datastrukturer och algoritmer Operationskategorier (3) 6 u Modifikatorer – Ändrar ett objekts struktur och/eller elementvärden Ø Insättning, borttagning, tilldelning, omstrukturering o u 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 u List-First, List-End, List-kext, Binary-tree-left-child Komparatorer – jämför objekt av den aktuella ADTn med varandra Ø Equal, Set-Subset
Datastrukturer och algoritmer Uttrycksfullhet 7 u Datatyp = objekt + operationer Ø Abstrakt datatyp = objekt + konstruktion av gränsytan. u Frågor att fundera kring vid skapande av ADT: Ø Ø Ø u 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? ?
Datastrukturer och algoritmer Uttrycksfullhet 8 u Datatypsspecifikationen har två roller: Ø Beskriva vilka egenskaper datatypen har. Ø Vara en regelsamling för användningen av datatypen. u Specifikationens uttrycksfullhet kan mätas med tre begrepp: Ø Objektfullständighet Ø Algoritmfullständighet Ø Rik gränsyta
Datastrukturer och algoritmer Objektfullständighet 9 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 u Ø 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!
Datastrukturer och algoritmer 10 Algoritmfullständighet (Expressive completeness) Starkare än (och implicerar) objektfullständighet. u Man ska kunna implementera alla algoritmer i denna datatyp. u Ø 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 u Vill man veta varför: Läs artikeln (Kapur, Srivas ”Computability and implementability issues in abstract data types”). Alltså: Algoritmfullständighet = objektfullständighet + likhetstest
Datastrukturer och algoritmer 11 Rik gränsyta (Expressive richness) 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 u Ø 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.
Datastrukturer och algoritmer Rik gränsyta – exempel 12 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
Datastrukturer och algoritmer Praktisk uttrycksfullhet 13 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?
Datastrukturer och algoritmer Att utforma en gränsyta 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 u Ø Ø u 14 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.
Datastrukturer och algoritmer Fördelar med en stram gränsyta 15 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.
Datastrukturer och algoritmer Programspråksstöd för ADTs 16 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
Datastrukturer och algoritmer Programspråksstöd för ADTs 17 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 elementen vara av olika typ. u Från och med 1. 5 finns Generics
Datastrukturer och algoritmer Generisk Stack i Java 18 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); } }
Datastrukturer och algoritmer Generisk Stack i Java 19 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); }
Datastrukturer och algoritmer Generisk Stack i Java 20 public void push(E obj){ if ((top+1) < CAPACITY){ top = top + 1; stack[top] = obj; } } public E top(){ return stack[top]; } public E pop(){ E elem; elem = stack[top]; stack[top] = null; top = top - 1; return elem; } }
Datastrukturer och algoritmer Programspråksstöd för ADTs 21 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
Datastrukturer och algoritmer Design av algoritmer 22 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
Datastrukturer och algoritmer Brute-force 23 Rättfram ansats, utgår direkt från problem-ställningen och de definitioner som finns där. u Om problemet är kombinatoriskt så gör man en fullständig sökning u Ø 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
Datastrukturer och algoritmer Brute-force 24 u 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
Datastrukturer och algoritmer Brute-force: Exempel 25 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
Datastrukturer och algoritmer Giriga (Greedy) algoritmer 26 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
Datastrukturer och algoritmer Exempel på giriga algoritmer 27 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 Diijsktras algoritm u Huffman-kodning
Datastrukturer och algoritmer ”The Fractional Knapsack Problem” u u Ø I ”The Fractional Knapsack Problem” får man ta bitar av elementen (fractions). u Låt xi vara mängden vi tar av element i Maximera: u u 28 Givet, en mängd p med n element där element i har värde/förtjänst bi (benefit) > 0 och en vikt wi > 0 Mål: Välja element med maximal förtjänst utan att den totala vikten blir mer än den maximala vikten W. med begränsningen: Regel: För varje gång ta elementet med maximalt värde (förtjänst/vikten). O(n log n)
29 Datastrukturer och algoritmer
Datastrukturer och algoritmer 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
Datastrukturer och algoritmer Ex: Finn 2 minsta elementen i en lista 31 u Första försöket: Ø Sortera listan O(n log n) Ø 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
Datastrukturer och algoritmer Söndra och härska algoritm kanske? 33 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 ….
Datastrukturer och algoritmer Om vi delar upp listan i par 34 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
Datastrukturer och algoritmer 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 35 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.
Datastrukturer och algoritmer Exempel 36 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.
Datastrukturer och algoritmer Exempelproblem: 37 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?
Datastrukturer och algoritmer Vilken algoritm? 38 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
Dynamisk programmering u 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 o o 39 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! Motspelare Dator Kvar 3 1 1 2 2 1 1 3 1 Motspelare Dator Kvar 3 1 5 2 2 5 1 3 5
Datastrukturer och algoritmer Biologiskt inspirerade algoritmer 40 u Evolutionär programmering Ø Genetiska algoritmer (Holland) Ø Genetisk programmering u Sociala algoritmer Ø Myralgoritmer Ø Flockalgoritmer Ø Foraging u Simulated annealing
Grundidé 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 41
Datastrukturer och algoritmer Genetiska algoritmer 42 u Utvecklades på 50 -talet u Fokus på ”recombination”, dvs hur man skapar nya individer från gamla. u John Holland
Datastrukturer och algoritmer Evolutionära strategier 43 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.
Datastrukturer och algoritmer Evolutionär programmering (Genetisk programmering) 44 u Utvecklades på 60 -talet, populärt på 80 -talet u Har ingen ”recombination”-operator. Ø Ingen avkomma, bara mutationer
Datastrukturer och algoritmer Sociala algoritmer 45 u Myralgoritmer Ø Myror markerar sin väg med fermoner. Ø När någon finner mat och tar den tillbaka till boet så markeras vägen. Ø Fler myror väljer samma väg. Ø Myrsamhället tillsammans finner den kortaste vägen med minst antal hinder. o Kunskapen sitter i samhället inte i myran.