Oppgavesettet består av 6 (seks) sider. Norges Informasjonsteknologiske Høgskole PG4200 Algoritmer og datastrukturer Side 1 av 6 Tillatte hjelpemidler: Ingen Varighet: 3 timer Dato: 6. august 2014 Fagansvarlig: Lars Sydnes lars.sydnes@westerdals.no 93 03 56 85 Oppgavesettet består av 7 oppgaver. Husk å lese oppgavene nøye. Alle svar skal begrunnes, med mindre annet er oppgitt. Alle punktene vektes likt. Oppgave 1 a) Bruk O-notasjon til å angi ordenen til de følgende vekstfunksjonene: (i) f(n) = 1 (n + 1)n + n log n 2 (ii) g(n) = 27.1 + 8n 2 + 81n 2 log n Du behøver ikke å begrunne svaret. b) Angi hvordan kjøretiden til funksjonene f og g i kodesnutten nedenfor avhenger av n. Svaret skal begrunnes og uttrykkes med O-notasjon. Det oppgis at dosomething har konstant kjøretid. 1 void f(int n){ 2 for(int i = 1; i < n; i*=2) 3 dosomething(i); 4 } 5 6 void g(int n){ 7 if (n <= 0){ 8 return; 9 } else { 10 dosomething(n); 11 g(n-1); 12 } 13 } 14 15 void dosomething(int n){ 16 // Something O(1) 17 }
Side 2 av 6 Oppgave 2 a) Her skal vi sammenligne sekvensielt søk med binært søk. Hva er fordelen med binært søk? Hva er fordelen med sekvensielt søk? b) Forklar hva som foregår under panseret i følgende kodesnutt: for (String str : list) System.out.println(str) c) Ta for deg et binært søketre uten balanseringsmekanisme som kun aksepterer ett eksemplarer av hvert objekt. Lag en skisse av treet etter innsetting av sekvensen 2, 1, 7, 8, 2, 8, 1, 8, 2, 8, 4, 5, 9. d) Skriv en metode contains som utfører et rekursivt søk i et binært søketre der nodene tilhører klassen Node: class Node<T extends Comparable<T>> { T data; Node<T> left; Node<T> right; } Oppgave 3 a) Beholderen java.util.hashset bruker java-objektenes innebygde metoder equals og hashcode. Hvilken betingelse må equals og hashcode tilfredsstille for at beholderen skal fungere slik den skal? Forklar hva som kan gå galt om denne betingelsen brytes. b) Forklar hvordan egenskapene til objektenes hashcode-metode kan påvirke ytelsen til java.util.hashset.
Side 3 av 6 Oppgave 4 Tabell 1 nedenfor illustrerer en sorteringsalgoritme. Angi hvilken av sorteringsmetodene (i)-(v) som er brukt. (i) Quick sort (ii) Insertion sort (iii) Bubble sort (iv) Selection sort (v) Merge sort 2 7 1 8 1 8 2 8 2 1 7 8 1 8 2 8 2 1 7 1 8 8 2 8 2 1 7 1 8 2 8 8 1 2 7 1 8 2 8 8 1 2 1 7 8 2 8 8 1 2 1 7 2 8 8 8 1 1 2 7 2 8 8 8 1 1 2 2 7 8 8 8 Tabell 1: Illustrasjon av en sorteringsmetode.
Side 4 av 6 Oppgave 5 Figur 1 er en grafisk fremstilling av målinger av kjøretid for søk etter Double-objekter i ulike beholdere fra Java Collections Framework: (i) java.util.hashset sammen med standard hashcode. (ii) java.util.hashset sammen med en hashcode som på grunn av en feil kun gir verdiene 0, 1, 2, 3. (iii) java.util.treeset. (iv) java.util.linkedlist. Målingene fra de ulike beholderne er merket A, B, C og D (i tilfeldig rekkefølge). Drøft hvilke målinger (A, B, C, D) som kan høre sammen med hvilke beholdere (i, ii, iii, iv). Obs: Her finnes det ikke noe fasitsvar. kjøretid (nanosekunder) 100000 10000 1000 A B C D 100 100 1000 Antall elementer Figur 1: Køretid for kall av contains-metoden for fire ulike implementasjoner av java.util.collection.
5 Side 5 av 6 Oppgave 6 a) Drøft hvilken betydning datastrukturen heap har for kjøretiden til Dijkstras algoritme. b) Gå gjennom Dijkstras algoritme steg for steg på jakt etter den korteste veien fra A til B i den følgende vektede grafen: 2 A 6 9 B 9 1 4 F G 3 C 2 9 E 5 D /** * Person interface for representation of * individuals in a family tree. * * For all implementations of this interface, * A.getName().compareTo(B.getName()) < 0 * shall imply that A.compareTo(B) < 0. * * The methods getfather() and getmother() * returns null if the current parent is * unknown. */ public interface Person extends Comparable<Person> { String getname(); Person getfather(); Person getmother(); Iterable<Person> getchildren(); } Kodesnutt 1: Grensesnittet Person
Side 6 av 6 Oppgave 7 I et datasystem som brukes i forbindelse med slektsgranskning er personene representert ved objekter av typen Person, definert i kodesnutt 1 på side 5. a) Skriv en metode void oldebarn(person a) som skriver ut navnene til oldebarna til personen a i alfabetisk rekkefølge. Løsningen skal skrives i java eller annen java-lignende kode. b) Beskriv en algoritme som avgjør om to personer har felles forfedre eller -mødre. Vi kan tenke oss at dette implementeres som en javafunksjon boolean fellesopphav(person a, Person b) som returnerer true hvis personene har felles opphav og false hvis de ikke har det Løsningen skal formuleres som java-kode eller lignende. c) La n være antall generasjoner som er representert i slektsgranskningssystemet. Bruk O-notasjon til å beskrive hvordan worst case-kjøretid for funksjonen fellesopphav avhenger av n. Slutt på oppgavesettet