Oppgave 1. Stabler og Køer (30%)

Like dokumenter
Oppgave 1. Sekvenser (20%)

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

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

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

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

UNIVERSITETET I OSLO

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

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

Algoritmer og Datastrukturer

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

EKSAMEN med løsningsforslag

København 20 Stockholm

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMEN. Algoritmer og datastrukturer

Definisjon av binært søketre

Løsnings forslag i java In115, Våren 1998

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

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

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Eksamen

Algoritmer og Datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Pensum: fra boken (H-03)+ forelesninger

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

Algoritmer og Datastrukturer IAI 21899

ALGORITMER OG DATASTRUKTURER

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Løsnings forslag i java In115, Våren 1996

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Binære trær: Noen algoritmer og anvendelser

EKSAMEN. Emne: Algoritmer og datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

EKSAMENSOPPGAVE. NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Pensum: fra boken (H-03)+ forelesninger

UNIVERSITETET I OSLO

Norges Informasjonsteknologiske Høgskole

Inf 1020 Algoritmer og datastrukturer

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

PG4200 Algoritmer og datastrukturer Forelesning 7

Løsnings forslag i java In115, Våren 1999

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

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

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Stack. En enkel, lineær datastruktur

Binær heap. En heap er et komplett binært tre:

Emnekode: I-Dato: I ~ Antall oppgaver: I I Aiie -sk:i=rftlige - bme trykte og håndskrevne, samt alle typer

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Algoritmer og Datastrukturer

Løsningsforslag til INF110 h2001

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Algoritmer og datastrukturer Eksamen

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

INF2220: Forelesning 2

INF1010 notat: Binærsøking og quicksort

Algoritmer og datastrukturer Løsningsforslag

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Definisjon: Et sortert tre

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

Oppgave 1. Løsningsforslag til eksamensoppgave. ITF20006 Algoritmer og datastrukturer Postorden traversering:

INF Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

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

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

INF1010 Binære søketrær ++

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Vi skal se på grafalgoritmer for:

INF2220: Forelesning 1

ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

INF2220: Forelesning 1

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Transkript:

Det matematisk-naturvitenskapelige fakultet UNIVERSITETET I BERGEN Eksamen i emnet I 120 - Algoritmer, datastrukturer og programmering Onsdag 13.Desember 2000, kl. 09-15. Ingen hjelpemidler tillatt. Oppgavesettet består av 5 oppgaver. I vedlegget er du gitt dokumentasjon av utvalgte ADTer og klasser i JDSL, som du fritt kan bruke i dine besvarelser. Skriv ned alle forutsetninger du gjør som ikke står i oppgaveteksten. Lykke til! Oppgave 1. Stabler og Køer (30%) Oppgaven dreier seg om ADT Stack og Queue (JDSL-dokumentasjon av disse gitt i vedlegg). Vi skal programmere metode(r) for å sjekke om en stabel og en kø er like. En stabel S er lik en kø Q hvis enten: både S.isEmpty()==true og Q.isEmpty()==true, eller både S.isEmpty()==false og Q.isEmpty()==false samtidig som S.top()==Q.front() og stabelen som resulterer etter S.pop() er lik køen som resulterer etter Q.dequeue(). Vi antar at vi har en implementasjon av ADT Stack, dvs en class Stabel implemements Stack. I hver av deloppgavene under skal du lage en ny klasse som arver fra class Stabel og har en ny metode public boolean eqqueue(queue Q) som returnerer true hvis og bare hvis stabelen metoden kalles fra er lik argumentet Q. Du skal bruke kall til metodene fra interface Stack og interface Queue. I hver av deloppgavene er kravene til implementeringen av eqqueue forskjellige, og i hvert tilfelle skal du gi fullstendig Java-kode, med bruk av JDSL. La Q være antall elementer i argumentet Q. 1.1 Du skal ikke bruke noen ekstra datastrukturer, og utføring av eqqueue(q) kan (og vil nødvendigvis) endre innholdet i både stabelen og køen. 1.2 Du skal nå implementere eqqueue slik at når et kall til denne metoden returnerer er både stabelen og køen gjenoppbygget, dvs de er uendret i forhold til før kallet. Du skal kun bruke en ekstra kø og en ekstra stabel til dette, ingen andre datastrukturer, bortsett fra eventuelle løkke-variable av type int. (Hint: Bruke while-løkker.) Antall dequeue-operasjoner pluss antall pop-operasjoner totalt for eqqueue(q) skal være: Mindre enn 3 Q dersom eqqueue returnerer false. Mindre eller lik 3 Q dersom eqqueue returnerer true.

1.3 Du skal nå implementere eqqueue slik at når et kall til denne metoden returnerer er stabelen gjenoppbygget, men køen er ikke nødvendigvis gjenoppbygget. Du skal ikke bruke noen ekstra datastrukturer, bortsett fra en objekt-variabel som kan inneholde et enkelt element fra stabelen. (Hint: Bruk rekursjon.) Oppgave 2. Binære søketrær og heap (15%) Gitt nøkkelverdiene S = {2, 3, 4, 8, 5, 6, 12, 9. 2.1 Tegn 2 forskjellige heap er som begge representerer S. 2.2 Tegn 2 forskjellige binære søketrær som begge representerer S. 2.3 For hver av de 4 datastrukturene du har tegnet over, tegn datastrukturen som er resultatet av å sette inn et nytt element med nøkkelverdi 7. Bruk algoritmene for innsetting som er gitt i læreboka. 2.4 Skisser (gi pseudokode) en metode void printsorted(node v), slik at kallet printsorted(root) for et binært søketre B med rotnode root vil skrive ut alle nøkkelverdiene i B i sortert rekkefølge. Treet i deloppgave 2.2 over skal gi utskriften: 2 3 4 5 6 8 9 12. Du kan bruke metodene node left(node v): returnerer venstre barn av v dersom denne eksisterer, ellers returnerer den null. node right(node v): returnerer høyre barn av v dersom denne eksisterer, ellers returnerer den null. boolean leaf(node v): returnerer true dersom v er en løvnode, dvs v har overhode ingen barn, false ellers. void print(node v): printer ut nøkkelverdien inneholdt i node v. Oppgave 3. Grafalgoritmer (20%) Gitt grafen G i figuren under. I deloppgavene under skal du simulere forskjellige grafalgoritmer på grafen G, alltid med utgangspunkt i node a. Vi sier at en node oppdages idet en algoritme første gang treffer på noden. Dersom det finnes et valg, så anvend alfabetisk ordning, f.eks. betyr dette at naboene til en node hentes fram i alfabetisk rekkefølge f.eks. ved følgende nabolister: -a: b, c -d: b, c, i -g: c, f, h, i -b: a, d -e: c -h: g, i -c: a, d, e, g -f: g -i: d, g, h

e f 17 15 a 3 10 c g 1 h 7 b 4 9 11 d 14 i 5 Vær nøye med å overholde den alfabetiske ordningen, og dobbeltsjekk dine svar, da et helt korrekt svar vil gi vesentlig flere poeng. 3.1 I hvilken rekkefølge vil DFS(a), dvs dybde-først-søk fra a, oppdage nodene i G? 3.2 I hvilken rekkefølge vil BFS(a), dvs bredde-først-søk fra a, oppdage nodene i G? 3.3 Vi sier at node x forlates idet det rekursive kallet DFS(x) terminerer. I hvilken rekkefølge vil DFS(a) forlate nodene i G? 3.4 Du skal nå simulere Dijkstra(a), dvs Dijkstra s algoritme for korteste stier med startnode a, på grafen G, og svare på to spørsmål. I hvilken rekkefølge vil Dijkstra(a) utføre relaxation-operasjon på kanter i G? Angi kantene ved deres endepunkter, og angi også hvorvidt relaxation-operasjonen førte til en endring i distansetabellen, f.eks. er ab den første kanten for hvilken relaxation utføres, og denne fører til en endring. Hva er de suksessive verdiene som blir tildelt hver node i distansetabellen? Angi disse verdiene for hver enkelt node, f.eks. for node b er svaret:, 7. 3.5 Du skal nå simulere Prim(a), dvs Prim-Jarnik s algoritme for minimum utspennende tre på grafen G hvor vi antar node a blir vilkårlig valgt i første steg, og svare på to spørsmål. Hva blir det resulterende minste utspennende treet? Tegn dette treet. I hvilken rekkefølge tildelte Prim(a) kantene til dette treet? Sett f.eks. et nummer på hver kant i treet som reflekterer når de ble lagt til treet.

Oppgave 4. Kompleksitetsanalyse (15%) For hver av metodene f1, f2, f3, f4, bestem verste-fall kjøretid i stor-o (big-oh) notasjon for kallene f1(a,n), f2(a,n), f3(a,b,c,n), f4(a,n) som en funksjon av argumentet N. For enkelhets skyld antar vi N er et positivt heltall som er en potens av 2. Den øvre grensen du gir skal være så tett som mulig, og du skal droppe uvesentlige konstanter, f.eks. for lineær kjøretid er O(N) et bedre svar enn O(2N+logN). Gi en begrunnelse for hvert svar. (Hint: Det er ikke nødvendig å forstå hva metodene gjør, men det kan likevel gi en pekepinn dersom du sitter fast.) void f1(int[] a, int n) { void f2(int[] a, int n) { int i,j; for (int i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (int j = 0; j < i; j++) { i = n; a[i] = a[i]+j; while (i > 1) { a[j] = a[j]/i; i = i/2; void f3(int[] a, int[] b, int[] c, int n) { int i=0, j=0, k=0; while (k < 2*n) { if (i<n && (j>n a[i]<b[j])) c[k++]=a[i++]; else c[k++]=b[j++]; void f4(int[] a, int n) { int[] b = new int[n/2]; int[] c = new int[n/2]; if (n < 2) return; for (i = 0; i < n/2; i++) b[i]=a[i]; for (i = n/2; i < n; i++) c[i]=a[i]; f4(b, n/2); f4(c, n/2); f3(b, c, a, n/2);

Oppgave 5. Programmering (20%) Du skal gi fullstendig Java-kode, med bruk av JDSL, for en implementasjon av interface GeneriskSort: public interface GeneriskSort { public void pqsort(rankedsequence S, Comparator C); // S inneholder objekter som kan sammenliknes vha C. // Objektene i S sorteres i stigende rekkefølge vha // prioritetskøsortering, og ender opp sortert i S. public void enkelsort(rankedsequence S, Comparator C); // S inneholder objekter som kan sammenliknes vha C. // Objektene i S sorteres i stigende rekkefølge, og // ender opp sortert i S. Det brukes ikke en prioritetskø. I vedlegget finner du dokumentasjon av JDSL-interface Comparator, RankedSequence og SimplePriorityQueue, samt dokumentasjon for JDSL-klasser som implementerer RankedSequence og SimplePriorityQueue. Disse klassene kan du fritt bruke uten å gi implementasjon. Jan Arne Telle Chunming Rong

Løsningsforslag Eksamen I120-H2000 NB: Kun et forslag, mange andre varianter er korrekte. Oppgave 1. Stabler og Køer (30%) 1.1 public class mystabel extends Stabel { public boolean eqqueue (Queue Q) { if (size()!= Q.size()) return false; while (!isempty()) { if (top()!= Q.front()) return false; pop(); Q.dequeue(); return true; 1.2 public class mystabel extends Stabel { public boolean eqqueue (Queue Q) { if (size()!= Q.size()) return false; Stack tempstack = new Stabel(); while (!isempty() && top() == Q.front()) { tempstack.push(pop()); Q.enqueue(Q.dequeue()); if (isempty()) { while (!tempstack.isempty()) push(tempstack.pop()); return true; else { for (int i=0; i<size(); i++) Q.enqueue(Q.dequeue()); while (!tempstack.isempty()) push(tempstack.pop()); return false;

1.3 public class mystabel extends Stabel { public boolean eqqueue (Queue Q) { if (size()!= Q.size()) return false; return eqq(q); private boolean eqq (Queue Q) { if (isempty()) return true; if (top()!= Q.front()) return false; Object temp = pop(); Q.dequeue(); boolean ret = eqq(q); push(temp); return ret; Oppgave 2. Binære søketrær og heap (15%) 2.1 Det vesentlige er at i) hver heap er et komplett binært tre,dvs har ett element på nivå 4 som ligger lengst til venstre, samt at ii) nøkkel for enhver node er mindre enn nøkkel hos eventuelle barn. 2.2 Det vesentlige er at i) hvert søketre er et binært tre (0, 1 eller 2 barn) og ii) at for enhver node med nøkkel x er alle nøkler i dens venstre deltre mindre enn x og i dens høyre deltre større enn x. 2.3 For heap brukes UpHeap-prosedyren, dvs at den nye nøkkelen starter i neste ledige posisjon, og bobler opp til rett plass. For binære søketrær skal den nye nøkkelverdien legges til i en ny løvnode på rett plass, og ingen andre endringer skjer i treet. 2.4 Algorithm printsorted(node v) if left(v)!= null printsorted(left(v)) print(v) if right(v)!= null printsorted(right(v)) Oppgave 3. Grafalgoritmer (20%)

e f 17 15 a 3 c 10 g 1 h 7 b 4 9 11 d 14 i 5 3.1 a, b, d, c, e, g, f, h, i 3.2 a, b, c, d, e, g, i, f, h 3.3 e, f, i, h, g, c, d, b, a 3.4 ab, ac, cd, ce, cg, bd, di, gf, gh, gi, hi (alle fører til endring) a : 0 b :, 7 c :, 3 d :, 12, 11 e :, 20 f :, 28 g :, 13 h :, 14 i :, 25, 24, 19 3.5 Treet får kantene (i rekkefølge): ac, ab, bd, cg, gh, hi, gf, ce. Oppgave 4. Kompleksitetsanalyse (15%) f1 er O(NlogN). En ytre for-løkke som utfører while-løkken N ganger. For hver av disse utføres operasjonene inne i while-løkken x ganger, hvor x er antall ganger vi kan dele N på 2 før vi når ned til 1. Per definisjon er x = log 2 N. f2 er O(N 2 ). Tildelingen i den indre for-løkken utføres 1 gang når i=1, 2 ganger når i=2, osv inntil n-1 ganger når i=n-1. Kjøretiden totalt blir dermed O(Σi=1 i=n 1 i) = O(N 2 ). f3 er O(N). k starter på 0, øker med 1 hver gang gjennom while-løkken, og vi stanser når k = 2 N 1.

f4 er O(NlogN). Dette er Flettesorteringsalgoritmen (borsett fra en liten bug: c[i]=a[i] skulle være c[i-n/2]=a[i]). Analysen kan gjøres ved å se at kallet f4(n) leder til to kall f4(n/2) samt O(N) tid for å flytte elementer mellom tabeller og kjøre f3. Vi kan sette opp et (binært) tre av rekursive kall, som vil ha dybde logn, og se at det i hvert nivå vil utføres O(N) arbeid. Oppgave 5. Programmering (20%) public class GenSort implements GeneriskSort { public void pqsort(rankedsequence S, Comparator C) { SimplePriorityQueue pq = new HeapSimplePriorityQueue(C); while (!S.isEmpty()) pq.insertitem(s.removeelematrank(0), null); while (!pq.isempty()) { S.insert(pq.minKey()); pq.removeminelement(); public void enkelsort(rankedsequence S, Comparator C) { for (int j=0; j<s.size(); j++) { Object min=s.elematrank(j); int minrank=j; for (int i=j+1; i<s.size(); i++) { Object next=s.elematrank(i); if C.isLessThan(next, min) { min=next; minrank=i; S.replaceElemAtRank(minrank, S.elemAtRank(j)); S.replaceElemAtRank(j, min);