Föreläsning 4 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 13 Datastrukturer (DAT037)

Algoritmer och datastrukturer 2012, fo rela sning 8

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Seminarium 13 Innehåll

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 11 Datastrukturer (DAT037)

Datastrukturer. Sammanfattning och Referenshäfte. Guldbrand, Eric Johansson, Algot

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

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

Tentamen Datastrukturer (DAT036)

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

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

Föreläsning 10 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

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

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

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

Tentamen Datastrukturer (DAT036)

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

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 13 Innehåll

Tentamen Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Träd Hierarkiska strukturer

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

Lösningar Datastrukturer TDA

Föreläsning 1 Datastrukturer (DAT037)

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

Programkonstruktion och. Datastrukturer

Föreläsning 9 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Fredag 10 juni 2016 kl 8 12

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

Föreläsning 14 Innehåll

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

Tildatenta Lösningsskiss

Tentamen Datastrukturer (DAT036)

Datastrukturer. Föreläsning 5. Maps 1

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning Datastrukturer (DAT037)

13 Prioritetsköer, heapar

Lösningsförslag till tentamen Datastrukturer, DAT037,

Lösningsförslag till tentamen Datastrukturer, DAT037,

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT037)

Algoritmer och datastrukturer

Trädstrukturer och grafer

Föreläsning 8 Datastrukturer (DAT037)

Rekursiva algoritmer sortering sökning mönstermatchning

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Föreläsning 13 Innehåll

Datastrukturer. föreläsning 9. Maps 1

Föreläsning Datastrukturer (DAT036)

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Diskutera. Hashfunktion

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 9 Innehåll

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

Föreläsning Datastrukturer (DAT036)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Datastrukturer. föreläsning 6. Maps 1

Tentamen TEN1 HI

Interfacen Set och Map, hashtabeller

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Programmering fortsättningskurs

Föreläsning 10 Innehåll

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tentamen Datastrukturer D DAT 035/INN960

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 5: Grafer Del 1

Sökning och sortering

Inlämningsuppgift och handledning

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

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

Datastrukturer. föreläsning 10. Maps 1

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

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Transkript:

Föreläsning 4 Datastrukturer (DAT07) Fredrik Lindblad 1 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat07 1

Innehåll 2 Mängd och avbildning Prioritetskö Binär heap Leftist-heap

Mängd (Set) och avbildning (Map) ADT Set Map Operationer add(x), remove(x), contains(x) put(k, e), remove(k), containskey(k), get(k) En mängd är ett specialfall av en avbildning, men avbildningar är i princip lika svåra att implementera än mängder De implementeras på samma sätt I Java har vi TreeSet och TreeMap, HashSet och HashMap

Mängder 4 ADT: Konstruerare för tom mängd add(x): Lägger till x till mängden Mängder innehåller ej dubbletter contains(x): Avgör om x finns i mängden remove(x): Tar bort x från mängden Gränssnitt i Java: Set

Avbildningar/maps 5 ADT: Konstruerare för tom avbildning put(k, v): Lägger till bindningen k v, mellan en nyckel och ett värde Om det finns en gammal bindning k v skrivs den (t ex) över get(k): Om det finns en bindning k v så ges v som svar remove(k): Tar bort bindningen k v (om det finns en sådan bindning) Gränssnitt i Java: Map

Krav på nyckeltypen Olika mängd-/avbildningsdatastrukturer har olika krav på nyckeltypen: Likhetstest (equals) Olikhetstest (Comparable, Comparator) Hashfunktion (hashcode) Alla kräver likhetstest

Exempel: Avbildning 7 Map<String, Integer> m = new HashMap<>(); mput("agnes", 57); mput("arvid", 40); mput("agnes", 1); mremove("arvid"); Systemoutprintln(mcontainsKey("Arvid")); // false Systemoutprintln(mcontainsKey("Agnes")); // true Systemoutprintln(mget("Agnes")); // 1

Prioritetsköer

Prioritetsköer Köer där varje element har viss prioritet Gränssnitt (exempel): Konstruerare för tom kö insert(x): Lägger till element find-min(): Ger tillbaka minsta elementet delete-min(): Tar bort och ger tillbaka minsta elementet remove(x): Tar bort ett element merge(q): Slår ihop två köer

Prioritetsköer 10 Några tillämpningar: Schemaläggning av processer Sortering Dijkstras algoritm (labb ) Labb 2: Implementera och tillämpa prioritetskö Man brukar låta mindre värde innebära högre prioritet, dvs delete-min() ger det (eller ett av de) minsta elementet i kön

11 Om man implementerar prioritetskö-adtn med listor, vad blir tidskomplexiteten (ev amorterad) för insert och delete-min? A insert: Θ(1), delete-min: Θ(1) B insert: Θ(1), delete-min: Θ(n) C insert: Θ(n), delete-min: Θ(1) D insert: Θ(n), delete-min: Θ(n)

11 Om man implementerar prioritetskö-adtn med listor, vad blir tidskomplexiteten (ev amorterad) för insert och delete-min? A insert: Θ(1), delete-min: Θ(1) B insert: Θ(1), delete-min: Θ(n) C insert: Θ(n), delete-min: Θ(1) D insert: Θ(n), delete-min: Θ(n) Svar: B och C B om man lagrar elementen osorterat och C om man lagrar dem sorterat i stigande prioritet

12 100 0 0 40 20 0 0 20 40 0 0 100 log₂ n n

1 Binära heapar

Binära heapar 14 Kompletta binära träd med heapordningsegenskapen Heapordningsegenskapen Varje nod är mindre än eller lika med alla sina barn Komplett binärt träd Så lågt som möjligt, alla nivåer helt fyllda utom möjligtvis den sista, som är fylld från vänster En binär heap med n noder har höjden Θ(log n)

Identifiera alla binära heapar A: 1 2 4 5 B: 1 7 C: 1 7 D: 1 7 E: 1 7 1 2 F: 1 2 2 2 2 15

15 Identifiera alla binära heapar A: C: E: 4 7 2 7 5 1 1 1 2 B: D: 1 F: 7 2 7 2 1 1 1 2 2 Svar: A, E, F

Binär heap implementerar prio kö 1 Tom kö: Tomt träd find-min: Ge tillbaka roten insert: Stoppa in sist Bubbla upp delete-min: Ta bort roten Stoppa in sista elementet överst Bubbla ned Ge tillbaka gamla roten remove: Let upp elementet, ersätt med sista elementet bubbla åt rätt håll Bubbla upp/ned tills heapordningsegenskapen återställts

Bubbla upp/ned 17 Om värdet är mindre (prio är högre) än i noden ovan, byt plats och kolla rekursivt upp tills ordningen är rätt Om värdet är större (prio är lägre) än i någon av noderna nedan, byt plats med barnet som är minst och fortsätt rekursivt i denna gren

Tidskomplexitet 1 Om man kan hitta sista noden och föräldrar snabbt: Tom kö: Θ(1) find-min: Θ(1) insert: O(log n) (kanske amorterat) delete-min: O(log n) (kanske amorterat) remove: O(n)

Implementation av binära heapar 1 Man brukar representera trädet med array (labb 2) Det passar mycket bra för kompletta träd Roten på position 0 Sista elementet på position n 1 Första tomma cellen på position n Nod is vänstra barn: 2i + 1 Nod is högra barn: 2i + 2 Nod is förälder (i > 0): (i 1)/2

20 Vad blir resultatet om delete-min appliceras på 1? 4 5 A: 4 5 B: 5 4 C: 4 5 D: 4 5

20 Vad blir resultatet om delete-min appliceras på 1? 4 5 A: 4 5 B: 5 4 C: 4 5 D: 4 5 Svar: D

build-heap 21 build-heap: Konverterar lista/array/ till heap Stoppa in alla elementen i godtycklig ordning Bubbla ned ett element i taget, med början på det nedersta, högraste som har löv (Kan hoppa över alla löv) Heapordningsegenskapen uppfylls (kan bevisas med induktion)

build-heap: tidskomplexitet 22 Tid för viss nod: O(nodens höjd) (Givet O(1)-jämförelser) Total tid: O(summan av alla höjder) Nästan alla noder är långt ned Total tid: Θ(n) Bevis: Se boken

Leftistheapar 2

merge 24 Det verkar inte gå att slå ihop två binära heapar, implementerade med arrayer, på ett effektivt sätt Med leftistheapar: O(log n)

Leftistheapar 25 Heapordnade (ofta pekarbaserade) binära träd, som inte är kompletta utan uppfyller annan balanseringsinvariant, leftist träd-egenskapen Grundläggande operation: merge Lätt att implementera insert, delete-min med hjälp av merge

Null path length 2 För en nod, X, i ett träd är npl(x) (null path length of X) kortaste vägen till en nod med max ett barn (Detta är motsatsen till nodens höjd) För tomt träd är null path length 1

Null path length 27 De första 1 + npl t nivåerna måste vara fulla: size t 2 1+npl t 1 (Enkelt induktionsbevis) Alltså: npl t = O(log n), där n är trädets storlek

Leftist-träd-egenskapen 2 För varje nod i trädet gäller för dess vänster- och högerbarn, l och r, att npl(l) npl(r) Detta medför att i leftist-träd har den högraste vägen max log(n + 1) noder, där n är totalt antal noder

Identifiera leftistheaparna A: 1 2 4 5 B: 1 7 C: 1 7 D: 1 7 E: 1 7 1 2 F: 1 2 4 2

Identifiera leftistheaparna A: C: E: 4 7 2 7 5 1 1 1 1 2 B: D: F: 4 7 7 2 1 1 1 Svar: A, D, F 2

Merge Behöver lagra npl för varje nod Rekursiv implementering: Om något av träden är tomma, ta det andra trädet Låt t vara trädet med minst rot och t > det andra Slå ihop t h (höger delträd) med t > (rekursivt anrop) Ersätt t h med det trädet som är resultatet av det rekursiva anropet Detta får vi anta (induktion) är en leftist heap med alla element som förekommer i t h och t > Kalla det nya trädet t 0

Merge 1 Eftersom vi valde delträd av det med minst rot vet vi att det nya delträdet (rotens högerdelträd) uppfyller heap-ordningen gentemot föräldern Hela t uppfyller alltså heap-ordningen Men kanske inte leftist-egenskapen Om npl(tv) < npl(th) så byt helt enkelt plats på barnen Låt t beteckna det resulterande trädet (som kan vara identiskt med t) Slutligen uppdatera npl i roten Den är npl(t h) + 1

Tidskomplexitet för merge 2 Om vi anropar merge för t 1 och t 2 så är antalet rekursiva anrop begränsat av antalet noder i högraste vägen i t 1 + antalet noder i högraste vägen i t 2 Dessa är O(log( t 1 )) resp O(log( t 2 )) Varje ekvering av den rekursiva operationen (exklusive det rekursiva anropet) tar konstant tid Varje rekursivt anrop tar oss ett steg ner på den högraste vägen i antingen t 1 eller t 2 Alltså är komplexiteten för merge O(log( t 1 ) + log( t 2 )) = O(log(max( t 1, t 2 )), dvs O(log(n)) om n är storleken på den största heapen

Implementering av insert och deletemin Insert implementeras genom att slå ihop trädet med ett träd bestående av ett element (det nya) Tidskomplexitet: O(log(n)) deletemin genom att ersätta roten med hopslagningen av vänster och höger delträd Tidskomplexitet: O(log(n))

Vad är resultatet av att applicera deletemin på 1 4 5? A: 5 4 B: 4 5 C: 4 5 D: 4 5 4

Vad är resultatet av att applicera deletemin på 1 4 5? A: 5 4 B: 4 5 C: 4 5 D: 4 5 Svar: B 4

5 Prioritetsköer, sammanfattning

Tidskomplexiteter Binär heap (array) Leftistheap find-min O(1) O(1) delete-min O(log n) am O(log n) insert O(log n) am O(log n) merge Θ(n) O(log n) build-heap Θ(n) Θ(n)