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

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

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

Föreläsning 3. Stack

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

Föreläsning 3. Stack

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

Datastrukturer. föreläsning 3. Stacks 1

Länkade strukturer. (del 2)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning Datastrukturer (DAT036)

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 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 4 Innehåll

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

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

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

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

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

Lösningsförslag till exempeltenta 2

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 2 Datastrukturer (DAT037)

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

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

Generisk klass med typparameter Inre klass - ListIterator

Stackar, köer, iteratorer och paket

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

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

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

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

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

Länkade strukturer, parametriserade typer och undantag

BST implementering, huvudstruktur

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

Tentamen Programmering fortsättningskurs DIT950

Föreläsning Datastrukturer (DAT036)

Föreläsning 10 Datastrukturer (DAT037)

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

! Skall den vara generisk? ! Skall den vara självexpanderande? ! Skall vi ha en speciell klass för listnoder? ! osv

Kurskod D0010E Datum Skrivtid 5tim

Tommy Färnqvist, IDA, Linköpings universitet

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

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Föreläsning 3 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 1

Laboration 13, Arrayer och objekt

Tentamen i Algoritmer & Datastrukturer i Java

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Datalogi, grundkurs 1. Lösningsförslag till tentamen

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

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Dugga Datastrukturer (DAT036)

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Laboration A Objektsamlingar

DAT043 Objektorienterad Programmering

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

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

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Kap J 7-1 Mer om arv. (superklass) (subklass)

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

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 3-4 Innehåll

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Föreläsning 8. Mängd, Avbildning, Hashtabell

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer (DAT036)

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

DAT043 - föreläsning 8

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

Samlingar Collection classes

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Föreläsning 14 Innehåll

Föreläsning 8. Mängd, Avbildning, Hashtabell

Transkript:

Föreläsning 4 Kö

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

ADT Kö Grundprinciper: En kö fungerar som en kö. Man fyller på den längst bak och tömmer den längst fram, FIFO - First In First Out. Välanvänd datastruktur (printköer, processköer, ). enqueue(element)-köar element sist dequeue()-tar bort första elementet i kön och returnerar detta Möjliga operationer create() empty() returnerar true om kön är tom front() returnerar första elementet utan att ta bort det size() returnerar antal element i kön

Kö JCF: Queue<E> I JCF är kö ett interface Queue<E>. Det använder inte riktigt konventionella namn på metoderna och för varje metod finns en som en som returnerar null eller false om den misslyckas och en som kastar ett exception och som ska användas för köer som inte kan bli fulla (använd inte dessa på systembolagets köer!). add(e e) Inserts the specified element into this queue returning true upon success and throwing an IllegalStateException if no space is currently available. offer(e e) Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions. Returns true or false. remove() Retrieves and removes the head of this queue. Throws NoSuchElementException if this queue is empty. poll() Retrieves and removes the head of this queue, or returns null if this queue is empty. element() Retrieves, but does not remove, the head of this queue. Throws NoSuchElementException if this queue is empty. peek() Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty. Ärver isempty och size och fler som måste implementeras.

Att använda en kö i JCF Queue implementeras av bland annat av LinkedList så vi kan vid behov få en kö genom: Queue<string> nameq = new LinkedList<String>; Nu kommer vi bara åt metoderna i interfacet på vår nameq. Dock kan vi fortfarande kasta om vår nameq för att komma åt element: String s= ((LinkedList<String>) nameq).get(2); Vill man undvika detta måste man skapa en ny klass.

Kö implementerad med en cirkulär array Att flytta alla element när vi tar bort första elementet blir ineffektivt (O(n)). Cirkulär array (O(1)): front rear Dequeue: front++ Enqueue: rear++ Om rear = maxsize sätt rear = 0 (samma för front) OBS rear får ej komma ifatt front full array - reallocate Enklast men ej nödvändigt är att ha en extra variabel size som håller reda på antal element. Vad ska rear och front ha för startvärden?

Steg 1 Vi börjar med följande skal: public class ArrayQueue<E> { private int front, rear, size, maxsize; private E[] data; public ArrayQueue(int initialmaxsize){ size = 0; front = 0; maxsize = initialmaxsize; rear = maxsize-1; data = (E[]) new Object[maxSize]; public boolean offer(e element){ // skriv kod som sätter in elementet, strunta i problemet att arrayen kan bli full return true; //Kompilera och testa att det verkar fungera att sätta in element

Lösningsförslag steg 1 public boolean offer(e element){ rear = (rear+1) % maxsize; data[rear] = element; size++; return true;

Steg 2 Skriv en peek metod Nu kan du testa att det verkar fungera lite bättre. Skriv sedan en poll metod.

Lösningsförslag steg 2 public E peek(){ if(size==0) return null; return data[front]; public E poll(){ if(size==0){ return null; else{ size--; E element = data[front]; front =(front+1) % maxsize; return element;

Steg 3 Dags att ta tag i problemet att arrayen kan bli full. Som vanligt dubblar vi den så att alla operationer blir O(1) i snitt. Dock kan vi inte lösa det riktigt lika enkelt som vanligt. Vi måste ta hand om att kön kan ligga över arrayslutet: 3 4 1 2 1 2 3 4

Lösningsförslag steg 3 private void reallocate() { int newmaxsize = 2 * maxsize; E[] newdata = (E[]) new Object[newMaxSize]; int j = front; for (int i = 0; i < size; i++) { newdata[i] = data[j]; j = (j + 1) % maxsize; front = 0; rear = size - 1; maxsize = newmaxsize; data = newdata; public boolean offer(e element) { if (size == maxsize) { reallocate(); rear = (rear + 1) % maxsize; data[rear] = element; size++; return true;

Testkod import java.util.linkedlist; import java.util.queue; public class Test { public static void main(string[] args) { ArrayQueue<String> nameq = new ArrayQueue<String>(10); for(int i=0;i<8;i++) nameq.offer("e"+(i+1)); nameq.poll(); nameq.poll(); for(int i=8;i<14;i++) nameq.offer("e"+(i+1)); while(nameq.peek()!=null) System.out.println(nameQ.poll());

Implementera interface Queue Snyggast vore att implementera interface Queue. Vi måste då implementera alla metoder. Viss hjälp kan vi få genom att ärva från AbstractQueue. Det enda lite jobbiga är att vi måste implementera en iterator vilket kanske inte är självklart att man vill ha i en kö.

import java.util.abstractqueue; import java.util.iterator; import java.util.nosuchelementexception; import java.util.queue; public class ArrayQueue<E> extends AbstractQueue<E> implements Queue<E> { private int front, rear, size, maxsize; private E[] data; @SuppressWarnings("unchecked") public ArrayQueue(int initialmaxsize) { size = 0; front = 0; maxsize = initialmaxsize; rear = maxsize - 1; data = (E[]) new Object[maxSize]; @Override public boolean offer(e element) { if (size == maxsize) { reallocate(); rear = (rear + 1) % maxsize; data[rear] = element; size++; return true; public E peek() { if (size == 0) { return null; return data[front]; public E poll() { if (size == 0) { return null; else { size--; E element = data[front]; front = (front + 1) % maxsize; return element;

@SuppressWarnings("unchecked") private void reallocate() { int newmaxsize = 2 * maxsize; E[] newdata = (E[]) new Object[newMaxSize]; int j = front; for (int i = 0; i < size; i++) { newdata[i] = data[j]; j = (j + 1) % maxsize; front = 0; rear = size - 1; maxsize = newmaxsize; data = newdata; @Override public Iterator<E> iterator() { return new Iter(); @Override public int size() { return size; private class Iter implements Iterator<E> { private int index; private int count = 0; public Iter() { index = front; @Override public boolean hasnext() { return count < size; @Override public E next() { if (!hasnext()) { throw new NoSuchElementException(); E returnvalue = data[index]; index = (index + 1) % maxsize; count++; return returnvalue; @Override public void remove() { //ska endast kunna ta bort det senaste throw new UnsupportedOperationException();

Kö implementerad med en länkad lista En länkad lista har fördelen att den alltid har rätt storlek på bekostnad av att den tar större plats pga länkarna. En enkellänkad kö tar lika stor plats som en array kö när denna är fylld till hälften. Att sätta in i kön (sist i listan) är O(n) men det kan man lösa genom att ha en länk till sista elementet (tail). På en dubbellänkad lista är alla operationer O(1) men den tar ännu större plats (tre gånger så stor plats som en full array). Det är alltså svårt att hitta några starka skäl för att använda en länkad lista för att implementera en kö men detta är trots allt vad JCF gör.

Läsanvisning och uppgifter KW 4.1, 4.2, 4.3, (4.4) Uppgifter: Jag kommer hädanefter endast lista uppgifter som ger poäng och någon enstaka viktig eller bra uppgift att göra. Se till att ändå gå igenom SC och P uppgifterna när du läser boken och gör de du behöver. (SC Self Check, P Programing, PP Programing Projects, NB se sist i föreläsningen) Avsnitt 4.3: NB 12(1p), 13, 14(2p), 15(2p)

Uppgifter NB 12 (1p) I en applikation där kön någon enstaka gång växer sig mycket större än normalt skulle det kunna vara intressant att en array-kö också kan krympa när så är möjligt. Utgå från vår kö på föreläsningen och lägg funktionalitet som halverar storleken på arrayen om den bara använder en fjärdedel av den nuvarande arrayen. Glöm inte att skriva testkod. Fundera också på om detta påverkar någon av operationerna så att de inte längre är O(1).

NB 13 Implementera en kö med en enkellänkad lista med en pekare till varje ända av listan så att alla operationer blir O(1). Använd bara bokens exempel om du kör fast.

NB 14 (2p) Implementera en Dequeue som en dubbellänkad lista. En dequeue är en kö där man kan sätta in och ta bort element i båda ändar. Den behöver inte implementera något interface och ska endast ha följande operationer: pollfirst, polllast, offerfirst, offerlast och empty. Se avsnitt 4.4 om du undrar över vad de ska göra. Skriv också testkod.

NB 15 (2p) Simulering liten flygplats. Denna har endast en landningsbana. simuleringen skall ske i tidssteg om 5 minuter. Det tar 20 minuter att genomföra en landning och lika lång tid att genomföra en start. Plan som behöver landa prioriteras alltid före plan som vill starta (dock får ett plan som påbörjat en start alltid fullfölja). Varje femminuters intervall är det 5 % sannolikhet att ett plan begär att få landa och 5 % sannolikhet att ett plan begär att få starta. Kör en simulering under 10 år och ta reda på medelväntetiden för plan som ska landa och medelväntetiden för plan som ska starta. Ta också reda på maximala väntetiden för ett plan som ska starta och för ett plan som ska landa. För statistikens skull räknar vi med att ett plan som dyker upp under ett intervall dyker upp precis i intervallets slut. Tips: Tanken är då att man använder två köer: ett för plan som ska stanna och ett för plan som ska starta.