Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

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

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

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

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

Länkade strukturer, parametriserade typer och undantag

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

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

Föreläsning 4 Innehåll

DAT043 - föreläsning 8

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

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

Tentamen Datastrukturer D DAT 035/INN960

Länkade strukturer. (del 2)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

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

Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning 9 Datastrukturer (DAT037)

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Tentamen Datastrukturer (DAT036)

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 5 Innehåll

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

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

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

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

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Tentamen Datastrukturer D DAT 036/DIT960

Tentamen Datastrukturer (DAT037)

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

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

Algoritmer. Två gränssnitt

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 14 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Sökning och sortering

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen i Algoritmer & Datastrukturer i Java

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

Dugga Datastrukturer (DAT036)

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

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Tentamen Datastrukturer (DAT036)

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

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 10. ADT:er och datastrukturer

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 11. ADT:er och datastrukturer

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

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

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Exempeltenta GruDat 2002/2003

Datastrukturer och algoritmer

Tentamen Datastrukturer, DAT037 (DAT036)

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

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

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

Stackar, köer, iteratorer och paket

Vad har vi pratat om i kursen?

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Samlingar Collection classes

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning REPETITION & EXTENTA

Datastrukturer och algoritmer

Föreläsning 8 Datastrukturer (DAT037)

Asymptotisk komplexitetsanalys

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

Abstrakta datastrukturer

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

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

Transkript:

Föreläsning 2 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-02 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037

Tidskomplexitet Hur analyserar man tidskomplexitet? Mäta. Nackdelar: Kan vara tidskrävande, kanske inget bra stöd för design. Nödvändigt i vissa fall för att se vad som är bäst i praktiken (för t. ex. små indata) Räkna instruktioner. Nackdelar: Komplicerat. Förenklad modell. Nackdelar: Inte tillämpligt i alla lägen.

Uniform kostnadsmodell Godtyckligt stora tal. Oändligt minne.

Uniform kostnadsmodell Godtyckligt stora tal. Oändligt minne. Inte realistisk. Fungerar ganska bra om man är försiktig. Används ofta i kursen.

Logaritmisk kostnadsmodell Tid beräknas i termer av indatas storlek, räknat i antal bitar. Oändligt minne. Lite mer realistisk, lite krångligare.

Värsta-, bästafallskomplexitet Vad händer med exekveringstiden om en dublett hittas? class IntMultiSet { int[] a;... boolean hasduplicate() { for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] == a[j]) return true; return false;

Exekveringstiden beror inte alltid enbart på indatans storlek, utan kan bero av dess beskaffenhet i övrigt. Därför talar man om värsta falls-, bästa falls- (och medel-)komplexitet. För de två exemplen räknade vi med att det inte fanns dubletter så att slingorna skulle exekveras fullt ut. Det var alltså värsta fallskomplexiteten. I bästa fall hittas en dublett med en gång, d.v.s. bästa fallskomplexiteten är O(1). Vanligast är att prata om värsta fallskomplexiteten eftersom man använder O() och är intresserad av hur lång tid det tar som längst.

Exempel vad är tidskomplexiteten (som funktion av längden på x)? static void filter(double[] x) { for (int i = 0; i <= x.length - 5; i++) { double s = 0; for (int j = i; j < i + 5; j++) { s += x[j]; x[i] = s / 5; n = x.length

Iteration av inre slingan: O(1) Inre slingan (upprepas 5 ggr): O(5 1) = O(1) Resten av en iteration av yttreslingan: O(1) En iteration av yttre slingan totalt: O(1 + 1) = O(1) Yttre slingan: O((n 4) 1) = O(n) T (n) = O(n)

Ett exempel till. Tidskomplexitet? static void f(int[] x) { for (int i = x.length; i > 0; i /= 2) { x[i - 1] = 0;

Antag att n = 2 k. Då gäller att antal iterationer är: I(2 k ) = 1 + k Räknar man noga på det kan man visa att för godtyckligt n gäller I(n) = 1 + 2 log(n) (n > 0) Tidskomplexitet är allstå: T (n) = O(log(n))

Dynamisk array Åter till vår första variant av IntMultiSet. En metod add lägger till ett nytt tal. class IntMultiSet { int[] a;... void add(int x) { int[] newa = new int[a.length + 1]; for (int i = 0; i < a.length; i++) { newa[i] = a[i]; newa[a.length] = x; a = newa;... boolean hasduplicate() {...

Varje insättningsoperation tar O(n). Går att göra bättre. class IntMultiSet { int[] a; int size; // #used elements in a... void add(int x) { if (size == a.length) { int[] newa = new int[size + 10]; for (int i = 0; i < size; i++) { newa[i] = a[i]; a = newa; a[size] = x; size++;...

9 av 10 insättningar går på O(1) men var tionde på O(n). En sekvens av insättningar går 10 ggr snabbare i praktiken, men ändå O(n) i genomsnitt. Använd istället en dynamisk array som växer multiplikativt.

class IntMultiSet { int[] a; int size; // #used elements in a... void add(int x) { if (size == a.length) { int[] newa = new int[2 * size]; for (int i = 0; i < size; i++) { newa[i] = a[i]; a = newa; a[size] = x; size++;...

Amortized complexity / bokföringsmetoden För en sekvens av operationer är amorterad kompexitet den tid per operation som gått åt. För billiga exekveringar betalar man lite extra tids-mynt som man kan använda vid senare dyra exekveringar. För den dynamiska arrayen som dubblar storlek kan man betala två extra mynt. Ett för att täcka kopieringen av elementet själv vid nästa dubblering och ett för att täcka kopieringen av ett av elementet i gamla halvan. Detta gör att varje element har ett mynt vid nästa dubblering så hela kopieringen kan betalas med sparade mynt. Den amorterade komplexiteten är alltså O(1).

Detta fungerar inte med varianten som ökar storleken additivt. Där skulle vi behöva spara n/10 mynt per operation för att täcka nästa kopiering. Alltså amorterad (och värsta falls-)komplexitet O(n).

Generics Att återanvända kod är en princip som genomsyrar programmerandet och design av programspråk. Vi har sub-rutiner och klass-arv etc. som stöder detta. En sak som också främjar detta är generics/polymorfism. När data inte behöver vara en av specifik typ kan vi i java säga att den kan vara vad som helst.

Här är ett exempel på en generisk metod: static <E> void reverse(e[] arr) { E tmp; for (int i = 0; i < arr.length / 2; i++) { tmp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = tmp;

Förutom generiska metoder kan man även definiera generiska interface och klasser. Generics kommer vi använda mycket eftersom datastrukturer handlar om att organisera många data-värden. Man vill förstås implementera datastrukturer för alla möjliga typer av data på en gång. Ofta kan inte de generiska typerna vara helt godtyckliga utan måste ha någon egenskap som används av metoden/klassen.

Här är ett exempel där jämförelse måste vara definierad för den okända typen: static <E extends Comparable<? super E>> E findmin(e[] arr) { if (arr.length == 0) return null; E min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i].compareto(min) < 0) min = arr[i]; return min;

Listor, stackar, köer

Problem/algoritm Problem: sortera en lista. Algoritmer: Insertion sort. Mergesort. Quicksort.

Abstrakt datatyp/datastruktur Abstrakt datatyp (matematisk abstraktion): lista. Datastrukturer (implementation): Array (dynamisk?). Enkellänkad lista.

Listor, stackar och köer: ADT-er ADT Stack Kö Lista Iterator Operationer (exkl konstruerare) push, pop enqueue, dequeue add(x), add(x, i), remove(x), remove(i), get(i), set(i, x), contains(x), size, iterator hasnext, next, remove (Inte exakta definitioner.)

Listor, stackar och köer: datastrukturer ADT Implementationer Lista dynamisk array, enkellänkad lista, dubbellänkad lista Stack lista Kö lista, cirkulär array

ADT-er Kan använda en datastruktur för en viss ADT för att implementera en annan ADT.

Collections i Java Java Collections Framework. ADT gränssnitt, datastruktur klass.

Stackar och köer: tillämpningar Stackar Implementera rekursion. Evaluera postfix-uttryck. Köer Skrivarköer. Bredden först-sökning (grafalgoritm).

Länkade listor

Länkade listor Många varianter: Objekt med pekare till första noden, kanske storlek. Pekare till sista noden? Enkellänkad, dubbellänkad? Vaktposter (sentinels)? Först/sist/både och?

Sammanfattning Amorterad tidskomplexitet. Generics ADT-er/datastrukturer. Listor, stackar, köer.