Tentamen, EDAA01 Programmeringsteknik fördjupningskurs



Relevanta dokument
Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

Interfacen Set och Map, hashtabeller

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Samlingar Collection classes

Föreläsning 4 Innehåll

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

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

Föreläsning 11 Innehåll

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

Tentamen Datastrukturer D DAT 036/DIT960

Diskutera. Hashfunktion

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

Länkade strukturer. (del 2)

Föreläsning 14 Innehåll

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

Föreläsning 10 Innehåll

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

Inlämningsuppgift och handledning

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

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

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

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

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

Föreläsning 9 Innehåll

Programmering fortsättningskurs

Tentamen FYTA11 Javaprogrammering

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

Samlingar Collection classes

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

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

Dugga Datastrukturer (DAT036)

Algoritmer och datastrukturer

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

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

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

Föreläsning 3 Datastrukturer (DAT037)

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

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

Föreläsning 3. Stack

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Tentamen, EDAA20/EDA501 Programmering

Stackar, köer, iteratorer och paket

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

Föreläsning 3 Datastrukturer (DAT037)

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Tentamen, Algoritmer och datastrukturer

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

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

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

Sätt att skriva ut binärträd

Tentamen i Objektorienterad programmering

Föreläsning 2 Innehåll

Collection classes. Interface, första exempel. Interface (forts) Men först

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

Collection Classes. bjectorienterad programmering Sida 1

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Föreläsning 12. Länkade listor

Datastrukturer. föreläsning 3. Stacks 1

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

Outline. Objektorienterad Programmering (TDDC77) Lösningen heter Collection. Collection gränsnittet. Collection. Iterable. Ahmed Rezine.

Objektsamlingar i Java

LULEÅ TEKNISKA UNIVERSITET

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

Föreläsning Datastrukturer (DAT036)

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

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

OOP Objekt-orienterad programmering

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

13 Prioritetsköer, heapar

Länkade strukturer, parametriserade typer och undantag

Tentamen i Algoritmer & Datastrukturer i Java

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

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

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Föreläsning 2 Datastrukturer (DAT037)

BST implementering, huvudstruktur

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

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

Objektorienterad programmering i Java

Objektorienterad Programmering (TDDC77)

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

Föreläsning 3. Stack

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Föreläsning 12 Innehåll

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(4) Institutionen för datavetenskap Tentamen, EDAA01 Programmeringsteknik fördjupningskurs 2012 12 20, 8.00 13.00 Anvisningar: Denna tentamen består av 4 uppgifter. Preliminärt ger uppgifterna 9 + 9 + 9 + 9 = 36 poäng. 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) I kursen har vi gått igenom ett antal olika sorteringsalgoritmer, t.ex. urvalssortering, merge sort och quicksort: Följande vektor ska sorteras: 50-25 13 147 26-2 28 80 42 10 I nedanstående exempel har dessa tre algoritmer använts. I exemplen visas hur vektorn ser ut efter ett visst läge i respektive sorteringsalgoritm. 1. 10-25 13-2 26 147 28 80 42 50 2. -25 13 26 50 147-2 10 28 42 80 3. -25-2 10 147 26 50 28 80 42 13 Para ihop varje alternativ med rätt sorteringsalgoritm. Motivera dina svar (kort och koncist ett par meningar räcker). b) En heap ritas ofta i form av ett träd, men implementeras istället med hjälp av en vektor. Visa med ett exempel hur. Motivera varför? c) Antag att objekt av en class C ska sättas in i en mängd av typen HashSet (som implementeras med hjälp av en öppen hashtabell). Då måsta C skugga två metoder från klassen Object. Vilka är dessa metoder? Förklara varför de måste skuggas genom att beskriva hur de används vid sökning efter ett element i hashtabellen. d) Betrakta följande klasser: public class A { public void method() { System.out.println("a"); public class B extends A { public void method() { System.out.println("b");

2(4) Vad händer när följande rader exekveras? Motivera ditt svar. A ref = new B(); ref.method(); 2. a) I kursen har vi diskuterat olika slags abstrakta datatyper. Ge exempel på två abstrakta datatyper som effektivt kan implementeras med en enkellänkad lista. Ge en kort beskrivning av hur listan används för att implementera dessa abstrakta datatypen och deras viktigaste operationer. b) I Java finns bland annat heltalstyperna int och long. Ibland behöver man arbeta med tal som innehåller flera siffror än vad som kan lagras i en variabel av av typen long. Det finns klasser i Java som kan användas i dessa fall (t.ex. klassen BigInteger). I den här uppgiften ska du skriva en egen enklare variant av en sådan klass. Du ska använda en enkellänkad lista för att lagra de olika siffrorna i talet. Siffrorna representeras av typen int. Klassen hanterar bara naturliga tal (tal >= 0). För att förenkla vissa operationer lagras siffrorna baklänges. T.ex. lagras talet 237 så här: first 7 3 2 Klassen BigInt ser ut så här: public class BigInt { private DigitNode first; /** * Translates the decimal String representation of a big integer into a BigInt. * @param val decimal String representation * @throws NumberFormatException val is not a valid representation of a big integer. */ public BigInt(String val) {... /** * Adds rhs to this BigInt. * @param rhs value to be added to this BigInt. */ public void add(bigint rhs) {... // Här finns övriga metoder som inte är intressanta i denna uppgift /* Nested class. Represents a node which contains a digit. */ private static class DigitNode { private int digit; private DigitNode next; /* Creates a listnode with the digit d. */ private DigitNode(int d) { digit = d; next = null; Implementera metoden add. Additionen utförs på samma sätt som man gör med papper och penna, d.v.s. från minst signifikant siffra och med användandet av en minnessiffra. Här är några exempel där nbr1 och nbr2 är BigInt-objekt:

3(4) 42 + 5: nbr1 2 4 Efter nbr1.add(nbr2): nbr1 7 4 nbr2 5 nbr2 5 42 + 379: nbr1 2 4 Efter nbr1.add(nbr2): nbr2 9 7 3 nbr1 1 2 4 nbr2 9 7 3 99 + 3: nbr1 9 9 Efter nbr1.add(nbr2): nbr1 2 0 1 nbr2 3 nbr2 3 3. a) Betrakta följande class: public class MysteryClass { public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); public static void main(string[] args) { MysteryClass.mystery(3); Vad skrivs ut när man kör programmet? b) För att representera ett binärt träd kan följande klasser användas: public class BinaryTree<E> { private Node<E> root; /** Constructs an empty tree. */ public BinaryTree() { root = null;... metoder... private static class Node<E> { private E data; private Node<E> left; private Node<E> right; private Node(E element) { data = element; Lägg följande metod i klassen BinaryTree:

4(4) /** Returns a list with all elements at level level * @param level the level which element will be in the resulting list * @throws IllegalArgumentException level is lesser than 1. */ public List<E> atlevel(int level); som returnerar en lista med de element som finns på nivå level. Till exempel ska ett anrop av level(3) på följande träd e a g h f d b c returnera följande lista: h f d Ledning och anvisningar: Rekursiv teknik ska användas. Det är lämpligt att implementera en privat metod som hjälp. För full poäng ska inga nya attribut läggas till i klassen. c) I vilken ordnings kommer noderna ut trädet i deluppgift b att behandlas om trädet traverseras i inorder? Antag att trädet istället varit ett binärt sökträd och vi satt in noderna i ordningen d, f, g, a, c, e, h, b. I vilken ordning kommer då noderna att behandlas vid en inordertraversering? 4. a) En korsreferenslista för en bok är en lista över alla förekommande ord i alfabetisk ordning och för varje ord en uppräkning av de sidor där ordet förekommer. Exempel: class 3, 5, 7, 9 int 6 interface 5, 19 java 1, 2, 5, 8, 19 object 2, 6, 7, 9 Sidnumren för varje ord ska vara ordnade i stigande följd. Även om samma ord finns flera gånger på samma sida ska sidnumret bara förekomma en gång. Man kan implementera korsreferenslistan genom att använda den abstrakta datatypen lexikon (Map) med ordet som nyckel och en mängd (Set) med sidnummer som värde. Gör en sådan implementering av klassen CrossReferenceList: /** Skapar en tom korsreferenslista. */ CrossReferenceList(); /** Uppdaterar i korsreferenslistan att ordet word förekommer på sidan sidenbr. */ void add(string word, int sidenbr); /** Returnerar en sträng som innehåller order word följt av de sidnummer ordet förekommer på. Strängen följer mönstret i följande exempel: java 1, 2, 5, 8, 19 */ String getasstring(string word); b) Beräkna tidskomplexiteten i värsta fall för att gå igenom hela texten och bygga upp korsreferenslistan. Du får anta att antal sidor i boken är litet i förhållande till antal ord.

java.util!interface Map<K,V> Type Parameters: K - the type of keys maintained by this map V - the type of mapped values All Known Implementing Classes: AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value. Method Summary void clear() Removes all of the mappings from this map (optional operation). boolean containskey(object key) Returns true if this map contains a mapping for the specified key. boolean containsvalue(object value) Returns true if this map maps one or more keys to the specified value. Set<Map.Entry<K,V>> entryset() Returns a Set view of the mappings contained in this map. boolean equals(object o) Compares the specified object with this map for equality. V get(object key) Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key. int hashcode() Returns the hash code value for this map. boolean isempty() Returns true if this map contains no key-value mappings. Set<K> keyset() Returns a Set view of the keys contained in this map. V put(k key, V value) Associates the specified value with the specified key in this map (optional operation). If the map previously contained a mapping for the key, the old value is replaced by the specified value. void putall(map<? extends K,? extends V> m) Copies all of the mappings from the specified map to this map (optional operation). V remove(object key) Removes the mapping for a key from this map if it is present (optional operation). Returns the value to which this map previously associated the key, or null if the map contained no mapping for the key. int size() Returns the number of key-value mappings in this map. java.util Class HashMap<K,V> Hash table based implementation of the Map interface. Constructor Summary HashMap() Constructs an empty HashMap with the default initial capacity (16) and the default load factor (0.75). HashMap(int initialcapacity) Constructs an empty HashMap with the specified initial capacity and the default load factor (0.75). HashMap(int initialcapacity, float loadfactor) Constructs an empty HashMap with the specified initial capacity and load factor. HashMap(Map<? extends K,? extends V> m) Constructs a new HashMap with the same mappings as the specified Map. java.util Class TreeMap<K,V> A Red-Black tree. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used. Constructor Summary TreeMap() Constructs a new, empty tree map, using the natural ordering of its keys. TreeMap(Comparator<? super K> comparator) Constructs a new, empty tree map, ordered according to the given comparator. TreeMap(Map<? extends K,? extends V> m) Constructs a new tree map containing the same mappings as the given map, ordered according to the natural ordering of its keys. TreeMap(SortedMap<K,? extends V> m) Constructs a new tree map containing the same mappings and using the same ordering as the specified sorted map. java.util!interface Map.Entry<K,V> A map entry (key-value pair). Method Summary boolean equals(object o) Compares the specified object with this entry for equality. K getkey() Returns the key corresponding to this entry. V getvalue() Returns the value corresponding to this entry. int hashcode() Returns the hash code value for this map entry.

java.util!interface Set<E> Type Parameters: E - the type of elements maintained by this set All Superinterfaces: Collection<E>, Iterable<E> All Known Subinterfaces: NavigableSet<E>, SortedSet<E> All Known Implementing Classes: AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet A collection that contains no duplicate elements. Method Summary boolean add(e e) Adds the specified element to this set if it is not already present (optional operation). boolean addall(collection<? extends E> c) Adds all of the elements in the specified collection to this set if they're not already present (optional operation). void clear() Removes all of the elements from this set (optional operation). boolean contains(object o) Returns true if this set contains the specified element. boolean containsall(collection<?> c) Returns true if this set contains all of the elements of the specified collection. boolean equals(object o) Compares the specified object with this set for equality. int hashcode() Returns the hash code value for this set. boolean isempty() Returns true if this set contains no elements. Iterator<E> iterator() Returns an iterator over the elements in this set. boolean remove(object o) Removes the specified element from this set if it is present (optional operation). boolean removeall(collection<?> c) Removes from this set all of its elements that are contained in the specified collection (optional operation). boolean retainall(collection<?> c) Retains only the elements in this set that are contained in the specified collection (optional operation). int size() Returns the number of elements in this set (its cardinality). Object[] toarray() Returns an array containing all of the elements in this set. <T> T[] toarray(t[] a) Returns an array containing all of the elements in this set; the runtime type of the returned array is that of the specified array. java.util Class HashSet<E> Hash table based implementation of the Set interface. Constructor Summary HashSet() Constructs a new, empty set that has default initial capacity (16) and load factor (0.75). HashSet(Collection<? extends E> c) Constructs a new set containing the elements in the specified collection. HashSet(int initialcapacity) Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75). HashSet(int initialcapacity, float loadfactor) Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and the specified load factor. java.util Class TreeSet<E> A Red-Black tree. The set is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used. Constructor Summary TreeSet() Constructs a new, empty tree set, sorted according to the natural ordering of its elements. TreeSet(Collection<? extends E> c) Constructs a new tree set containing the elements in the specified collection, sorted according to the natural ordering of its elements. TreeSet(Comparator<? super E> comparator) Constructs a new, empty tree set, sorted according to the specified comparator. TreeSet(SortedSet<E> s) Constructs a new tree set containing the same elements and using the same ordering as the specified sorted set. java.util!interface Iterator<E> Method Summary boolean hasnext() Returns true if the iteration has more elements. (In other words, returns true if next would return an element rather than throwing an exception.) E next() Returns the next element in the iteration. Throws NoSuchElementException if the iteration has no more elements. void remove() Removes from the underlying collection the last element returned by the iterator (optional operation). Throws UnsupportedOperationException if the remove operation is not supported by this Iterator.

LUNDS TEKNISKA HÖGSKOLA 1(3) Institutionen för datavetenskap Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs 2012 12 20 1. a) 1. Quicksort. Vektorn är partitionerad och som pivot har 26 används (medianen av första, mittersta och sista värdet. Vektorns vänstra halva innehåller element mindre än eller lika med 26 och högra halva element större än 26. 2. Mergsort. Varje halva har sorterats var för sig och ska sedan samsorteras. 3. Urvalssortering. För varje position pos i vektorn söker man det minsta elementet bland de hittills ej sorterade och byter minsta mot elementet på plats pos. I vektorn i figuren tre sådana byten gjorts. b) Man lagrar elementen nivå för nivå i vektorn. Exempel: 2 3 6 2 3 6 5 7 0 1 2 3 4 5 7 Man kan räkna ut platsen för en nods förälder och barn vilket gör det enkelt att göra insättningar och borttagningar. Man sparar utrymmer för referenserna till barnen. Eftersom heapen är ett komplett träd blir det dessutom inga luckor i vektorn. c) Metoderna equals och hashcode måste skuggas. Antag att man söker ett element c. c.hashcode() % vektorns storlek ger positionen i vektorn för c. Sedan söker man i listan på denna plats efter ett element som matchar c. För att jämföra element vid denna sökning används equals. d) b kommer att skrivas ut. Variabeln ref refererar under exekveringen till ett B-objekt. Därför är det metoden method i klassen B som kommer att exekveras. 2. a) En enkellänkad lista kan användas för att implementera köer och stackar. För att implementera en kö effektivt behövs en referens till första och sista elementet. Nya element sätts in sist i listan och de element som står i tur vid borttagningar finns först i listan. För att implementera en stack räcker det med en referens till första elementet i listan. Både insättningar (push och borttagningar (pop) görs först i listan. b) /** * Adds rhs to this BigInt. * @param rhs value to be added to this BigInt. */ public void add(bigint rhs) { DigitNode n1 = first; DigitNode n2 = rhs.first; DigitNode pre = null; int memorydigit = 0; while (n1!= null && n2!= null) { int sum = n1.digit + n2.digit + memorydigit; n1.digit = sum % 10; memorydigit = sum / 10; pre = n1; n1 = n1.next; n2 = n2.next;

2(3) while (n1!= null && memorydigit!= 0) { int sum = n1.digit + memorydigit; n1.digit = sum % 10; memorydigit = sum / 10; pre = n1; n1 = n1.next; while (n2!= null) { int sum = n2.digit + memorydigit; pre.next = new DigitNode(sum % 10); memorydigit = sum / 10; pre = pre.next; n2 = n2.next; if (memorydigit > 0) { pre.next = new DigitNode(memoryDigit); 3. a) 48412484 b) /** * Returns a list with all elements at level level * @param level the level which element will be in the resulting list * @throws IllegalArgumentException level is lesser than 1. */ public List<E> atlevel(int level) { if (level < 1) { throw new IllegalArgumentException(); List<E> res = new LinkedList<E> (); atlevel(root, 1, level, res); return res; private void atlevel(node<e> n, int actlevel, int level, List<E> list) { if (n!= null) { if (actlevel == level) { list.add(n.data); else { atlevel(n.left, actlevel + 1, level, list); atlevel(n.right, actlevel + 1, level, list); c) I en inordertraversering av trädet i deluppgift b behandlas noderna i följande ordning: a h e b f c g d En inordertraversering av elementen i ett binärt sökträd ger alltid elementen i växande ordning: a b c d e f g h

3(3) 4. a) public class CrossReferenceList { private Map<String, Set<Integer>> map; /** Skapa en tom korsreferenslista. */ public CrossReferenceList() { map = new TreeMap<String, Set<Integer>>(); /** Uppdaterar i korsreferenslistan att ordet word förekommer på sidan sidenbr. */ public void add(string word, int sidenbr) { Set<Integer> nbrs = map.get(word); if (nbrs == null) { nbrs = new TreeSet<Integer>(); nbrs.add(sidenbr); map.put(word, nbrs); else { nbrs.add(sidenbr); /** Returnerar en sträng som innehåller order word följt av de sidnummer ordet förekommer på. Strängen följer mönstret i följande exempel: java 1, 2, 5, 8, 19 */ public String getasstring(string word) { Set<Integer> nbrs = map.get(word); if (nbrs == null) { return word; StringBuilder b = new StringBuilder(); b.append(word); b.append( ); Iterator<Integer> itr = nbrs.iterator(); while (itr.hasnext()) { int i = itr.next(); b.append(i); if (itr.hasnext()) { b.append(", "); return b.tostring(); b) I lösningen används TreeMap och TreeSet som båda är implementerade med balanserade binära sökträd. Antag att antal ord i boken är n varav m är olika och att antal sidor är s. Antal element i mappen är då max m. I add anropas get och ev. put vilka kostar logm. Dessutom anropas add på mängden vilket kostar logs. Vi kan dock bortse från denna kostnad eftersom antal sidor antas vara mycket mindre än antal ord. Total kostnad blir då O(nlogm). I värsta fall är alla ord olika och vi får O(nlogn).