Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

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

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

Seminarium 13 Innehåll

Tentamen, Algoritmer och datastrukturer

13 Prioritetsköer, heapar

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

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

Föreläsning 14 Innehåll

Föreläsning 13 Innehåll

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

Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 4 Innehåll

Tentamen Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

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

Länkade strukturer. (del 2)

Föreläsning Datastrukturer (DAT036)

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

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

Exempeltenta GruDat 2002/2003

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen, EDAA20/EDA501 Programmering

Föreläsning 3. Stack

Föreläsning 3 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

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.

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Programmering fortsättningskurs

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Algoritmer och datastrukturer

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

Föreläsning 3. Stack

Länkade strukturer, parametriserade typer och undantag

Tentamen i Algoritmer & Datastrukturer i Java

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

Tentamen Programmering fortsättningskurs DIT950

BST implementering, huvudstruktur

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

Föreläsning 10 Datastrukturer (DAT037)

Interfacen Set och Map, hashtabeller

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

Tentamen Datastrukturer för D2 DAT 035

Tentamen Datastrukturer, DAT037 (DAT036)

DAI2 (TIDAL) + I2 (TKIEK)

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

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

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

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

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

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 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 11 Innehåll

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

Tentamen Datastrukturer D DAT 036/DIT960

Föreläsning Datastrukturer (DAT037)

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

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

Föreläsning 10 Innehåll

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

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

Föreläsning Datastrukturer (DAT036)

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

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen i Objektorienterad modellering och design Helsingborg

Algoritmer och datastrukturer 2012, fo rela sning 8

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 12 Innehåll

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg 2013 12 19, 8.00 13.00 Anvisningar: Denna tentamen består av 4 uppgifter. Preliminärt ger uppgifterna 1. 1 + 1 + 1 + 1 = 4 p 2. 2 + 1 +1 + 1 = 5 p 3. 8 + 1 = 9 p 4. 7 + 1 + 1 = 9 p 5. 7 + 2 = 9 p För full poäng ska dina lösningar inte vara onödigt ineffektiva. Bifogat tentamen finns Java snabbreferens samt dokumentation av någon/några klasser och interface i Java Collections Framework. När rättningen är klar meddelas detta på kursens hemsida (cs.lth.se/eda690). 1. Förklara följande begrepp: a) Stack b) Kollision i en hashtabell c) Balanserat binärt träd d) Partitionering i samband med Quicksort 2. Studera följande klass public class ListHandler { Tar bort alla dubbletter i listan list. public static <T> void deleteduplicates(list<t> list) { LinkedList<T> temp = new LinkedList<T>(); for (T element : list) { if (! temp.contains(element)) { temp.add(element); list = temp; a) Metoden deleteduplicates fungerar inte som avsett. Förklara varför och rätta till koden. Det är inte tillåtet att ändra metodens signatur. b) Vad får metoden för tidskomplexitet i värsta fall? Motivera ditt svar. c) Det finns effektivare sätt att ta bort dubbletter. Beskriv hur man kan göra istället. d) Vilken tidskomplexitet får din nya lösning? Motivera ditt svar.

2(5) 3. Antag att vi har en mängd element som tilldelas prioritet i form av ett heltal i ett intervall 1..k, där k är ett litet tal. 1 anger högsta prioritet och k lägsta. Vi kan då implementera en prioritetsköklass där alla operationer har en tidkomplexitet O(1) och där dessutom prioritetskön är stabil. Med stabil menas att bland element med lika prioritet tas det element som väntat längst ut först. Lös problemet genom att bilda k köer, en för varje prioritet. Nya element sätts in i den kö som deras prioritetstal anger. För att representera köerna ska cirkulära enkellänkade listor användas. I det sista elementet är inte referensen till efterföljaren (next) null utan i stället refererar den till det äldsta (första) elementet i listan. Se figur 1. referens till kön referens till kön Cirkulär lista att använda för att implementera en kö. next-referenser och referenser till insatta element är utritade. Noden längst till vänster innehåller det äldsta elementet i kön. Noden längst till höger innehåller det senast insatta elementet. Kö med ett enda element Figur 1: Kö som representeras av cirkulär enkellänkad lista. Eftersom elementen ska placeras in i rätt kö efter prioritet ställer vi kravet att de objekt som ska sättas in i kön är av en klass som implementerar ett interface Priority: public interface Priority { * Returns the element s priority * @return the element s priority int priority(); * Sets the element s priority to prio * @param prio the new priority void setpriority(int prio); a) Implementera klassen SimplePriorityQueue enligt ovanstående anvisningar. public class SimplePriorityQueue<E extends Priority> extends AbstractQueue<E> implements Queue<E> { private Node<E>[] queue; private int size; * Creates an empty priorityqueue. The allowed priorities are in the interval [1..k] * @param k the highest allowed priority public SimplePriorityQueue(int k) { queue = (Node<E>[]) new Node[k + 1]; // plats 0 används ej size = 0;

3(5) /* Nested class. Represents a node which contains an element of type E. private static class Node<E> { private E element; private Node<E> next; private Node(E x) { element = x; next = null; * Inserts the specified element into this priority queue. * @param e the element to add * @return true * @throws NullPointerException if the specified element is null * @throws IllegalArgumentException if the elements prio is outside * the allowed interval public boolean offer(e e) {... * Retrieves, but does not remove, the smallest element in this queue, or * returns null if this queue is empty. * @return the smallest element in this queue, or null if this queue is empty public E peek() {... * Retrieves and removes the smallest element in this queue, or returns null * if this queue is empty. * @return the smallest element in this queue, or null if this queue is empty public E poll() {... * Returns the number of elements in this queue. public int size() {... Anm. Egentligen måste man också implementera metoden iterator() i klassen SimplePriorityQueue men vi bortser från det i uppgiften. b) Felrapporteringssystem används inom många mjukvaruprojekt. När fel upptäcks av användare till ett program rapporteras felen in i systemet, som sedan hjälper programutvecklarna att hålla reda på och följa upp fel så att de blir åtgärdade. En felrapport (eng. ticket) beskrivs av klassen Ticket. Vi vill kunna ge en felrapport en prioritet i form av ett heltal samt kunna lagra felrapporter i en kö av typen SimplePriorityQueue. Gör de ändringar som behövs i klassen Ticket för att detta ska fungera. public class Ticket { private int id; private String title; // Felrapportens unika id-nr // Felrapportens titel public Ticket(int id, String title) { this.id = id; this.title = title;

4(5) public int getid() { return id; public String gettitle() { return title; 4. a) Följande klass beskriver ett binärt träd. public class BinaryTree<E extends Comparable<? super E>> { private Node<E> root;... operationer... private static class Node<E> { private E element; private Node<E> left; private Node<E> right;... operationer... Ett träd är heapordnat (eller partiellt ordnat) om det för varje nod gäller att dess element är mindre än eller lika med barnens element. Lägg till en metod i klassen BinaryTree<E> som returnerar true om trädet är heapordnat. Ledning och anvisningar: För full poäng får din lösning inte bygga på att du inför nya attribut i klasserna. Däremot är det tillåtet (och lämpligt) att lägga till en privat metod. Ett tomt träd ska betraktas som heapordnat. b) Att ett binärt träd är partiellt ordnat är ett krav för att trädet ska utgöra en heap. Det finns ytterligare ett villkor. Vilket? Bara namn på villkoret räcker inte för poäng. Beskriv också vad som menas med villkoret. c) En heap implementeras ofta på ett annat sätt än med ett binärt träd. Beskriv hur. I din beskrivning ska det ingå en figur med ett exempel. 5. a) I handelsresandeproblemet gäller det för en handelsresande att besöka ett antal städer. Varje stad ska besökas exakt en gång. Handelsresanden vill att den totala resvägen ska bli så kort som möjligt. Att lösa detta problem exakt är tidsödande, eftersom man måste beräkna alla möjliga resvägar för att finna den kortaste vägen. Vi nöjer oss därför i denna uppgift med att hitta en approximation till den bästa lösningen genom att i varje steg besöka den stad som ligger närmast den senast besökta staden. Kartan med alla städer beskrivs av en map av typen Map<String, List<TownDistance>>. Nyckeln är en teckensträng med stadens namn och värdet är en lista med TownDistanceobjekt. Klassen TownDistance beskriver avståndet till en annan stad (se nedan). Listorna med TownDistance-objekten är sorterade efter växande avstånd. Det finns uppgifter om avstånd för alla par av städer. public class TownDistance { private String destination; private int distance; // stadens namn // avstånd till staden (km) public TownDistance(String destination, int distance) { this.destination = destination; this.distance = distance; public String getdestination() {

5(5) return destination; public int getdistance() { return distance; Här är början på ett exempel som visar hur en karta med 6 städer skapas: Map<String, List<TownDistance>> map = new HashMap<String, List<TownDistance>>(); List<TownDistance> list = new LinkedList<TownDistance>(); list.add(new TownDistance("Lund", 21)); list.add(new TownDistance("Helsingborg",64 )); list.add(new TownDistance("Göteborg", 273 )); list.add(new TownDistance("Norrköping", 455)); list.add(new TownDistance("Stockholm", 613 )); map.put("malmö", list); list = new LinkedList<TownDistance>(); list.add(new TownDistance("Malmö", 21)); list.add(new TownDistance("Helsingborg", 55)); list.add(new TownDistance("Göteborg", 264)); list.add(new TownDistance("Norrköping", 445)); list.add(new TownDistance("Stockholm", 604 )); map.put("lund", list);... Din uppgift är att implementera metoden PrintTour i klassen RoadMap: public class RoadMap_list { private Map<String, List<TownDistance>> map; Skapar ett objekt som håller reda på en vägkarta. public RoadMap_list(Map<String, List<TownDistance>> map) { this.map = map; Skriver ut namnet på de städer som besöks, i tur och ordning, när man påbörjar en resa i staden med namnet starttown. Det förutsätts att det finns en stad med det namnet. Allra sist skrivs den totala resvägen (antal km) ut. public void printtour(string starttown) { // fyll i egen kod här Ledning och anvisningar: Använd följande algoritm: Använd en mängd, dvs. en klass som implementerar java.util.set för att hålla reda på de redan besökta städerna. Skriv ut startstadens namn, markera den som besökt (genom att lägga den i mängden för redan besökta städer). Leta upp närmaste stad som inte är besökt, skriv ut dess namn, markera den som besökt. Osv. b) Det finns algoritmer för att beräkna kortaste vägen mellan två städer. Då behöver man kunna lägga in objekt av typen TownDistance från förra uppgiften i en prioritetskö av typen java.util.priorityqueue. Man vill kunna hämta TownDistance-objektet med minsta avstånd. Gör de ändringar som krävs i klassen TownDistance för att den ska kunna läggas in i en sådan prioritetskö.