Föreläsning Datastrukturer (DAT036)

Relevanta dokument
Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

Föreläsning 10 Datastrukturer (DAT037)

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

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

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

Föreläsning Datastrukturer (DAT036)

Algoritmer och datastrukturer 2012, föreläsning 6

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

Dugga Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Föreläsning 1 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT037)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Tentamen Datastrukturer (DAT036)

Träd Hierarkiska strukturer

Föreläsning 4 Innehåll

Föreläsning 5 Datastrukturer (DAT037)

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

Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

Tentamen Datastrukturer, DAT037 (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Trädstrukturer och grafer

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Träd. Rot. Förgrening. Löv

Föreläsning Datastrukturer (DAT036)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

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 5. Maps 1

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Datastrukturer. föreläsning 10. Maps 1

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

Föreläsning 2. Länkad lista och iterator

13 Prioritetsköer, heapar

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

Föreläsning 8 Datastrukturer (DAT037)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen Datastrukturer (DAT036)

Länkade strukturer. (del 2)

Föreläsning Datastrukturer (DAT036)

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

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

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

Föreläsning Datastrukturer (DAT036)

Länkade strukturer, parametriserade typer och undantag

Föreläsning 9 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 14 Innehåll

Lösningar Datastrukturer TDA

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

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

Föreläsning 13. Träd

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

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)

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen i Algoritmer & Datastrukturer i Java

Den som bara har en hammare tror att alla problem är spikar

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 2. Länkad lista och iterator

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning Datastrukturer (DAT037)

Seminarium 13 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

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

Transkript:

Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2012-11-05

Repetition Förra gången: Listor, stackar, köer. Länkade listor, pekarjonglering. Idag: Cirkulära arrayer. Dynamiska arrayer. Amorterad tidskomplexitet. Träd.

Cirkulära arrayer Implementationsteknik för köer.

Cirkulära arrayer public class CircularArrayQueue<A> { private A[] queue; // Invariant: queue.length > 0. private int size; private int front; // Nästa element (eller rear). private int rear; // Nästa lediga (eller front). public CircularArrayQueue(int capacity) { if (capacity <= 0) { throw new NonPositiveCapacityException(); } queue = (A[]) new Object[capacity]; size = front = rear = 0; } }...

Cirkulära arrayer public void enqueue(a a) { if (size == queue.length) { throw new FullQueueException(); } } size++; queue[rear] = a; rear = (rear + 1) % queue.length;

Cirkulära arrayer public A dequeue() { if (size == 0) { throw new EmptyQueueException(); } size--; A a = queue[front]; queue[front] = null; // Undvik minnesläckor. front = (front + 1) % queue.length; } return a;

Dynamiska arrayer Arrayer som ändrar storlek dynamiskt. Smidigt. Hur påverkas tidskomplexiteten?

Dynamiska arrayer public class DynamicArrayList<A> { private A[] list; private int size; public DynamicArrayList() { list = (A[]) new Object[0]; size = 0; } } public void add(a a) { if (size == list.length) { list = Arrays.copyOf(list, 2 * size); } list[size++] = a; }

Dynamiska arrayer public class DynamicArrayList<A> { Vad private A[] list; är fel? private int size; size = 0; Testa! } public DynamicArrayList() { list = (A[]) new Object[0]; } public void add(a a) { if (size == list.length) { } list = Arrays.copyOf(list, 2 * size); } list[size++] = a;

Dynamiska arrayer Värstafallstidskomplexitet: Θ(n). Men vi kopierar ju inte hela tiden Ca n/2 billiga operationer, en dyr: i medeltal konstant tid. Amorterad tidskomplexitet Θ(1).

Amorterad tidskomplexitet Man kan låta tidiga, billiga operationer betala för dyra, sena. Efter dubblering: n snabba insättningar, 1 dubblering. Låt de snabba insättningarna betala Θ(1) extra. Återstående kostnad för dubblering: Θ(1).

Amorterad tidskomplexitet, formellt Operationer: Faktisk tidskomplexitet: Amorterad tidskomplexitet: Krav: n n. t i i=1 o 1, o 2, o 3 t 1, t 2, t 3 a 1, a 2, a 3 n i=1 I varje steg är den totala amorterade tiden en övre gräns för den faktiska tiden. a i

Amorterad tidskomplexitet, formellt Operationer: Faktisk tidskomplexitet: Amorterad tidskomplexitet: o 1, o 2, o 3 t 1, t 2, t 3 a 1, a 2, a 3 Insättning tar konstant amorterad tid betyder: Insättning har amorterad tid a (konstant). Övriga operationer har amorterade tider a i. Så att kravet uppfylls för varje tänkbar operationssekvens o 1, o 2, o 3.

Amorterad tidskomplexitet, formellt Operationer: Faktisk tidskomplexitet: Amorterad tidskomplexitet: o 1, o 2, o 3 t 1, t 2, t 3 a 1, a 2, a 3 Insättning tar konstant amorterad tid betyder: Insättning har amorterad tid a (konstant). Övriga operationer har amorterade tider a i. Så att kravet uppfylls för varje tänkbar operationssekvens o 1, o 2, o 3. Notera att många operationer kan ignoreras (orelaterade, sätt a i = t i ).

Potentialmetoden Potentialfunktion Ψ Tillstånd R. Krav: s.ψ(s) Ψ(s 0 ). (s i : Tillstånd efter o i.) Definiera a i = t i + Ψ(s i ) Ψ(s i 1 ). Kravet uppfylls: n a i = (t i + Ψ(s i ) Ψ(s i 1 )) i=1 n i=1 = Ψ(s n ) Ψ(s 0 ) + t i n i=1 n t i i=1

Potentialmetoden: exempel Dynamiska arrayer: Välj potentialen så att dyra insättningar betalas av i tid. En konstant extrakostnad per insättning bör räcka. Vi kan bara använda de n/2 senaste extrabetalningarna.

Potentialmetoden: exempel Dynamiska arrayer: Välj potentialen så att dyra insättningar betalas av i tid. En konstant extrakostnad per insättning bör räcka. Vi kan bara använda de n/2 senaste extrabetalningarna. Potential (n: längd, c: kapacitet, arrayens längd): Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0.

Potentialmetoden: exempel Potential: Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0. Jag ignorerar tillstånd då listan inte existerar. s.ψ(s 0 ) = 0 Ψ(s).

Potentialmetoden: exempel Potential: Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0. Kan se det som att vi lägger κ kronor på varje nytt element. Pengarna används då arrayen dubbleras.

Potentialmetoden: exempel Potential: Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0. Endast en operation påverkar potentialen (om vi ignorerar skräpsamling): insättning. Analysen kan sluta fungera om klassen utökas!

Potentialmetoden: exempel Potential: Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0. Snabb insättning: a i = t i + Ψ(s i ) Ψ(s i 1 ) = Θ(1) + κ((n + 1) c/2 ) κ(n c/2 ) = Θ(1) + κ Konstant!

Potentialmetoden: exempel Potential: Ψ((c, n)) = κ(n c/2 ), för någon konstant κ > 0. Långsam insättning: a i = t i + Ψ(s i ) Ψ(s i 1 ) = Θ(n) + κ((n + 1) 2n/2 ) κ(n n/2 ) = Θ(n) + κ(1 (n n/2 )) = Θ(n) + κ(1 n/2 ) Konstant om κ väljs tillräckligt stor!

Övning Vad händer om arrayens längd tredubblas? Övning Vad händer om vi lägger till 10 element varje gång? Övning Utöka klassen med en metod m. Insättning och m ska inte båda kunna ges konstant amorterad tidskomplexitet.

Mer om amorterad tidskomplexitet Samma operation kan ges olika amorterad tidskomplexitet i olika analyser. Vissa operationer långsamma: kan vara problematiskt i realtidssammanhang.

Listor: tidskomplexitet add(x) add(x, i) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dynamisk array Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next O(1) O(1) remove Dubbellänkad lista

Listor: tidskomplexitet Dynamisk array add(x) O(1) amorterat O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next O(1) O(1) remove O(n) O(1) Dubbellänkad lista

Listor: tidskomplexitet Några kommentarer: remove, contains: Givet att jämförelser tar konstant tid. Indexbaserade operationer för dubbellänkad lista med pekare till sista noden: Bättre än Θ(n) om man vet att i pekar nära början eller slutet av listan.

Collections i Java Java Collections Framework. ADT interface, datastruktur klass.

Träd Ett träd är tomt eller icketomt. Ett icketomt träd består av: En rot (ev med innehåll). Noll eller flera icke-tomma delträd (ofta ordnade).

Träd Terminologi: Förälder, barn, syskon, barnbarn o s v. Löv.

Träd En representation: class Tree<A> { class TreeNode { A contents; TreeNode firstchild; TreeNode nextsibling; } // null om löv. // null om sista barnet. } TreeNode root; // null om trädet är tomt.

Träd Höjd: Tomma träd har höjd -1. Löv har höjd 0. Övriga träd har höjd 1 + högsta barnträdets höjd. Ungefär: Antalet steg från roten till djupaste lövet.

Träd Höjd: int height(treenode n) { if (n == null) { return -1; } else { largestheight = -1; TreeNode current = n.firstchild; while (current!= null) { largestheight = max(largestheight, height(current)); current = current.nextsibling; } return 1 + largestheight; } }

Träd Uttrycksträd: Representerar aritmetiska uttryck. Tal eller variabler i löven. Operationer i noderna.

Binära träd Binära träd: Max två barn. Skiljer på vänster och höger barn även om det bara finns ett.

Binära träd En representation: class BinaryTree<A> { class TreeNode { A contents; TreeNode left; // null om vänster barn saknas. TreeNode right; // null om höger barn saknas. } } TreeNode root; // null om trädet är tomt.

Träd Kan gå igenom ett träds noder i olika ordning: Preorder Roten, barnträden från vänster till höger, vart och ett i preorder. Postorder Barnträden från vänster till höger, roten. Inorder För binära träd: vänster barnträd, roten, höger barnträd. Level-order Roten, noder på djup 1 från vänster till höger, noder på djup 2 från vänster till höger,

Fråga Vilken traverseringsordning är lämplig för att beräkna ett uttrycksträds värde?

Sammanfattning Cirkulära arrayer. Dynamiska arrayer. Amorterad tidskomplexitet. Träd. Nästa gång: Prioritetsköer. Binära heapar. Binomialheapar.