13 Prioritetsköer, heapar

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

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

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

Seminarium 13 Innehåll

Föreläsning 13 Innehåll

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

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

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

Föreläsning 14 Innehåll

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

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

Föreläsning 9 Innehåll

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 4 Datastrukturer (DAT037)

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Träd Hierarkiska strukturer

Tentamen, Algoritmer och datastrukturer

Föreläsning 10 Innehåll

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 4 Datastrukturer (DAT037)

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer för D2 DAT 035

Algoritmer och datastrukturer 2012, fo rela sning 8

Algoritmer och datastrukturer 2012, föreläsning 6

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Tentamen i Algoritmer & Datastrukturer i Java

Lösningsförslag till exempeltenta 1

Datastrukturer. Föreläsning 5. Maps 1

Lösningar Datastrukturer TDA

Algoritmer och datastrukturer

Interfacen Set och Map, hashtabeller

Föreläsning Datastrukturer (DAT036)

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

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

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

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

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

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 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 3 Datastrukturer (DAT037)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 4 Innehåll

Föreläsning 10 Innehåll

Programmering fortsättningskurs

Tentamen kl Uppgift 4. Uppgift 5

Datastrukturer. föreläsning 10. Maps 1

Tentamen i Algoritmer & Datastrukturer i Java

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Datastrukturer. föreläsning 3. Stacks 1

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

Tentamen i Algoritmer & Datastrukturer i Java

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

DAI2 (TIDAL) + I2 (TKIEK)

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

Lösningsförslag till tentamen

Exempeltenta GruDat 2002/2003

Föreläsning 11 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:

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Föreläsning 12 Innehåll

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

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

Lösningsförslag till tentamen

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Diskutera. Hashfunktion

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 3 Datastrukturer (DAT037)

Fredag 10 juni 2016 kl 8 12

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)

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

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

Föreläsning 11 Innehåll

Inlämningsuppgift och handledning

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Trädstrukturer och grafer

Föreläsning 13 Innehåll

Tentamen Datastrukturer D DAT 035/INN960

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

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 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Lösningsförslag till tentamen

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Transkript:

Prioritetsköer, heapar 31 13 Prioritetsköer, heapar U 101. En prioritetskö är en samling element där varje element har en prioritet (som används för att jämföra elementen med). Elementen plockas ut i prioritetsordning till skillnad mot en vanlig kö där elementen plockas ut i den ordning de satts in i kön. De operationer man ska kunna göra på en prioritetskö är sätta in element ta reda på det högst prioriterade elementet (minsta elementet) ta bort det högst prioriterade elementet (minsta elementet) U 102. Heap efter insättning av element med nycklarna: 2, 5, 1, 7, 9, 6, 3, 0, 8, 4. 0 1 2 5 4 6 3 7 8 9 U 103. En heap kan lagras i en vektor. Roten lagras på plats 0. Barnen till noden på plats i finns på platserna 2i + 1 och 2i + 2 i vektorn. Nod på plats i har alltså sin förälder på plats (i-1)/2). Heapen från uppgift U 102: 0 1 2 5 4 6 3 7 8 9 0 1 2 3 4 5 6 7 8 9 U 104. Tag bort noden på plats 0 i vektorn. Ersätt med den som finns på sista plats. Detta ger rätt form, men roten har nu troligtvis fel storleksförhållande till sina barn. Byt med minsta av barnen tills ordningen ok ( percolate down ). U 105. a) Antag t ex att vi sätter in tre lika element e 1, e 2 och e 3 (i den ordningen) i en heap. Heapens utseende efter dessa insättningar visas till vänster i figuren nedan. Antag nu att vi gör en borttagning. Det blir då e 1 som tas ut. Efter borttagningen har heapen det utseende som visas till höger i figuren nedan. Nästa borttagning kommer därför att ta ut e 3. Detta element är yngre än e 2. Alltså är heapen inte stabil. e 1 e 3 e 2 e 3 e 2 b) Man kan sätta in element som består av prioritet plus ett nummer. Man numrerar sina element 1,2,... efterhand som man sätter in dem. Vidare definierar man comparetometoden så att den jämför på prioritet i första hand och nummer i andra hand. Av två element med lika prioritet kommer ett som är senare insatt då att anses vara större än det tidigare insatta. Då kommer element med lika prioritet att komma ut ur heapen i den ordning de sattes in.

32 Prioritetsköer, heapar U 106. I en heap kan man snabbt hitta minsta elementet. Sökning av ett godtyckligt element blir däremot dyrare. Vi kan inte söka oss ner på en gren som i ett sökträd, en heap är ju inte ordnad på samma sätt. Vi måste söka i både vänster och höger underträd tills vi eventuellt hittar elementet. I värsta fall behöver vi söka igenom hela heapen, vilket kostar O(n). U 107. a) Om trädet är skevt t.ex. om alla noder bara har höger barn så kommer noderna att hamna på platserna 0, 2, 6,..., 2 i 2,..., 2 n 2 i vektorn. I det andra fallet inträffar värsta fallet när noden på nivå k + 1 är höger barn till noden längst till höger på nivå k. Noden på nivå 1 finns på plats 0 i vektorn. Noderna på nivå 2 finns på platserna 1 och 2, noderna på nivå 3 på platserna 3, 4, 5 och 6 etc. Noderna på nivå i finns alltså på platserna 2 i 1 1... 2 i 2. Alla noder på nivåerna 1..k kommer därför att fylla platserna 1..2 k 2. Lägger vi till ett höger barn till den sista noden hamnar det på plats 2 k+1 2 d.v.s. vi behöver ungefär dubbelt så stor vektor trots att vi bara lägger till en enda nod på sista nivån. b) Om trädet är tomt ska det nya elementet placeras i roten. Om trädet har en nod ska det nya elementet placeras som vänster barn till roten, och om trädet har två noder ska det nya elementet placeras som höger barn till roten. Låt en båge från en nod till dess vänstra barn representera en nolla och en båge från en nod till dess högra barn representera en etta. Vägen för den andra noden beskrivs då av en nolla och vägen för den tredje noden av en etta. Om vi går vidare och utgår från ett träd med tre noder så ska den fjärde noden placeras som vänster barnbarn till roten. Denna väg motsvarar sekvensen 00. Nästa nods väg beskrivs av 01 och nästa av 10 och den sjunde nodens väg är 11. Om vi låter vägen till roten beskrivas av en etta får vi i stället sekvensenra 100, 101, 110 och 111 d.v.s. den binära representationen av 4, 5, 6 och 7. Varje nods plats beskrivs alltså på detta sätt av den binära representationen av antalet noder efter insättningen. U 108. I stället för en heap kan man använda t.ex. ett balanserat binärt sökträd för att representera en prioritetskö. Trädet sorteras då efter prioriteter. Man måste modifiera trädimplementeringen så att dubbletter kan sättas in. Detta kan man göra genom att man vid likhet mellan element alltid väljer att göra insättning i t.ex. höger underträd. Vi vet sedan tidigare att insättning kostar O( 2 logn) i ett balanserat binärt sökträd. Om vi ska använda trädet som en prioritetskö behöver vi också en metod för att ta bort minsta elementet ur trädet. Detta element finns längst ner till vänster i trädet, d.v.s. man hittar det genom att utgående från roten flytta sig nedåt med hjälp av referenserna till vänster barn. Borttagning kan inte kosta mer än O( 2 logn) i ett balanserat träd. Man kan också använda listor, sorterade eller osorterade. Har man en osorterad lista blir operationerna för att söka minsta och ta bort minsta långsamma (O(n)) men insättning blir O(1). För en sorterad lista är det tvärtom. U 109. Man kan införa en vektor av listor. Vektorns storlek = antalet olika prioriteter. Ett elements prioritet avgör i vilken lista det placeras. Insättning blir O(1). Tag bort minsta och sök minsta blir också O(1). Man måste visserligen söka upp första icke-tomma listan i vektorn, men vektorns storlek är en konstant. Man åstadkommer stabilitet genom att sätta in ett nytt element sist i den lista där det hör hemma. Det kräver då att man har en listimplementation där insättning sist kostar O(1).

Prioritetsköer, heapar 33 U 110. a) public class Patient implements Comparable<Patient> { private static int total = 0; private String firstname; private String lastname; private String personnbr; private int prio; private int number; public Patient(String firstname, String lastname, String personnbr, int prio) { this.firstname = firstname; this.lastname = lastname; this.personnbr = personnbr; this.prio = prio; total++; number = total; public int compareto(patient rhs) { if (prio == rhs.prio) { return number - rhs.number; else { return prio - rhs.prio; public boolean equals(object rhs) { if (rhs instanceof Patient) { return compareto((patient) rhs) == 0; else { b) PriorityQueue<Patient> pq = new PriorityQueue<Patient>(); pq.offer(new Patient("Kalle", "Karlsson", "8503622-1213", 3)); pq.offer(new Patient("Lisa", "Svensson", "840312-1224", 2)); pq.offer(new Patient("Lena", "Nilsson", "820323-1224", 3)); U 111. a) public class PrioComparator implements Comparator<Patient> { public int compare(patient p1, Patient p2) { if (p1.getprio() == p2.getprio()) { return p1.getnumber() - p2.getnumber(); else { return p1.getprio() - p2.getprio(); Om vi förutsätter att metodern getnumber och getprio redan finns i klassen Patient behövs inga ytterligare förändringar. Klassen Patient ser ut så här:

34 Prioritetsköer, heapar public class Patient implements Comparable<Patient> {... // attribut och konstruktor enligt tidigare public int compareto(patient rhs) { return personnbr.compareto(rhs.personnbr); public boolean equals(object rhs) { if (rhs instanceof Patient) { return compareto((patient) rhs) == 0; else { public int getprio() { return prio; public int getnumber() { return number; b) PriorityQueue<Patient> pq = new PriorityQueue<Patient>(10, new PrioComparator()); U 112. a) /** * Skapar ett objekt som hanterar en kö för köpordrar och en kö för säljordrar * för aktien med id shareid. * @param shareid aktieslag public OrderQueues(String shareid) { this.shareid = shareid; buyorders = new PriorityQueue<Order>(10, new ReversePriceComparator()); sellorders = new PriorityQueue<Order>(10, new PriceComparator()); /** * Lägger till en köporder ifall matchande säljorder inte finns. * Om matchande säljorder finns tas säljordern bort och returneras. * @param buyorder köporder * @return matchande säljorder om sådan finns, i annat fall null public Order addbuyorder(order buyorder) { if (! sellorders.isempty() && buyorder.getprice() >= sellorders.peek().getprice()) { return sellorders.poll(); buyorders.offer(buyorder); return null; Det behövs också två klasser som implementerar Comparator:

Prioritetsköer, heapar 35 public class PriceComparator implements Comparator<Order> { public int compare(order order1, Order order2) { return Double.compare(order1.getPrice(), order2.getprice()); public class ReversePriceComparator implements Comparator<Order> { public int compare(order order1, Order order2) { return Double.compare(order2.getPrice(), order1.getprice()); Alternativ lösning: Man kan stryka den ena Comparator-klassen om man låter klassen Order implementera Comparable: public class Order implements Comparable<Order> {... public int compareto(order other) { return Double.compare(price, other.price); public boolean equals(object other) { if (!(other instanceof Order)) { return (compareto((order) other) == 0); I så fall skapas kön med säljordrar så här: sellorders = new PriorityQueue<Order>(); b) /** * Låter kunden customer lägga en köporder av aktieslaget shareid till * budpriset price. Genomför köpet om matchande säljorder finns, i annat * fall lagras köpordern i motsvarande orderkö. * @param customer kunden * @param shareid aktieslag * @param price budpris * @throws NoSuchElementException om det inte finns någon orderkö för * aktieslaget shareid. public void buy(customer customer, String shareid, double price) { Order buyorder = new Order(price, customer); OrderQueues share = q.get(shareid); if (share == null) { throw new NoSuchElementException(); Order matchingsellorder = share.addbuyorder(buyorder); if (matchingsellorder!= null) { execute(buyorder, matchingsellorder); c) I metoden addbuyorder utförs peek (som kostar O(1)) och sedan poll eller offer (som kostar O(logn)). Den totala tidskomplexiteten blir alltså O(logn).