Oppgavesettet består av 8 (åtte) sider. NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer Tillatte hjelpemidler: Ingen Side 1 av 8 Varighet: 3 timer Dato: 4.juni 2013 Fagansvarlig: Lars Sydnes lars.sydnes@nith.no 93 03 56 85 Oppgavesettet består av 7 oppgaver. Husk å lese oppgavene nøye. Oppgi hvilke forutsetninger du bruker. Oppgave 1 Angi orden til de følgende vekstfunksjonene med O-notasjon. Det er ikke nødvendig å begrunne svaret. a) f a (n) = 3 + 2n + 5n 2 + 0.9n 3 b) f b (n) = 100 log n + 1.01 n I det følgende refererer vi til Kodesnutt 1 på side 2. c) Bruk O-notasjon til å beskrive hvordan kjøretiden til fua avhenger av n. d) Bruk O-notasjon til å beskrive hvordan kjøretiden til fub avhenger av n. Oppgave 2 a) Forklar forskjellen mellom binært og sekvensielt søk. Når kan man bruke binært søk? Når må man søke sekvensielt? b) Skriv en java-implementasjon av sekvensielt søk i en tabell. Metoden skal returnere 1 ved mislykket søk. Ved vellykket søk skal indeksen til det søkte objektet returneres.
Side 2 av 8 public static void fua(int n) { for (int i = 0; i < n ; i++) for (int j = 0; j < n; j++) dosomething(i,j); public static void fub(int n) { for (int i = 1 ; i < n; i*=2) fua(i); private static void dosomething(int i, int j) { System.out.printf("i = %d\tj = %d",i,j);// O(1) Kodesnutt 1: Java-kode tilhørende Oppgave 1. Vi gjør den forenklende antagelsen at dosomething har konstant kjøretid. loop 1: for (int i = 0; i < list.size(); i++) doaction(list.get(i)); Iterator<Object> iter = list.iterator(); loop 2: while (iter.hasnext()) doaction(iter.next()); loop 3: while (!list.isempty()) doaction(list.remove(0)); Kodesnutt 2: Listen list blir grundig iterert. Om man vil kan man anta at doaction har konstant kjøretid.
Side 3 av 8 Oppgave 3 Her refererer vi til Kodesnutt 2 på side 2. a) Drøft kjøretiden til de tre løkkene når list er en tabell-struktur som f.eks ArrayList. b) Drøft kjøretiden til de tre løkkene når list er en lenket liste som f.eks LinkedList. Oppgave 4 Her skal vi se på fem ulike sorteringsalgoritmer: (i) Quick sort (ii) Insertion sort (iii) Bubble sort (iv) Selection sort (v) Merge sort Tabell 1a og Tabell 1b på side 3 viser en liste under sortering. a) Hvilken av sorteringsalgoritmene (i-v) er brukt i Tabell 1a? b) Hvilken av sorteringsalgoritmene (i-v) er brukt i Tabell 1b? 4 9 2 1 6 5 3 1 9 2 4 6 5 3 1 2 9 4 6 5 3 1 2 3 4 6 5 9 1 2 3 4 6 5 9 1 2 3 4 5 6 9 1 2 3 4 5 6 9 1 2 3 4 5 6 9 (a) 4 9 2 1 6 5 3 4 9 2 1 6 5 3 4 9 2 1 6 5 3 2 4 9 1 6 5 3 1 2 4 9 6 5 3 1 2 4 6 9 5 3 1 2 4 5 6 9 3 1 2 3 4 5 6 9 (b) Tabell 1: Utvalgte sorteringsstadier.
Side 4 av 8 Se på den rekursive Quick sort-implementasjonen i Kodesnutt 3 på side 5. c) Hva er stoppbetingelsen her? Hva skjer når stoppbetingelsen er tilfredsstilt? d) Legg merke til den magiske konstanten 7 i Kodesnutt 3 på side 5. Her har programmererne tydeligvis bestemt seg for at 7 er et passelig stort tall. Hvilke overveielser forestiller du deg det kan ligge bak dette valget? Oppgave 5 a) Hva kjennetegner et balansert søketre? Hvorfor er balanserte søketrær å foretrekke fremfor ubalanserte? b) La T være et AVL-tre. For de to tilfellene (i) A = {1, 3, 4, 2 (ii) A = {1, 3, 2, 4 skal du fremstille treet T grafisk etter at elementene i listen A er lagt inn i det. c) Forklar kort hvordan man kan bruke hash-funksjoner til effektiv lagring og søk i data.
Side 5 av 8 private static void sort1(int x[], int off, int len) { if (len < 7) { for (int i=off; i<len+off; i++) for (int j=i; j>off && x[j-1]>x[j]; j--) swap(x, j, j-1); return; // Choose a partition element, int m = off + (len >> 1); // Small arrays, middle element /*forts. av quicksort-implementasjon*/ Kodesnutt 3: Utdrag av en implementasjon av Quick sort i klassen java.util.arrays (v 1.2) Oppgave 6 Denne oppgaven tar for seg Kodesnutt 4 på side 6. a) Anta at klassen BinarySearchTree ikke implementerer balansering. Forklar hvorfor worst case-kjøretid for treesort i dette tilfellet ikke kan være bedre enn O(n 2 ). Tips: Finn på et eksempel som gir lang kjøretid b) Anta at klassen BinarySearchTree implementerer balansering. Hvilken orden har nå kjøretiden til treesort? c) Vi ønsker å bygge en forbedret versjon av treesort. Kravene er at (i) sorteringen foregår ved å ta elementer inn og ut av et binært søketre (ii) det binære søketreet har ingen rebalanseringsmekanisme. Foreslå en forbedring av treesort som ikke bryter med disse to kravene.
Side 6 av 8 public static void treesort (Object[] A) { BinarySearchTree T = new BinarySearchTree(); for (Object obj : A) T.add(obj); int i = 0; for (Object obj : T) A[i++] = obj; class BinarySeachTree implements Iterable<Object> { /*...*/ public void add(object obj) { /*...*/ /*...*/ public Iterator<Object> iterator() { return iteratorinorder(); /*...*/ Kodesnutt 4: Tree sort. Denne sorteringsmetoden har ikke vært presentert i kurset. Klassen BinarySearchTree er en uspesifisert implementasjon av binært søketre. Algoritmen virker slik: (i) Elementene som skal sorteres legges inn i søketreet. (ii) Elementene tas ut av treet i sortert rekkefølge.
Side 7 av 8 Oppgave 7 public boolean solveproblem(network G) { double totallength = 0; for (Edge edge : G.getEdges()) totallength+=edge.weight(); for (VertexPair pair : G.getVertexPairs()) if (!pair.hasedge()) G.addEdge(pair, totallength); double sclength = findshortestcircuit(g); return sclength <= totallength; Kodesnutt 5: solveproblem Her skal vi arbeide med Kodesnutt 5 på side 7. Legg merke til følgende: Ordet circuit betegner her rundreiser i nettverket som besøker hver node eksakt én gang. Metoden findshortestcircuit returnerer lengden til den korteste rundreisen av denne typen. Vi antar at metoden findshortestcircuit kun godtar å arbeide med komplette grafer, altså grafer der alle nodene er direkte naboer. Forøvrig skal navnene gi tilstrekkelig informasjon om de ulike funksjonene og klassene.
Side 8 av 8 1 B 1 A 1 1 C D Figur 1: Eksempel a) Vi anvender metoden solveproblem i Kodesnutt 5 på eksempelet som er skissert i Figur 1 på side 8. Skissér hvordan grafen G ser ut etter de to for-løkkene. Hva returnerer solveproblem i dette eksempelet? b) Hvilket problem løser metoden solveproblem? Hva forteller informasjonen i denne oppgaven om hvilken kjøretid vi kan forvente for metoden findshortestcircuit? Slutt på oppgavesettet