MED TIDESTIMATER Løsningsforslag



Like dokumenter
Norges Informasjonsteknologiske Høgskole

Norges Informasjonsteknologiske Høgskole

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Algoritmer og Datastrukturer

PG 4200 Algoritmer og datastrukturer Innlevering 2

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Norges Informasjonsteknologiske Høgskole

PG4200 Algoritmer og datastrukturer Lab 1. 8.januar I dag skal vi undersøke en rekke velkjente databeholdere i Java:

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Løsningsforslag EKSAMEN

Oppgave 1. Sekvenser (20%)

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

PG4200 Algoritmer og datastrukturer Forelesning 10

EKSAMEN med løsningsforslag

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

UNIVERSITETET I OSLO

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Algoritmer - definisjon

EKSAMEN. Emne: Algoritmer og datastrukturer

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Datastrukturer for rask søking

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

PG4200 Algoritmer og datastrukturer Forelesning 7

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

KANDIDATEN MÅ SELV KONTROLLERE AT OPPGAVESETTET ER FULLSTENDIG

TOD063 Datastrukturer og algoritmer

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

EKSAMEN. Emne: Algoritmer og datastrukturer

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

PG4200 Algoritmer og datastrukturer forelesning 10. Lars Sydnes 21. november 2014

OPPGAVE 5b og 8b Java Kode

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Algoritmeanalyse. (og litt om datastrukturer)

UNIVERSITETET I OSLO

PG 4200 Algoritmer og datastrukturer Innlevering 1. Frist: 2.februar kl 21.00

Kapittel 9: Sortering og søking Kort versjon

Rekursiv programmering

UNIVERSITETET I OSLO

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

PG4200 Algoritmer og datastrukturer Forelesning 2

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

PG4200 Algoritmer og datastrukturer Forelesning 12

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Kapittel 14, Hashing. Tema. Definere hashing Studere ulike hashfunksjoner Studere kollisjonsproblemet 17-1

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

EKSAMEN. Algoritmer og datastrukturer

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

INF1010 Hashing. Marit Nybakken 8. mars 2004

Algoritmer og Datastrukturer

Et eksempel: Åtterspillet

Pensum: fra boken (H-03)+ forelesninger

Kap.8 Sortering og søking sist oppdatert 16.03

Pensum: fra boken (H-03)+ forelesninger

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

Når Merge sort og Insertion sort samarbeider

UNIVERSITETET I OSLO

INF1010 Sortering. Marit Nybakken 1. mars 2004

Løsningsforslag til INF110 h2001

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

PG4200 Algoritmer og datastrukturer forelesning 3. Lars Sydnes 29. oktober 2014

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

INF Seminaroppgaver til uke 3

Liste som abstrakt konsept/datatype

Innledning. IN2010/INF Algoritmer og datastrukturer. Tirsdag 27. november 2018 Kl (4 timer)

ITF20006 Algoritmer og datastrukturer Oppgavesett 7

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

EKSAMEN. Objektorientert programmering

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

UNIVERSITETET I OSLO

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer IAI 21899

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Obligatorisk oppgave 1 INF1020 h2005

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

Korteste vei i en vektet graf uten negative kanter

Algoritmer og datastrukturer Eksamen

Transkript:

Oppgavesettet består av 12 (mange) sider. Norges Informasjonsteknologiske Høgskole PG4200 Algoritmer og datastrukturer Side 1 av 12 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. MED TIDESTIMATER Løsningsforslag Obs: Dette er et utbygd løsningsforslag. D.v.s at det kan forekomme feil, og at løsningene er mer omfattende enn det som kreves av studentene på eksamen. 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. <5 min> (i) f(n) har orden O(n 2 ). (ii) g(n) har orden O(n 2 log n). b) Angi hvordan kjøretiden til funksjonene f og g i kodesnutten nedenfor avhenger av n. Svaret skal begrunnes og uttrykkes med O-notasjon. <7 min> 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;

Side 2 av 12 9 else { 10 dosomething(n); 11 g(n-1); 12 13 14 15 void dosomething(int n){ 16 // Something O(1) 17 Behandling av funksjonen f: Metoden dosomething oppgis å ha kjøretid O(1). Dermed har instruksjonen i linje 3 konstant kjøretid. Iterasjonvariabelen i går gjennom verdiene 1, 2, 4,, 2 k, Der k er det største heltallet mindre enn log n. Antallet iterasjoner er altså av orden O(log n). f(n) har følgelig kjøretid av orden O(log n). Behandling av funksjonen g: Her har vi en rekursiv funksjon, som kalles n + 1 ganger, via funksjonskallene g(n), g(n 1),..., g(1), g(0) Hvis vi ser bort fra det rekursive kallet (linje 11), har alle linjene i g konstant kjøretid. Funksjonskallet g(n) innebærer altså n funksjonskall som hver for seg bidrar med konstant kjøretid. Vi har altså kjøretid av orden O(n). 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? <4 min>

Side 3 av 12 Begge disse søkemetodene kommer til anvendelse når vi arbeider med lister. Fordelen med binært søk er at det har kjøretid av orden O(log n), der n er antallet elementer i listen. Binært søk forutsetter dog at listen er sortert. Fordelen med sekvensielt søk er at det fungerer for usorterte lister. Ulempen er at kjøretiden er lineær. b) Forklar hva som foregår under panseret i følgende kodesnutt: for (String str : list) System.out.println(str) <4 min> I denne for-løkken brukes det en iterator, og man kan se på dette som en forkortelse for følgende kodesnutt: Iterator<String> it = list.iterator(); while(it.hasnext()) System.out.println(it.next()); Dette kan også skrives som for (Iterator<String> it = list.iterator();it. hasnext();system.out.println(it.next())); 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. <6 min>

Side 4 av 12 Treet ser slik ut: 2 1 7 4 5 8 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: <5 min> class Node<T extends Comparable<T>> { T data; Node<T> left; Node<T> right; boolean contains(t elem) { return findbelow(root,elem); boolean findbelow(node<t> node, T elem){ if (node == null) // STOPPBET. I return false; int cmp = elem.compareto(node.data) if (cmp == 0) { // STOPPBET. II return true; else if (cmp < 0) { // REK.STEG I return findbelow(node.left,elem); else { // REK.STEG II return findbelow(node.right,elem);

Side 5 av 12 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. <5 min> Metodene hashcode og equals må tilfredsstille følgende betingelse: Hvis A.equals(B) returnerer true, så skal A.hashCode() returnere samme verdi som B.hashCode(). Dersom vi bruke HashSet på objekter som ikke tilfredsstiller dette kravet, vil det kunne inntreffe at to like objekter har ulik hash-kode. Siden objektene har ulik hash-kode, vil de som oftest plasseres i ulik indeks i hash-tabellen, og det blir aldri oppdaget at de er like. På den måten kan vi ende opp med flere like objekter. Dette bryter med lovnadene til Set-grensesnittet, som lover å inneholde kun ett eksemplar av hvert objekt. En enda mer alvorlig konsekvens av at dette brytes, er at søk i tabellen forkludres. Anta at B.equals(A)== true, men at disse objektene har ulik hash-kode. Anta videre at objektet A allerede befinner seg i treet. Når vi kaller hashset.contains(b), vil det søkes etter A utifra hash-koden til B. Siden denne hash-koden er forskjellig fra hash-koden til A, er det kun flaks om vi tilfeldigvis støter på A. b) Forklar hvordan egenskapene til objektenes hashcode-metode kan påvirke ytelsen til java.util.hashset. <5 min> Dersom metoden hashcode gir mange objekter samme hash-kode, er resultatet at mange objekter hører til i samme indeks i tabellen. I java.util.hashset håndteres kollisjoner ved at elementer som hører til i samme indeks legges i lenkede lister som behandles sekvensielt. En hash-kode som gir mange kollisjoner vil altså resultere i at: (i) Mange objekter ligger i lenkede lister, mens store deler av tabellen er tom. Dermed kaster vi bort en god del minne.

Side 6 av 12 (ii) Lagring og søk foregår i stor grad sekvensielt, og tar dermed mer tid enn ellers. 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 <9 min> Riktig svar er Bubble sort. I hvert steg er det ett par av nabotall som byttes om dersom de ikke står i riktig rekkefølge. Man kan se hvordan sorteringsalgoritmen arbeider seg bakover i listen tre ganger før listen er sortert. 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 7 av 12 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: <10 min> (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. Vi forventer at HashSet gir betydelig raskere søk enn de andre beholderne. Derfor kan vi være ganske sikre på at målingene merket C er knyttet til HashSet (i).

5 Side 8 av 12 Vi forventer at TreeSet gir betydelig raskere søk enn ArrayList. Dermed kan vi være ganske sikre på at målingene merket B kommer fra TreeSet (iii). Når hash-koden kun gir verdiene 0, 1, 2, 3, degenererer HashSet til fire lenkede lister (HashSet implementerer chaining), hvor vi er nødt til å gjøre sekvensielt søk. I LinkedList er vi også nødt til å gjøre sekvensielt søk. Dermed virker det rimelig at kjøretiden til dårlig hash-set og lenket liste vokser omtrent like raskt. Utifra opplysningene i oppgaven kan vi i alle fall ikke klare å skille mellom dem. Det vi kan være rimelig sikre på, er at målingene A og D hører til beholderne (ii) og (iv). Noe mer har vi neppe dekning for å si. Oppgave 6 a) Drøft hvilken betydning datastrukturen heap har for kjøretiden til Dijkstras algoritme. <5 min> b) Et sentralt element i Dijkstras algoritme er en prioritetskø som prioiriterer korte veier fremfor lange. Dersom man bruker en sortert liste som prioritetskø, vil insetting av nye veier ha kjøretid av orden O(n), der n er antallet elementer i køen. Dersom man bruker en heap, blir kjøretiden av orden O(log n). Det å bruke en heaå gjør altså Dijkstras algoritme mye raskere enn ellers, særlig når man må vurdere mange ulike veivalg. Gå gjennom Dijkstras algoritme steg for steg på jakt etter den korteste veien fra A til B i den følgende vektede grafen: <8 min> 2 A 6 9 B 9 1 4 F G 3 C 2 9 E 5 D

Side 9 av 12 Her fremstilles heapen steg for steg, i tabell-implementasjonen. Vi representerer veier ved bokstavsekvenser, og passer på å bokføre lengden til veien: (A; 0) [(AG; 2), (AB; 9), (AC; 9)] [(AGE; 4), (AGB; 8), (AC; 9), (AB; 9)] [(AGB; 8), (AB; 9), (AC; 9), (AGEB; 9), (AGED; 9)] Nå hentes (AGB; 8) ut av heapen, og vi ser at AGB er den korteste veien fra A til B, og at den har lengde 8. /** * 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 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 9.

Side 10 av 12 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. <9 min> Her kan vi dra nytte av at TreeSet er et binært søketre der standarditeratoren gir oss elementene i sortert rekkefølge. En forutsetning for at dette skal fungere såpass bra, er at compareto-metoden holder det den lover, nemlig at den respekterer den alfabetiske rekkefølgen. Legg også merke til at denne fremgangsmåten sikrer at ingen oldebarn blir skrevet ut to ganger. Det er uvanlig, men ikke umulig at et oldebarn har flere linjer tilbake til samme oldeforeldre. Løsningen blir som følger: public static void oldebarn(person a){ Set<Person> output = new TreeSet<Person>(); for (Person child : a.getchildren()) for (Person gchild: child.getchildren()) for (Person ggchild: gchild.getchildren ()) output.add(ggchild) for (Person ggchild: output) System.out.println(ggChild.getName()) 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. <12 min>

Side 11 av 12 Vi bruker følgende strategi: (i) Vi bygger opp et register over alle forfedrene til person a. Vi bruker et HashSet-objekt for å lage dette registeret. Da sparer vi tid når vi skal slå opp i registeret (ved søk). (ii) For hver av forfedrene til person b undersøker vi om vedkommende er registrert som opphav til person a. public static booldan fellesopphav(person a, Person b){ Set<Person> aopphav = new HashSet<Person>(); fillwithancestors(aopphav,a); return ancinreg(aopphav,b); private static void fillwithancestors(set< Person> set, Person a){ if (a == null) // STOPPBET. return; set.add(a); fillwithancestors(set,a.getfather()); fillwithancestors(set,a.getmother()); private static boolean ancinreg(set<person> set, Person b){ if (b == null) return false; else if (set.contains(b)) return true; else if (ancinreg(set,b.getfather())) return true; else if (ancinreg(set, b.getmother())) return true; else return false; Vi kan gjøre den siste metoden litt mer kompakt (og uleselig?):

Side 12 av 12 private static boolean ancinreg(set<person> set, Person b){ return (b!= null) && ( set.contains(b) ancinreg(set,b.getfather()) ancinreg(set, b.getmother())) 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. <6 min> Det verste som kan skje, er at person a og b har n 1 fulle generasjoner av forfedre tilstede i slekstreet, d.v.s. 1 + 2 + 4 + 8 + + 2 n 1 = 2 n 1 2 n forfedre (når vi også regner med den personen vi tar utgangspunkt i), og at a og b ikke har felles opphav. I så fall innebærer løsningen vår at aopphav fylles med omtrent 2 n personer, og at vi må gjøre omtrent 2 n søk i aopphav. Siden metodene HashSet.add og HashSet.contains har omtrent konstant kjøretid, medfører dette at worst case kjøretid er av orden O(2 n ). Slutt på oppgavesettet Estimert tidsbruk: 100 minutter Antall punkter: 15