Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Seminarium 13 Innehåll

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

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

13 Prioritetsköer, heapar

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

Föreläsning 6 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

Träd Hierarkiska strukturer

Föreläsning Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

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

Föreläsning 6 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 9 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 13 Innehåll

Algoritmer och datastrukturer 2012, fo rela sning 8

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

Dugga Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

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, EDA690 Algoritmer och Datastrukturer, Helsingborg

Datastrukturer. föreläsning 3. Stacks 1

Tentamen Datastrukturer, DAT037 (DAT036)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Trädstrukturer och grafer

Ä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.

Lösningar Datastrukturer TDA

Föreläsning Datastrukturer (DAT036)

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

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)

Tentamen Datastrukturer (DAT037)

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

Föreläsning 2 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Datastrukturer. föreläsning 10. Maps 1

Fredag 10 juni 2016 kl 8 12

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

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

Föreläsning 8 Datastrukturer (DAT037)

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

Föreläsning 8 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Sökning och sortering

Datastrukturer. Föreläsning 5. Maps 1

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

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Tentamen Datastrukturer D DAT 036/DIT960

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Ekvivalensrelationer

Tildatenta Lösningsskiss

Programkonstruktion och. Datastrukturer

Föreläsning 9 Innehåll

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen Datastrukturer för D2 DAT 035

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

Föreläsning Datastrukturer (DAT037)

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

Länkade strukturer, parametriserade typer och undantag

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

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

Övningsuppgifter #11, Programkonstruktion och datastrukturer

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

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

Träd - C&P kap. 10 speciellt binära sökträd sid. 452

Algoritmer och datastrukturer 2012, föreläsning 6

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

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Transkript:

Föreläsning 4 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-10 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat037

Förra gången: Länkade listor, pekarjonglering Komplexitet för implementeringar av listor Invarianter, assertions, testning Träd

Cirkulära arrayer

Cirkulära arrayer Implementationsteknik för köer

Cirkulära arrayer public static class CircularArrayQueue<A> { private A[] queue; private int size; private int front; // nästa element private int rear; // nästa lediga public CircularArrayQueue(int capacity) { if (capacity <= 0) { throw new IllegalArgumentException( "non-positive capacity"); } queue = (A[]) new Object[capacity]; size = front = rear = 0; }

Cirkulära arrayer public void enqueue(a a) { if (size == queuelength) { doublecapacity(); } } size++; queue[rear] = a; rear = (rear + 1) % queuelength;

Cirkulära arrayer public A dequeue() { if (size == 0) { throw new NoSuchElementException( "queue empty"); } size--; A a = queue[front]; queue[front] = null; // undvik minnesläckor front = (front + 1) % queuelength; } return a;

Cirkulära arrayer private void doublecapacity() { A[] newqueue = (A[]) new Object[2 * queuelength]; } } for (int i = 0, j = front; i < size; i++, j = (j + 1) % queuelength) { newqueue[i] = queue[j]; } queue = newqueue; front = 0; rear = size;

Prioritetsköer

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

Prioritetsköer Några tillämpningar: Schemaläggning av processer Sortering Dijkstras algoritm (labb 3) Labb 2: Implementera prioritetskö

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) Anta att prioriteter kan jämföras på konstant tid

100 80 60 40 20 0 0 20 40 60 80 100 log₂ n n

Binära heapar

Binära heapar 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 3 6 B: 1 7 8 9 3 6 C: 1 8 7 9 3 D: 1 7 8 9 9 3 6 E: 1 7 8 9 1 2 F: 1 2 9 2 2 3 2

Binär heap implementerar prio kö 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 modify-key: Ändra prioritet, bubbla åt rätt håll Bubbla upp/ned tills heapordningsegenskapen återställts

Bubbla upp/ned 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 Om man kan hitta noderna snabbt: Tom kö: Θ(1) find-min: Θ(1) insert: O(log n) (kanske amorterat) delete-min: O(log n) (kanske amorterat) modify-key: O(log n) (Givet att jämförelser tar konstant tid) De flesta noderna är långt ned i trädet Medelkomplexitet för insert: O(1)

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

Vad blir resultatet om delete-min appliceras på 1? 8 4 9 5 3 A: 3 4 5 6 8 9 B: 3 5 6 4 8 9 C: 3 4 8 9 5 6 D: 3 4 5 8 9 6 6

modify-key När man implementerar modify-key, hur hittar man noden snabbt? Kan använda extra datastruktur Exempel: Hashtabell

build-heap 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 (Kan hoppa över alla löv) Heapordningsegenskapen uppfylls (kan bevisas med induktion)

build-heap: tidskomplexitet 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

merge 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 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 För en nod, X, i ett träd är npl(x) (null path length of X) kortaste vägen till ett löv (Jämför höjden som är längsta vägen till ett löv) För tomt träd är null path length 1 (liksom för höjden)

Leftist träd-egenskapen 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) För ett leftist träd gäller att den högraste vägen har max log(n + 1) noder, där N är totalt antal noder

Sammanfattning Cirkulära arrayer Prioritetskö Heap