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

Relevanta dokument
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

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

Föreläsning 3. Stack

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 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Länkade strukturer. (del 2)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Datastrukturer. föreläsning 3. Stacks 1

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

Föreläsning 4 Innehåll

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning Datastrukturer (DAT036)

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. Laboration 2 Datastrukturer En liten uppgift Frågor

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

Lösningsförslag till exempeltenta 2

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

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

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

Föreläsning 2 Datastrukturer (DAT037)

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

Tentamen i Algoritmer & Datastrukturer i Java

Stackar, köer, iteratorer och paket

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

Föreläsning 3 Datastrukturer (DAT037)

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

Generisk klass med typparameter Inre klass - ListIterator

Föreläsning 4 Datastrukturer (DAT037)

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

BST implementering, huvudstruktur

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

Tentamen Programmering fortsättningskurs DIT950

Länkade strukturer, parametriserade typer och undantag

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning Datastrukturer (DAT036)

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

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

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

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

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

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

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

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

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

Föreläsning 10 Datastrukturer (DAT037)

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 3 Datastrukturer (DAT037)

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

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

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

Lösningsförslag till exempeltenta 1

Kurskod D0010E Datum Skrivtid 5tim

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 3-4 Innehåll

Laboration A Objektsamlingar

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

Föreläsning 14 Innehåll

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

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

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

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

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

Föreläsning Datastrukturer (DAT036)

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

Tentamen i Algoritmer & Datastrukturer i Java

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

13 Prioritetsköer, heapar

Föreläsning 2 Datastrukturer (DAT037)

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

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

Laboration 13, Arrayer och objekt

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

Samlingar Collection classes

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

Tentamen i Algoritmer & Datastrukturer i Java

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

DAT043 - föreläsning 8

OOP Objekt-orienterad programmering

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

Dugga Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

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

DAT043 Objektorienterad Programmering

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

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, problemlösning, ). Måste-metoder: enqueue(element)-köar element sist dequeue()-tar bort första elementet i kön och returnerar detta Vanliga metoder: 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ö i JCF I JCF är kö ett interface Queue<E> Ej konventionella namn på metoder För varje operation finns två metod: en som returnerar null eller false om den misslyckas en metod som kastar ett exception om den misslyckas

Att använda en kö i JCF Queue implementeras av LinkedList : 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 mitt i kön: String s= ((LinkedList<String>) nameq).get(2); Vill man undvika detta möjliga missbruk måste vi skapa en ny klass. Det är ändå mycket bättre inkapslat än för Stack.

Metoder i Queue 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. Interfacet ärver bla isempty och size.dessa måste också implementeras.

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

Steg 1 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 offer public boolean offer(e element){ rear = (rear+1) % maxsize; data[rear] = element; size++; return true;

Steg 2 Skriv en peek metod som returnerar null om kön är tom Testa att både offer och peek verkar fungera

Lösningsförslag peek public E peek(){ if(size==0) return null; return data[front];

Steg 3 Skriv sedan en poll metod.

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

Steg 4 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. Vi måste ta hand om att kön kan ligga över arrayslutet: 1 3 4 1 2 3 4 2

Lösningsförslag reallocate 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 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 interfacet Queue i vår kö. Vi måste då implementera alla metoder. Viss hjälp kan vi få genom att ärva från AbstractQueue. Dock måste vi implementera en iterator viktigt att vi inte implementerar remove vilket skulle bryta mot kö-principen egentligen är även next tveksam som ger oss möjlighet att både få data från och påverka objekt längre ner i kön

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 första 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.