Tommy Färnqvist, IDA, Linköpings universitet. 1 Prioritetsköer Heapar Tillämpning... 3

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Föreläsning 7. Splay-träd. Prioritetsköer och heapar. Union/Find TDDC70/91: DALG. Innehåll. Innehåll. 1 Splay-träd

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Föreläsning 4 Datastrukturer (DAT037)

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Magnus Nielsen, IDA, Linköpings universitet

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning Datastrukturer (DAT036)

Lösningar Datastrukturer TDA

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 4 Datastrukturer (DAT037)

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

Tommy Färnqvist, IDA, Linköpings universitet

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Magnus Nielsen, IDA, Linköpings universitet

Datastrukturer. Föreläsning 5. Maps 1

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

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

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 13 Innehåll

ADT Set, Map, Dictionary. Iteratorer TDDD86: DALGP. Tommy Färnqvist, IDA, Linköpings universitet

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

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Tommy Färnqvist, IDA, Linköpings universitet

Datastrukturer. föreläsning 10. Maps 1

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

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

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

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

Föreläsning 9 Datastrukturer (DAT037)

Seminarium 13 Innehåll

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Tommy Färnqvist, IDA, Linköpings universitet. 1 Sortering Heap-sort Merge-sort Sammanfattning... 10

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Föreläsning Datastrukturer (DAT036)

Föreläsning 5 Datastrukturer (DAT037)

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

Tildatenta Lösningsskiss

Fredag 10 juni 2016 kl 8 12

Tentamen TEN1 HI

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Datastrukturer. föreläsning 10. Maps 1

Tentamen, Algoritmer och datastrukturer

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

Trädstrukturer och grafer

Träd och koder. Anders Björner KTH

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Programkonstruktion och. Datastrukturer

Träd Hierarkiska strukturer

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

Källkodning. Egenskaper hos koder. Några exempel

Optimala koder. Övre gräns för optimala koder. Gränser. Övre gräns för optimala koder, forts.

Optimala koder. Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or.

Ekvivalensrelationer

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Föreläsning Datastrukturer (DAT037)

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

Föreläsning Datastrukturer (DAT036)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Tentamen kl Uppgift 4. Uppgift 5

Tentamen Datastrukturer för D2 DAT 035

Föreläsning 9 Innehåll

13 Prioritetsköer, heapar

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Datastrukturer (DAT036)

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

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

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

Föreläsning 6. Sökträd: AVL-träd, Multi-Way -sökträd, B-träd TDDC70/91: DALG. Innehåll. Innehåll. 1 AVL-träd

Datastrukturer. föreläsning 9. Maps 1

Giriga algoritmer och dynamisk programmering

Föreläsning Datastrukturer (DAT036)

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

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

Programkonstruktion och. Datastrukturer

Försättsblad till skriftlig tentamen vid Linköpings Universitet

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

Föreläsning 2 Datastrukturer (DAT037)

Facit Tentamen TDDC kl (6)

Föreläsning 9 Innehåll

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

TDDD86 Extralaboration #1

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Vad har vi pratat om i kursen?

Föreläsning Datastrukturer (DAT037)

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Transkript:

Föreläsning 19 Prioritetskö, Heap, Trie, Union/Find, Geometriska tillämpningar av BST TDDD86: DALP Utskriftsversion av föreläsning i Datastrukturer, algoritmer och programmeringsparadigm 13 november 2015 Tommy Färnqvist, IDA, Linköpings universitet 19.1 Innehåll Innehåll 1 Prioritetsköer 1 1.1 Heapar............................................. 2 1.2 Tillämpning.......................................... 3 2 Trie 5 3 Union/Find 6 4 Geometrisk sökning 8 4.1 Intervallsökning........................................ 8 4.2 Trädstrukturer......................................... 11 19.2 1 Prioritetsköer Prioritetsköer En vanligt förekommande situation: Väntelista (jobbhantering på fleranvändardatorer, simulering av händelser) Om en resurs blir ledig, välj ett element från väntelistan Valet är baserat på någon partial/linjär ordning: jobbet med högst prioritet ska köras först, varje händelse ska inträffa vid en viss tidpunkt; händelserna ska bearbetas i tidsordning 19.3 ADT prioritetskö Linjärt ordnad mängd K av nycklar Vi lagrar par (k,v) (som i ADT Dictionary), flera par med samma nyckel är tillåtet en vanlig operation är att hämta par med minimal nyckel Operationer på en prioritetskö P: makeemptypq() isempty() size() min(): hitta ett par (k,v) som har minimalt k i P; returnera (k,v) insert(k,v): sätt in (k,v) i P removemin(): ta bort och returnera ett par (k,v) i P med minimalt k; error om P är tom 19.4 1

Implementation av prioritetsköer Vi kan t.ex. använda (sorterade) länkade listor, BST eller Skip-listor En annan idé: använd ett fullständigt binärt träd där roten i varje (del)träd T innehåller det minsta elementet i T Det här är ett partiellt ordnat träd, också kallat heap! 19.5 1.1 Heapar Att uppdatera en heapstruktur Med sista lövet menar vi den sista noden i en traversering i levelorder removemin(pq) // ta bort roten Ersätt roten med sista lövet Återställ den partiella ordningen genom att byta noder nedåt down-heap bubbling insert(pq, k, v) Sätt in ny nod (k,v) efter sista lövet Återställ den partiella ordningen genom up-heap bubbling 19.6 Egenskaper size(), isempty(), min(): O(1) insert(), removemin(): O(logn) Kom ihåg arrayrepresentaionen av BST Ett fullständigt binärt träd... Kompakt arrayrepresentation Bubble-up och bubble-down har snabba implementationer 19.7 Exempel: bubble-up efter insert(4,15) 19.8 2

Heapvarianter Olika partialordningar minsta nyckeln i roten (minheap) största nyckeln i roten (maxheap) Olika arrayrepresentationer numrering framåt i levelorder (med början från 0 eller 1) numrering bakåt i levelorder (med början från 0 eller 1) 19.9 1.2 Tillämpning Giriga algoritmer Algoritmer som löser en bit av problemet i taget. I varje steg görs det som ger bäst utdelning/kostar minst. Den giriga metoden är ett allmänt paradigm för algoritmdesign som bygger på följande: konfigurationer: olika val, samlingar eller värden att hitta målfunktion: konfigurationer tilldelas en poäng som vi vill maximera eller minimera Det fungerar bäst applicerat på problem med greedy-choice-egenskapen: en globalt optimal lösning kan alltid hittas genom en serie lokala förbättringar utgående från en begynnelse-konfiguration För många problem ger giriga algoritmer inte optimala lösningar utan kanske hyfsade approximativa lösningar. 19.10 Textkomprimering Givet en sträng X, koda X som en kortare sträng Y Sparar minne/bandbredd Ett bra sätt att göra det på: Huffmankodning Beräkna frekvensen f (c) för varje tecken c Använd korta koder för tecken med hög frekvens Inget kodord är prefixet av ett annat kodord Använd ett optimalt kodningsträd för att bestämma kodorden 19.11 Exempel på kodningsträd En kod avbildar varje tecken i ett alfabet på ett binärt kodord En prefixkod är en binär kod sådan att inget kodord är ett prefix av ett annat kodord En kodningsträd representerar en prefixkod Varje extern nod lagrar ett tecken Kodordet för ett tecken ges av stigen från roten till den externa noden som lagrar tecknet (0 för ett vänsterbarn och 1 för ett högerbarn) 00 010 011 10 11 a b c d e a d e b c 19.12 3

Optimering av kodningsträd Givet en textsträng X vill vi hitta en prefixkod för tecknen i X som ger en liten kodning av X Vanliga tecken borde få korta kodord Ovanliga tecken borde få långa kodord Exempel: X = abrakadabra T 1 kodar X med 29 bitar T 2 kodar X med 24 bitar a b k d r 5 2 1 1 2 T 1 T 2 k d b a b r a r k d 19.13 Huffmans algoritm Givet en sträng X konstruerar Huffmans algoritm en prefixkod som minimerar storleken på kodningen av X Algoritmen går i tid O(n + d logd), där n är storleken på X och d är antalet distinkta tecken i X En heapbaserad priokö används som extra datastruktur function HUFFMANENCODING(X, X = n) C DISTINCTCHARACTERS(X) COMPUTEFREQUENCIES(C, X) Q ny tom heap for all c C do T nytt ennodsträd som lagrar c Q.INSERT(GETFREQUENCY(C), 1) while Q.SIZE() > 1 do f 1 Q.MIN() T 1 Q.REMOVEMIN() f 2 Q.MIN() T 2 Q.REMOVEMIN() T JOIN(T 1,T 2 ) Q.INSERT( f 1 + f 2,T ) return Q.REMOVEMIN() 19.14 Ett till exempel 4

19.15 2 Trie Trie (prefix-träd) trie: En ordnad trädstruktur som används för att lagra en mängd data, vanligen strängar, optimerad för att göra prefix-sökningar Exempel: Börjar några ord i mängden med prefixet mart? Lexikon-klassen i labb 5 använder en sådan datastruktur Idén: istället för ett binärt träd, använd ett 26-ärt träd varje nod har 26 barn: en för varje bokstav A-Z lägg till ord i ett trie genom att följa lämpliga barnpekare 19.16 Trie-nod struct TrieNode { bool word; TrieNode* children[26]; }; TrieNode() { this->word = false; for (int i = 0; i < 26; i++) { this->children[i] = nullptr; } } 19.17 5

Trie med data Efter att ha satt in am, ate, me, mud, my, one, out : 19.18 3 Union/Find Partitioneringar med Union/Find-operationer makeset(x): Skapa en mängd enbart innehållande elementet x och returnera positionen som lagrar x den nya mängden. union(a, B): Returnera mängden A B, förstör de gamla A och B. find(p): Returnera mängden som innehåller elementet i position p. 19.19 Exempel: Dynamisk konnektivitet Fråga: finns det en stig mellan p och q? Pixlar i ett digital foto Datorer i ett nätverk Vänner i ett socialt nätverk Transistorer på ett datorchip Element i en matematisk mängd Variabelnamn i ett datorprogram Metalliska delar av ett kompositsystem 19.20 Listbaserad implementation Varje mängd lagras som en sekvens representerad av en länkad lista Varje nod lagrar ett objekt innehållande ett element och en referens till mängdens namn 6

19.21 Analys av listbaserad representation När union utförs, flytta alltid element från den mindre mängden till den större mängden Varje gång ett element flyttas hamnar det i en mängd som är åtminstone dubbelt så stor som den gamla mängden Alltså, ett element kan flyttas max O(logn) gånger Total tid för att utföra n union- och find-operationer är O(nlogn) 19.22 Trädbaserad implementation Varje element lagras i en nod som innehåller en pekare till ett mängdnamn En nod v vars pekare pekar på nod v är också ett mängdnamn Varje mängd är ett träd, rotat i en nod med själrefererande mängdnamnspekare T.ex. mängderna 1, 2 och 5 : 19.23 Operationer För att utföra union, låt bara roten av ett träd peka på roten av det andra För att utföra find, följ mängdnamns-pekarna från startnoden till en självrefererande nod träffas på! 3 2 9 6 11 8 5 12 10 7

3 2 9 6 11 8 5 12 10 19.24 En heuristik Union via storlek: När union utförs, låt roten i det mindre trädet peka på roten i det större Medför O(nlogn) tid för att utföra n union- och find-operationer: Varje gång vi följer en pekare kommer vi till ett delträd som är åtminstone dubbelt så stort som det förra delträdet Alltså kommer vi att som mest följa O(logn) pekare för någon find 3 2 9 6 11 8 5 12 10 19.25 En till heuristik Stigkomprimering: Efter att find utförts komprimera alla pekare på stigen som precis traverserats så att de alla pekar på roten 5 5 8 10 8 10 11 11 2 12 2 12 3 6 3 6 9 9 Medför O(nlog n) tid för att utföra n union- och find-operationer. 19.26 4 Geometrisk sökning 4.1 Intervallsökning Intervallsökning i en dimension Utökning av ordnad symboltabell Sätt in nyckel-värdepar 8

Sök efter nyckel k Intervallsökning: hitta alla nycklar mellan k 1 och k 2 Intervallstorlek: antalet nycklar mellan k 1 och k 2 Tillämpning: Databasfrågor Geometrisk tolkning: Nycklarna är punkter på en linje Hitta/räkna punkter på ett givet intervall 19.27 Intervallsökning i en dimension med BST Hitta alla nycklar mellan k 1 och k 2 Hitta rekursivt alla nycklar i vänster delträd (om några kan finnas i intervallet) Kontrollera nyckeln i nuvarande nod Hitta rekursivt alla nycklar i höger delträd (om några kan finnas i intervallet) Körtiden blir proportionell mot R + logn (om vårt BST är balanserat) 19.28 Intervallsökning i två dimensioner Utökning av ordnad symboltabell till 2d-nycklar Sätt in en 2d-nyckel Sök efter en 2d-nyckel Intervallsökning: hitta alla nycklar i ett 2d-intervall Intervallstorlek: antalet nycklar i ett 2d-intervall Tillämpningar: Nätverk, kretsdesign, databaser Geometrisk tolkning: Nycklarna är punkter i planet 9

Hitta/räkna punkter i en given rektangel 19.29 Intervallsökning i två dimensioner med rutnät Dela upp planet i M M-rutnät av kvadrater Skapa lista av punker i varje kvadrat Använd 2d-array för att direkt indexera relevant kvadrat Intervallsökning: undersök bara de kvadrater som överlappar frågan 19.30 Klustring Rutnätsimplementation: Snabb, enkel lösning för väldistribuerade punktmängder Problem: Klustring ett välkänt problematiskt fenomen i geometriskt data Listorna är för långa, trots att medellängden är kort Behöver datastruktur som anpassar sig till data 19.31 Klustring Rutnätsimplementation: Snabb, enkel lösning för väldistribuerade punktmängder Problem: Klustring ett välkänt problematiskt fenomen i geometriskt data Exempel: kartdata 10

19.32 4.2 Trädstrukturer Trädstrukturer Använd ett träd för att rekursivt dela upp planet Rutnät: Dela upp planet likformigt i kvadrater Quadtree: Dela upp planet rekursivt i fyra kvadranter 2d-träd: Dela upp planet rekursivt i två halvplan BSP-träd: Dela upp planet rekursivt i två regioner 19.33 Tillämpningar Ray-tracing Intervallsökning i två dimensioner Flygsimulatorer N-kroppssimulering Kollisionsdetektering Astronomiska databaser Sökning efter närmaste grannar Adaptiv rutnätsgenerering Accelerera rendreringen i Doom Ta bort dolda ytor och skuggning 19.34 Quadtree Idé: Dela upp planet rekursivt i 4 kvadranter Implementation: 4-vägsträd (egentligen ett trie) 11

Fördel: Bra prestanda vid klustring av data Nackdel: Godtyckligt djup! 19.35 Quadtree: Intervallsökning i två dimensioner Hitta rekursivt alla nycklar i NE-kvadranten (om några kan finnas i intervallet) Hitta rekursivt alla nycklar i NW-kvadranten (om några kan finnas i intervallet) Hitta rekursivt alla nycklar i SE-kvadranten (om några kan finnas i intervallet) Hitta rekursivt alla nycklar i SW-kvadranten (om några kan finnas i intervallet) Typisk exekveringstid: R + logn 19.36 Dimensionalitetsproblemet Intervallsökning i k dimensioner Huvudsaklig tillämpning: Multidimensionella databaser 3d: Octree: dela rekursivt upp 3d-rymden i 8 oktanter 100d: Centree: dela rekursivt upp 100d-rymden i 2 100 centranter??? 19.37 12

2d-träd Dela rekursivt upp planet i två halvplan 19.38 2d-träd Datastruktur: BST, men alternera att använda x- och y-koordinat som nyckel Sökning ger rektangel innehållande punkt Insättning underdelar planet ytterligare 19.39 2d-träd: Intervallsökning i två dimensioner Hitta alla punkter i frågans rektangel (i linje med koordinataxlarna) Kontrollera om punkt i nod ligger i given rektangel Sök rekursivt i vänstra/övre underdelningen (om några punkter kan finnas i rektangeln) Sök rekursivt i högra/undre underdelningen (om några punkter kan finnas i rektangeln) Typisk exekveringstid: R + logn Värsta fallet (under antagandet att trädet är balanserat): R + N 19.40 13

2d-träd: Sökning efter närmsta granne Hitta punkten närmast en given punkt Kontrollera avståndet från punkt i nod till frågepunkten Sök rekursivt i vänstra/övre underdelningen (om kan innehålla närmre punkt) Sök rekursivt i högra/undre underdelningen (om kan innehålla närmre punkt) Organisera rekursiv metod så att den börjar med att söka efter frågepunkten Typisk exekveringstid: logn Värsta fallet (även om trädet är balanserat): N 19.41 Kd-träd Kd-träd: Partitionera rekursivt k-dimensionell rymd i två halvrymder Implementation: BST, men cykla dimensionerna likt 2d-träd Effektiv, enkel datastruktur för att behandla k-dimensionellt data Bred användning Anpassar sig väl till högredimensionell och klustrig data Upptäcktes av en student (Jon Bentley) i en algoritmkurs! 19.42 14