Föreläsning Datastrukturer (DAT036)

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

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

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

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

Föreläsning Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 4 Innehåll

Tentamen Datastrukturer (DAT036)

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Föreläsning 13 Datastrukturer (DAT037)

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ö

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

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 2. Länkad lista och iterator

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

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

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

Tentamen i Algoritmer & Datastrukturer i Java

Länkade strukturer. (del 2)

Dugga Datastrukturer (DAT036)

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

Tentamen Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

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

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

Länkade strukturer, parametriserade typer och undantag

Föreläsning 8: Exempel och problemlösning

Föreläsning 10 Datastrukturer (DAT037)

So far... For recursive and iterative programs. Bubble, insertion, selection, quick, merge, counting

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Stackar, köer, iteratorer och paket

Föreläsning Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

Föreläsning 14 Innehåll

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

Tentamen Datastrukturer, DAT037 (DAT036)

Datastrukturer och algoritmer

Tentamen i Algoritmer & Datastrukturer i Java

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning Datastrukturer (DAT037)

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

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 3. Stack

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

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

Föreläsning 3. Stack

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

Datastrukturer och algoritmer

Föreläsning 8 Datastrukturer (DAT037)

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 9 Datastrukturer (DAT037)

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

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

Exempeltenta GruDat 2002/2003

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

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

Tentamen Programmering fortsättningskurs DIT950

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

Föreläsning 8 Datastrukturer (DAT037)

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

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 12. Länkade listor

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

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

Datastrukturer i Haskell

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Transkript:

Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-10-30

Repetition Analys av tidskomplexitet. Kostnadsmodeller. Asymptotisk komplexitet/notation. Dynamiska arrayer.

Amorterad tidskomplexitet Tidskomplexitet för att lägga till n element till en tom dynamisk array: Θ(n). Tidskomplexitet för att lägga till ett element: O(n), där n är arrayens storlek. Amorterad tidskomplexitet för att lägga till ett element: O(1).

Amorterad tidskomplexitet Man kan låta tidiga, billiga operationer betala för dyra, sena. Efter dubblering: n snabba insättningar, 1 dubblering. Insättning: Lägg ett mynt på cellen, och ett på en gammal cell. Kopiering: Har ett mynt på varje cell, kopieringen betald.

Amorterad tidskomplexitet Vissa operationer långsamma: kan vara problematiskt i realtidssammanhang. Gamla tentor m m: potentialmetoden.

Dynamiska arrayer med remove Har add och remove amorterade tidskomplexiteten O(1) om man halverar arrayen när den blir Varför? halvfull? kvartsfull? http://pingo.upb.de/

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, två listor

ADT-er Kan använda en ADT för att implementera en annan. Även på tentan!

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

Listor, stackar och köer: tillämpningar Diskussionsuppgift Vad kan man ha de här ADT-erna till? Svara helst med ett ord per fält, gärna substantiv i obestämd form, singular.

Listor, stackar och köer: tillämpningar Stackar Implementera rekursion. Evaluera postfix-uttryck. Topologisk sortering (grafalgoritm). Köer Skrivarköer. Simulering av riktiga köer. Topologisk sortering (grafalgoritm). Bredden först-sökning (grafalgoritm). 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?

Dubbellänkad lista med dubbla vaktposter public class DoublyLinkedList<A> { private class ListNode { A contents; ListNode next; // null omm sista vakten. ListNode prev; // null omm första vakten. } }...

Dubbellänkad lista med dubbla vaktposter public class DoublyLinkedList<A> {... private ListNode first, last; private int size; // Ej null. } // Konstruerar tom lista. public DoublyLinkedList() { first = new ListNode(); last = new ListNode(); first.next = last; last.prev = first; size = 0; }

Övning Implementera metoden addfirst. (Tips: Rita först upp vad som ska hända.) Hitta sedan felet i följande kod. 1 void addfirst(a x) { 2 ListNode node = new ListNode(); 3 node.contents = x; 4 node.next = first.next; 5 node.prev = first; 6 last.prev = node; 7 first.next = node; 8 size++; 9 }

Invariant Egenskap som alltid gäller för programmets tillstånd. Exempel: 1. first!= null. 2. last.next = null. 3. n.next.prev = n (om n ej är vaktpost). 4. first.next size+1 = last. Invarianter bryts ibland temporärt när objekt uppdateras.

Precondition Krav som förväntas vara uppfyllt då metod anropas. Exempel: pop kräver att stacken inte är tom.

Postcondition Egenskap som är uppfylld efter anrop, givet preconditions och invarianter. Exempel: Efter push är stacken inte tom.

Assertion Man kan testa vissa egenskaper med assertions. Kan vara smidigt för att hitta/undvika fel i labbar. Fail.java public class Fail { public static void main (String[] args) { assert(args.length == 2); } } $ javac Fail.java $ java Fail $ java -ea Fail ett två $ java -ea Fail Exception in thread "main" java.lang.assertionerror at Fail.main(Fail.java:3)

Assertion I Haskell (assert :: Bool -> a -> a): Fail.hs module Fail where import Control.Exception foo :: Integer -> Integer foo n = assert (n > 0) (7 `div` n) *Fail> foo 3 2 *Fail> foo 0 *** Exception: Fail.hs:6:9-14: Assertion failed

Assertion // Skapar ny /intern/ listnod. // Precondition: prev!= null && next!= null. ListNode(A contents, ListNode prev, ListNode next) { assert prev!= null && next!= null; this.contents = contents; this.prev = prev; this.next = next; } Nu leder new ListNode(x,first.prev,first.next) till ett AssertionError (med -ea), inte ett kryptiskt fel senare.

Assertion // Lägger till x efter n. // Precondition: n!= null && n!= last. void addafter(listnode n, A x) { assert n!= null && n!= last; } ListNode next = n.next; n.next = new ListNode(x, n, next); next.prev = n.next; size++; void addfirst(a x) { addafter(first, x); }

Korrekthet Hur kan man förvissa sig om att man löst en uppgift korrekt? Bevis. Kan vara svårt, ta mycket tid. Tester. Kan gå snabbare.

Tester När ni jonglerar pekare (på papper eller i dator): Testa gärna lösningen. Några representativa fall: Tom lista. Lista med några element.

// Implementera en operation som lägger till en lista i slutet av en // annan lista. I värsta fallet ska operationen ta konstant tid. // Exempel: Om man lägger till [3, 4, 5] i slutet av [1, 2] ska // resultatet bli [1, 2, 3, 4, 5]. OK? // Enkellänkade listor med en "vaktpost" i början samt pekare till // vaktposten och sista noden: class List<A> { class ListNode { A contents; ListNode next; } ListNode head; ListNode tail; // Pekar på vaktposten. // Pekar på vaktposten om listan är tom, // annars på den sista riktiga noden. // Lägger till ys sist i listan, utan att förstöra ys. void append(list<a> ys) { tail.next = ys.head.next; tail = ys.tail; } } // Fler operationer...

Haskell Enkellänkade listor. Två slags noder: tom lista och conscell. Endast pekare till första noden, inget objekt innehållandes storlek e d. Inga vaktposter. Svansar kan delas. Exempel: xs = [3, 4, 5] ys = 1 : 2 : xs

Persistens (Vanliga) Haskellistor kan inte uppdateras. När man lägger till ett element till en lista så finns den gamla listan kvar (tills den skräpsamlas). Fördel: Behöver inte kopiera listor. Fördel: Parallellprogrammering kan bli enklare. Nackdel: Vissa operationer mindre effektiva. Kan implementera persistenta datastrukturer i Java också.

Hur många consceller innehåller tails [1, 2, 3]? tails :: [a] -> [[a]] tails [] = [[]] tails xs = xs : tails (tail xs) tails [1, 2, 3] = [[1, 2, 3], [2, 3], [3], []]

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 Haskellista

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

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

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

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

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

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

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

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

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

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

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

Listor: tidskomplexitet Några kommentarer: remove, contains: Givet att jämförelser tar konstant tid. Indexbaserade operationer för länkade listor: Bättre än Θ(n) om man vet att i pekar nära början (eller i vissa fall slutet) av listan.

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). // Precondition: capacity > 0. public CircularArrayQueue(int capacity) { if (capacity <= 0) { throw new NonPositiveCapacityException(); } queue = (A[]) new Object[capacity]; size = front = rear = 0; }...

Cirkulära arrayer // Precondition: Kön får inte vara full. public void enqueue(a a) { if (size == queue.length) { throw new FullQueueException(); } } size++; queue[rear] = a; rear = (rear + 1) % queue.length; (Fungerar ej om rear = Integer.MAX_VALUE )

Cirkulära arrayer // Precondition: Kön får inte vara tom. 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;

Köer i Haskell Implementera kö-adtn m h a lista? Nja, dyrt att sätta in element sist. Ett alternativ: två listor.

Köer i Haskell module Queue (Queue, empty, isempty, enqueue, dequeue) where -- Invariant: front är tom omm kön är tom. data Queue a = Q { front :: [a], rear :: [a] } empty :: Queue a empty = Q [] [] isempty :: Queue a -> Bool isempty (Q [] _) = True isempty _ = False

Köer i Haskell -- Invariant: front är tom omm kön är tom. data Queue a = Q { front :: [a], rear :: [a] } enqueue :: a -> Queue a -> Queue a enqueue x (Q [] _) = Q [x] [] enqueue x (Q f r) = Q f (x : r) first :: Queue a -> Maybe a first (Q [] _) = Nothing first (Q (x : _) _) = Just x dequeue :: Queue a -> Maybe (Queue a) dequeue (Q [] _) = Nothing dequeue (Q [_] r) = Just (Q (reverse r) []) dequeue (Q (_ : f) r) = Just (Q f r)

Köer i Haskell Tidskomplexitet (jag ignorerar lathet): empty, isempty, enqueue, first: Θ(1). dequeue: O(1) (amorterat). Betala ett mynt extra vid insättning, använd mynten för att betala för reverse.

Skapa en kö innehållandes 1, 2,, n: xs = enqueue n ( (enqueue 2 (enqueue 1 empty)) ) Kör sedan följande kod n ggr: dequeue xs Vad är tidskomplexiteten? Θ(1). Θ(n). Θ(n 2 ). Θ(n 3 ).

Persistens, igen Analysen fungerar inte eftersom vi betalar med samma mynt många gånger. Den amorterade tidskomplexiteten för dequeue är O(1) om kön används enkeltrådat. Man kan konstruera persistenta köer med bra flertrådad tidskomplexitet, se t ex Okasakis avhandling.

Sammanfattning Amorterad tidskomplexitet. ADT-er/datastrukturer. Persistenta datastrukturer. Listor, stackar, köer. Invarianter, assertions m m. Testning. Länkade listor, pekarjonglering. Cirkulära arrayer. Köer m h a två listor.