NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 20 ette løsningsforslaget er til tider mer detaljert enn det man vil forvente av en eksamensbesvarelse. et er altså ikke et eksempel på en perfekt besvarelse, men snarere en diskusjon av oppgavene. Oppgave a) f(n) tilhører vekstklassen O(n 2 log n), g(n) tilhører vekstklassen O(2 n ). b) F har kjøretid av orden O(log n). ersom man antar at fua har konstant kjøretid, kan man konkludere med at G har kjøretid av orden O(n). Her er det et poeng at studenten behandler fua på en bevisst måte, og klargjør forutsetningene. Noen har implisitt antatt at fua har samme kjøretid som F. et er ikke helt korrekt, men sensor har likevel tatt det for god fisk. Oppgave 2 a) Stakker og køer er beholdere med to hoved-operasjoner: isse kan kalles legg til og ta ut. I en stakk følger disse operasjonen last in, first out-prinsippet: Operasjonen ta ut fjerner alltid det sist tillagte elementet fra beholderen. I en kø følger operasjonene first in, first out-prinsippet: Operasjonen ta ut fjerner alltid det elementet som har vært lengst i beholderen. b) enne metoden fungerer fint for ArrayList-objekt, og hele løkken har kjøretid av orden O(n). ersom vi anvender den på LinkedList -objekter, så krever operasjonen get(i) sekvensiell gjennomgang av listen, og har dermed kjøretid av orden O(n). Totalt sett får løkken kjøretid av orden O(n 2 ). c) En rekursiv funksjon er en funksjon som kaller seg selv. e viktigste bestanddelene er Stoppbetingelsen: Rekursjonen må koke ned til et basistilfelle som håndteres direkte.
Ett eller flere rekursive funksjonskall. Utover dette vil en rekursiv funksjon gjerne gjøre en del for- og etterarbeid. d) Hash-tabeller brukes for lagring og søk etter data, typisk i form av hashmengder (HashSet) og hashavbildninger (HashMap). e) ersom man skal legge nye objekter inn i hashtabeller som har brukt opp kapasiteten sin, må vi utvide kapasiteten ved å kopiere den underliggende arrayen over i en ny og større array. Siden objektenes indeks avhenger av tabellstørrelsen (index = hashode % capacity), må indeksen til alle objektene beregnes på nytt før objektene kan lagres på riktig plass i den nye arrayen. f) For en liste av lengde n har Heap sort kjøretid av orden O(n log n). g) Tre med balansefaktorer: (2) 0 (0) 4 (-) 2 () 5 (0) (0) alansert tre: 2 4 0 5 Oppgave a) (v) Merge sort. b) (iii) ubble sort 2
Oppgave 4 a) Naboskapsmatrisen kan fremstilles slik: A A b) et følgende er et minmum spanning tree for grafen: A c) Ja. Vi har for eksempel følgende Hamiltonske rundreise: A d) Vi angir veier i grafen som lister av noder, med den totale veilengden i parentes: A, () A,, (2) A (0) A, () A,, (4) A, () A, () A,,, () A,, (4) A,,, () A,, (4) A,, (4) Utifra dette konkluderer ijkstras algoritme med at den korteste veien fra A til er som følger:
A Oppgave 5 a) Inorder traversal. b), 2,, 4, 5. c) public boolean contains(omparable thetarget) { Node current = root; int cmp; } while (current!= null) { cmp = target.compareto(current.element); if (cmp == 0) return true; else if (cmp < 0) current = current.left; else if (cmp > 0) current = current.right; } return false; Oppgave 6 a) I dette tilfellet vil sort-steget ha kjøretid av orden O(n log n). enqueue -operasjonen har dermed kjøretid av orden O(n log n). dequeue har konstant kjøretid. ermed vil usequeue har kjøretid av orden O(n 2 log n), siden den medfører n kall av enqueue. b) Her vil sort-steget ha overraskende kort kjøretid: Siden arrayen data til enhver tid er sortert, vil Insertion sort ha kjøretid av orden O(n). enqueue-operasjonen har dermed kjøretid av orden O(n). dequeue 4
har konstant kjøretid. ermed vil usequeue har kjøretid av orden O(n 2 ), siden den medfører n kall av enqueue. c) ersom vi bruker en heap kan vi implementere både enqueue og dequeue med kjøretid av orden O(log n). ermed vil usequeue ha kjøretid av orden O(n log n). Oppgave 7 Her berører vi temaet ekstern sortering. en typiske fremgangsmåten er å laste segmenter av dataene opp i arbeidsminnet og utføre konvensjonell sortering der. e sorterte segmentene skrives tilbake til harddisken hvor de blir flettet sammen på en systematisk måte. Se f.eks: External Sorting on Wikipedia MergeSort (Som beskrevet over) Man kan dele tabellen opp i segmenter som er tilstrekkelig små til å lastes opp i datamaskinens minne. isse segmentene sorteres på konvensjonell måte, f.eks ved hjelp av Quicksort. e sorterte segmentene kan så flettes sammen, på sammen måte som i vanlig Merge sort, bortsett fra at vi nå arbeider på systemets harddisk. I denne enkleste løsningen vil vi mye av kjøretiden gå med på å lese og skrive på harddisken. Med fornuftig bufring kan vi redusere denne ulempen betraktelig. Scoring (Situasjonsbetinget løsning) ersom hovedproblemet med tabellen vår ikke er antallet objekter, men objektenes størrelse, kan det tenkes å være mulig å hente ut sorteringsnøkkel fra dataene (en poengsum/score). ermed kan man lage en tabell i arbeidsminnet over sorteringsnøkler og opprinnelig indeks. enne kan sorteres på konvensjonelt vis, og brukes til å konstruere en sortert liste på harddisken. 5