Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Relevanta dokument
Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA30 Programmering i Java fortsättningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

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

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

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

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

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

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

Föreläsning 14 Innehåll

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

Seminarium 13 Innehåll

Länkade strukturer. (del 2)

Tentamen, Algoritmer och datastrukturer

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

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

BST implementering, huvudstruktur

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

Föreläsning 4 Innehåll

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Interfacen Set och Map, hashtabeller

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

13 Prioritetsköer, heapar

Föreläsning Datastrukturer (DAT036)

Föreläsning 13 Innehåll

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Programmering fortsättningskurs

Länkade strukturer, parametriserade typer och undantag

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

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

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

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

Datastrukturer. föreläsning 3. Stacks 1

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

Stackar, köer, iteratorer och paket

Diskutera. Hashfunktion

Föreläsning 2 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer och datastrukturer

Tentamen Datastrukturer (DAT036)

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 11 Innehåll

Samlingar Collection classes

Föreläsning 3 Datastrukturer (DAT037)

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 3 Datastrukturer (DAT037)

Inlämningsuppgift och handledning

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 9 Datastrukturer (DAT037)

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

Föreläsning 3. Stack

Föreläsning 10 Innehåll

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

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

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 9 Innehåll

Objektsamlingar i Java

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

Föreläsning 3. Stack

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

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

DAT043 - föreläsning 8

Tentamen Datastrukturer, DAT037 (DAT036)

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

Föreläsning 4 Datastrukturer (DAT037)

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

Tentamen Datastrukturer D DAT 036/DIT960

Tentamen Programmering fortsättningskurs DIT950

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

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

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

TDDC30 Programmering i Java, datastrukturer och algoritmer

Föreläsning REPETITION & EXTENTA

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

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

Föreläsning 2 Datastrukturer (DAT037)

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen, EDAA01 Programmeringsteknik fördjupningskurs 2014 03 10, 8.00 13.00 Anvisningar: Denna tentamen består av 5 uppgifter. Preliminärt ger uppgifterna 1. 1 + 1 + 1 + 1.5 + 1.5 = 6 p 2. 5 p 3. 1 + 6 = 7 p 4. 3 + 1 = 4 p 5. 3.5 + 5.5 + 4 + 1 = 14 p Tillåtet hjälpmedel: Java snabbreferens. För full poäng ska dina lösningar inte vara onödigt ineffektiva. I slutet av tentamen finns 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/edaa01). 1. a) Beskriv ett effektivt sätt att implementera den abstrakta datatypen Stack. b) Antag att en lista list av typen LinkedList (dubbellänkad lista) ska traverseras. Motivera varför man bör använda en iterator istället för följande lösning: for (int i = 0; i < list.size(); i++) {... list.get(i)... c) Att söka i en sorterad, enkellänkad lista med binärsökning är ingen bra idé. Förklara varför. d) Beskriv kortfattat vad som menas med rehashing i samband med hashtabeller. Varför använder man rehashing? e) Att sortera en vektor med 100 000 st godtyckliga heltal med insättningssortering tog ca 4 sekunder på en viss dator. Ungefär vilken exekveringstid kan man förvänta sig om man med samma algoritm sorterar 500 000 tal på samma dator. Om vektorn istället består av 100 000 st nästan sorterade tal tog det bara ca 10 ms att sortera talen med insättningssortering på den aktuella datorn. Ungefär vilken exekveringstid kan man förvänta sig om vektorn innehåller 500 000 nästan sorterade tal? Motivera dina svar.

2(5) 2. För att representera ett binärt sökträd (ej balanserat) kan följande klasser användas: public class BinarySearchTree<E extends Comparable<E>> { private Node<E> root; Skapar ett tomt binärt träd. public BinarySearchTree() { root = null;... metoder... private static class Node<E> { private E element; private Node<E> left; private Node<E> right; private Node(E element) { this.element = element; left = null; right = null; Lägg till en metod pollfirst i klassen BinarySearchTree som tar bort och returnerar det minsta elementet i trädet. Om trädet är tomt ska null returneras. Uppgiften ska lösas utan rekursion tänk länkad lista. 3. I den här uppgiften ska vi fortsätta använda BinarySearchTree från uppgift 2. a) I klassrubriken till BinarySearchTree ser det ut så här: <E extends Comparable<E>>. Vad innebär det? Vad får det för konsekvenser om vi stryker extends Comparable<E> och bara skriver <E>? b) Lägg till och implementera följande metod i klassen BinarySearchTree: Returnerar ett nytt träd innehållande de element som är större än eller lika med e. Om inga sådana element finns returneras ett tomt träd. BinarySearchTree<E> tailtree(e e); Ledning och anvisningar: Rekursiv teknik ska användas. I klassen BinarySearchTree finns en metod för att sätta in ett element i trädet: Sätter in elementet e i trädet om ingen dubblett finns. public boolean add(e e); Denna metod får du använda. För full poäng ska inga nya attribut läggas in i klassen. För full poäng ska inte onödigt många noder i det ursprungliga trädet undersökas. Det gamla trädet ska inte förstöras.

3(5) 4. Det finns idag olika sätt att meddela sina vänner var man befinner sig. Ett sätt är att använda ett mobiltelefonprogram som låter oss checka in på platser vi kommer till. Kärnan i sådana system är ofta en dator (en server) som de olika användarnas appar kommunicerar med. I den här uppgiften ska vi koncentrera oss på den del av programmet i servern som hanterar användarna och på vilka platser de är incheckade. En användare beskrivs av följande klass: User Skapar en ny användare med användaridentiteten userid. User (String userid); Lägger till en ny vän (inget händer om de redan var vänner). void addfriend(user user); Avgör om användaren är vän med användaren user. boolean isfriendswith(user user); En mötesplats representeras i den här uppgiften av sitt namn (typen String). Antag att du ska skriva en klass CheckinHandler som hanterar platserna och information om vilka personer som är incheckade på de olika platserna. Klassen ska ha metoder för att: lägga till en ny plats. checka in en person på en given plats. Om personen redan är incheckad på platsen ska ingenting hända. checka ut en person från en given plats. leverera en lista med alla vänner till en given person som är incheckade på en given plats. a) Välj datastruktur/er för att lagra platsernas namn och de incheckade användarna. Motivera dina val. Ge också förslag på klass/klasser i Java Collections Framework som kan användas vid implementeringen av klassen CheckinHandler. b) Vilken tidskomplexitet får metoden för checka in en person på en given plats enligt din lösning i deluppgift a. Motivera ditt svar. 5. Även om deluppgifterna i denna uppgift hänger ihop går de bra att lösa oavsett om man löst de övriga deluppgifterna eller ej. a) Antag att man vill ha en prioritetskö som bara kan innehålla ett begränsat antal element. Detta kan man åstadkomma genom att man implementerar en subklass till PriorityQueue: public class LimitedSizePriorityQueue<E> extends PriorityQueue<E> {... Implementera en sådan subklass. Ledning och anvisningar: Klassens konstruktor ska ha en parameter int maxnbrelements. För att inte för många element ska läggas in i kön måste två av metoderna i PriorityQueue skuggas (eng: override). Tips: Om man i en metod m i en subklass vill anropa en metod med samma namn i superklassen skriver man super.m(...). Subklassen ska dessutom ha en metod boolean full() som tar reda på om kön är full eller ej.

4(5) b) Det är vanligt att flygbolag har standbyköer till sina olika flighter. Orsaken till att man flyger standby kan vara att man missat ett anslutningsflyg, eller att man vill komma med ett tidigare flyg än det man reserverat. Passagerare har olika prioritet i standbykön berorende på orsak till att de är i kön, hur mycket de betalat för sin biljett etc. Om alla personer i standbykön inte kommer med flighten flyttas de som ej fick plats över till standbykön för nästa flight till samma destination. Din uppgift är att implementera färdigt klassen StandbyQueue: public class StandbyQueue { private LimitedSizePriorityQueue<Passenger> queue; * Creates a standby queue with a limited number of passengers * @param max the maximum number of passengers in this queue. public StandbyQueue(int max) { queue = new LimitedSizePriorityQueue<Passenger>(max); * Inserts the specified passenger into this standby queue if there is * enough space in this queue. * @param p the passenger to be added * @return true if the passenger is added to the queue public boolean insert(passenger p) { // skriv egen kod här * Moves as many passengers as there is space for from the specified queue * to this queue. * @param q the queue that passengers should be moved from * @return true if all the passengers in q has been moved to this queue public boolean movefrom(standbyqueue q) { // skriv egen kod här * Retrieves and removes the first passenger in this queue * @return the first passenger in this queue * @throws NoSuchElementException if this queue is empty public Passenger nextpassenger() { // skriv egen kod här * Returns the number of elements in this queue. * @return the number of elements in this queue public int size() { return queue.size();

5(5) c) Klassen Passenger ser ut som nedan men behöver modifieras: public class Passenger { private String name; private String passnbr; private int priority; private Date timestamp; public Passenger(String name, String passnbr, int priority) { this.name = name; this.passnbr = passnbr; this.priority = priority; timestamp = new Date(); public int getpriority() { return priority; public void setpriority(int priority) { this.priority = priority; Eftersom Passenger-objekt ska sättas in i en prioritetskö måste klassen implementera interfacet Comparable. Passagerare med hög prioritet (= lågt nummer på priority) ska få företräde till de platser som finns på flighten. Om flera passagerare har samma prioritet ska tiden då man ställt sig i kö (timestamp) avgöra. Dessutom vill man lägga till en metod i klassen StandbyQueue som tar bort en passagerare med ett visst namn och passnummer från kön. Då behöver man använda prioritetsköns metod remove(object o). Detta medför att klassen Passenger måste modifieras ytterligare. Gör de modifieringar i klassen Passenger som krävs för att ovanstående två punkter ska vara uppfyllda. Ledning och anvisningar: Klassen Date är en klass i paketet java.util som beskriver ett datum och tidpunkt. Klassen Date implementerar interfacet Comparable. d) I en prioritetskö kan det finnas flera element med samma prioritet. Ibland vill man, vid lika prioritet mellan flera element, vara säker på att elementen kommer att hämtas ut ur kön i den ordning de sattes in. Implementeringar av en prioritetskö som uppfyller detta villkor brukar kallas stabila. Klassen PriorityQueue implementeras med hjälp av en heap och är därför inte stabil. (Det är därför man förutom attributet priority även har ett attribut timestamp i klassen Passenger). Visa att en heap inte är en stabil genom att, med ett enkelt exempel, visa att lika element inte tas ut i den ordning de satts in i heapen.

java.util Class PriorityQueue<E> Type Parameters: E - the type of elements held in this collection An unbounded priority queue based on a priority heap. The elements of the priority queue are ordered according to their natural ordering, or by a Comparator provided at queue construction time, depending on which constructor is used. A priority queue does not permit null elements. A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so may result in ClassCastException). The head of this queue is the least element with respect to the specified ordering. If multiple elements are tied for least value, the head is one of those elements -- ties are broken arbitrarily. The queue retrieval operations poll, remove, peek, and element access the element at the head of the queue. Constructor Summary Constructor and Description PriorityQueue() Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering. PriorityQueue(Collection<? extends E> c) Creates a PriorityQueue containing the elements in the specified collection. PriorityQueue(int initialcapacity) Creates a PriorityQueue with the specified initial capacity that orders its elements according to their natural ordering. PriorityQueue(int initialcapacity, Comparator<? super E> comparator) Creates a PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator. PriorityQueue(PriorityQueue<? extends E> c) Creates a PriorityQueue containing the elements in the specified priority queue. PriorityQueue(SortedSet<? extends E> c) Creates a PriorityQueue containing the elements in the specified sorted set. Method Summary Inserts the specified element into this priority queue. Returns true if the element was added to this queue, Removes all of the elements from this priority queue. Comparator<? super E> comparator() Returns the comparator used to order the elements in this queue, or null if this queue is sorted according to Returns true if this queue contains the specified element. More formally, returns true if and only if this queue contains at least one element e such that boolean add(e e) void else false clear() boolean the natural ordering of its elements. contains(object o) Iterator<E> o.equals(e). iterator() Returns an iterator over the elements in this queue. boolean offer(e e) Inserts the specified element into this priority queue. Returns true if the element was added to this queue, else false E E peek() Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty. poll() Retrieves and removes the head of this queue, or returns null if this queue is empty. boolean remove(object o) Removes a single instance of the specified element from this queue, if it is present. More formally, removes an element e such that o.equals(e), if this queue contains one or more such elements. Returns true if and only if this queue contained the specified element (or equivalently, if this queue changed as a result of the call). int Object[] size() Returns the number of elements in this collection. toarray() Returns an array containing all of the elements in this queue. The elements are in no particular order. <T> T[] toarray(t[] a) Returns an array containing all of the elements in this queue; the runtime type of the returned array is that of the specified array. The returned array elements are in no particular order. If the queue fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this queue.!

java.lang Interface Iterable<T> Type Parameters: T - the type of elements returned by the iterator Iterator<T> iterator() Returns an iterator over a set of elements of type T. java.util Interface Iterator<E> Type Parameters: E - the type of elements returned by this iterator Methods boolean hasnext() Returns true if the iteration has more elements. E next() Returns the next element in the iteration. void remove() Removes from the underlying collection the last element returned by this iterator (optional operation). java.lang Interface Comparable<T> Type Parameters: T - the type of objects that this object may be compared to int compareto(t o) Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. java.lang Interface Comparator<T> Type Parameters: T - the type of objects that may be compared by this comparator int compare(t o1, T o2) Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.