Det matematisk-naturvitenskapelige fakultet

Like dokumenter
UNIVERSITETET I OSLO

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

EKSAMEN med løsningsforslag

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

Algoritmer og datastrukturer Løsningsforslag

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

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Eksamen 22. februar 2011

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

EKSAMEN. Algoritmer og datastrukturer

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

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Oppgave 1. Sekvenser (20%)

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Object [] element. array. int [] tall

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

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

Definisjon av binært søketre

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

Løsningsforslag til INF110 h2001

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

INF2220: Forelesning 2

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Algoritmer og datastrukturer Eksamen

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2016

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

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

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

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Algoritmer og Datastrukturer

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Eksamen

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

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

Algoritmer og datastrukturer Løsningsforslag

Norsk informatikkolympiade runde

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

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

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

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

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

UNIVERSITETET I OSLO

Definisjon: Et sortert tre

UNIVERSITETET I OSLO

Notater til INF2220 Eksamen

København 20 Stockholm

UNIVERSITETET I OSLO

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Norsk informatikkolympiade runde

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

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

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

UNIVERSITETET I OSLO

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

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

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

UNIVERSITETET I OSLO

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

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Norsk informatikkolympiade runde

Løsningsforslag 2017 eksamen

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Trær. En datastruktur (og abstrakt datatype ADT)

UNIVERSITETET I OSLO

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Transkript:

LØSNINGSFORSLAG - KOMMENTARER til SENSOR N.B. RETTELSE 23.05 og 26.05 pkt. e) :UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : IN 5 Eksamensdag : Lørdag 20 mai, 2000 Tillatte hjelpemidler : Alle trykte og skrevne Arne Maus og Almira Karabeg Totale testprogrammer for de to oppgaven, eksamensoppgaven og sensor-veiledning(denne) finnes på: http://www.ifi.uio.no/~arnem/in5 Oppgave (40 %) Her var det en stygg trykkfeil - nederst på s. stod det at :. Det er bladnoder dvs noder med bare tomme subtrær, som kan ha bare en verdi. Dette ble opplyst tidlig på eksamen til alle at det måtte rettes til:. Det er bladnoder dvs noder med bare tomme subtrær, som kan ha en eller to verdier.. Vi tror at ingen ble plaget av dette da eksempelet hadde både en og to verdier i bladnodene: 20 40 7 0 22 35 50 60 2 8 9 4 4 42 52 023 Oppgave a) Fellen her er at man glemmer å bytte om verdiene hvis den nye verdien er mindre enn den gamle: void setv2(int v) if ( v < v) int t = v; v = v; v2 = t; v2 = v; v2filled = true;

Oppgave b) Her kan man svare både iterativt og rekursivt (like bra). Rekursivt er en løsning (numvalues brukes i fjern - ikke påkrevet i insert.: public boolean insert(int v) if (numvalues == 0) rota = new TriNode(v); return true; return insert(root(), v); public boolean insert(trinode n, int v) if ( v == n.v ( n.v2filled && v == n.v2)) return false; if (! n.v2filled) n.setv2(v);numvalues++; if (v < n.v ) if ( n.vsub == null ) n.vsub = new TriNode (v);numvalues++; insert ( n.vsub, v); if ( v < n.v2) if (n.msub == null ) n.msub = new TriNode (v); numvalues++; insert (n.msub,v); if ( n.hsub == null ) n.hsub = new TriNode(v);numValues++; insert (n.hsub, v); return true; // end insert Oppgave c) (OldN er en variabel som ikke nyttes her, men i fjern -metoden, og løser problemet med å finne den noden som peker på den bladnoden som vi evt. skal fjerne.) public TriNode find ( int v) oldn = rota; return find (root(),v); public TriNode find (TriNode n, int v) if ( n == null) return null; if ( v == n.v ( n.v2filled && v == n.v2)) return n; if (v < n.v ) oldn =n; return find ( n.vsub, v); if ( v < n.v2) oldn = n;return find(n.msub,v); oldn = n; return find (n.hsub, v); // end find Oppgave d) public void skrivsortert() skrivsortert(root()); public void skrivsortert(trinode n) if ( n!= null) skrivsortert(n.vsub); System.out.println (n.v); skrivsortert(n.msub); if (n.v2filled) System.out.println (n.v2); skrivsortert(n.hsub);

Oppgave e) RETTELSE - 23.05 og 26.0: Per def er høyda på rota = 0 Høyden på et velballansert trinærtre med n noder er da eksakt: h =log 3 (2n +), og som for helt fulle trinære trær som det er spørsmål om her vil gi et heltall (med:,4,3,40,... noder), men siden de aller fleste nodene er bladnoder, vil også: h =log 3 (2n) - rundet av nedover til nærmeste heltall, og. h =log 3 (n) - rundet av nedover til nærmeste heltall, gi riktig resultat Oppgave f) Rot-verdiene plasseres i a[0] og a[]; De tre subtrærne (v-verdien) til en node med v i a[i], finner vi i a[i*3+2], a[i*3+4] og i a[i*3+6]. v2-verdien følger i elementet etter v. Oppgave g) Kan puffes. Dette er et vanskelig punkt - og lang kode. Poenget her er å først oppdage at en, to eller tre subtrær kan være tomme, og erstatnings-verdi evt. må søkes i alle mulige subtrær til noden (hvis de/det prefererte er tomt), eller i et spesialtilfelle, i noden selv. Det andre man må oppdage er at ersatningsverdien ikke nødvendigvis ligger i en blad-node. Da må den verdien som bringes opp i treet for å erstatte den verdien vi vil fjerne, selv erstattes (rekursivt) - til vi henter en erstatningsverdi i en bladnode (og denne noden evt. fjernes) public boolean fjern(int v) // fjern verdi v og erstatt denne med verdi lenger ned i treet // (rekursivt) hvis noden n v er i, ikke er bladnode // Hvis n er bladnode, fjern n hvis den blir tom TriNode n = find (root(),v); if ( n == null) return false; // Verdien finnes ikke if ( bladnode(n)) if (v == n.v ) n.v = erstatt (oldn,n,false); n.v2 = erstatt (oldn,n, false); if ( v == n.v ) if ( n.vsub!= null ) n.v = erstatt (n,n.vsub, false); if ( n.msub!= null) n.v = erstatt (n,n.msub, true); // n.hsub!= null, fordi ikke bladnode n.v = n.v2; n.v2 = erstatt (n,n.hsub, true); // v == n.v2 if ( n.hsub!= null ) n.v2 = erstatt (n, n.hsub, true); if ( n.msub!= null) n.v2 = erstatt (n,n.msub, false); // n.hsub!= null, fordi ikke bladnode n.v2 = erstatt (n,n.vsub, true);

numvalues --; return true; // end fjern private void fjernnode (TriNode prev, TriNode n) // fjern bladnode n utpekt av prev if (prev.vsub == n ) prev.vsub = null; if (prev.msub == n ) prev.msub = null; if (prev.hsub == n ) prev.hsub = null; // end fjernnode private int erstatt ( TriNode prev, TriNode n, boolean minste ) // finn en erstatning for (implisitt v) i noden n!= null // minste signaliserer om vi søker etter minste eller største if ( bladnode(n)) // bladnode, finn erstatning og marker evt noden for fjerning if (minste) int i = n.v; n.v = n.v2; if (!n.v2filled) fjernnode(prev,n); n.v2filled = false; return i ; if (n.v2filled) n.v2filled = false; return n.v2; fjernnode(prev,n); return n.v; if (minste) // erstatt 'v' med minste i dette subtreet if ( n.vsub!= null) return erstatt(n, n.vsub,true); // bruk v og erstatt denne (n.vsub == null) int i = n.v; if (n.msub!= null) n.v = erstatt ( n, n.msub, true); af return i; // vet n.hsub!= null n.v = n.v2; n.v2 = erstatt (n, n.hsub,true); return n.v; // erstatt med 'største' i dette subtreet if (n.hsub!= null) return erstatt (n, n.hsub, false); // bruk v2 og erstatt denne (n.sub == null) int i = n.v2; if ( n.msub!= null) n.v2 = erstatt (n, n.msub,false); return i; // vet at n.vsub!= null n.v2 = erstatt (n, n.vsub, true);

return i; // end erstatt private boolean bladnode (TriNode n) return n.vsub == null && n.msub == null && n.hsub == null; Oppgave 2 Oppgave 2a). Det blir antall ruter minus for den defekte ruten, delt på 3. Altså, svaret er (2 2k - ) / 3. 2. Det er matematisk induksjon. Oppgave 2b) Generelt kan vi vel si at nyttes en annen, riktig men inneffektiv teknikk (som rekursjon med backtracing / perutasjoner) bør dette belønnes noe/litt selv om det blir inneffektivt. Teknikken som skulle brukes her er splitt og hersk. Man skal sette den første trimino i sentrum av det defekte sjakkbrettet, som vist på figur 3. Pass på at den plasseres slik at den ikke dekker den fjerdedelen av brettet som har defektiv rute. Da får man 4 subproblemer av størn 2 k- x 2 k- som har akkurat en defekt rute hver. Se på tegningen under. 2 k- x 2 k- 2k- x 2 k- 2 k- x 2 k- 2 k- x 2 k-

2. Når alle triominoer er plassert, begynner vi å fargelegge dem. Teknikken som gir en bra løsning her er grådig metoden. Vi kan her bruke to metoder for fargelegge - metode I) innser at man bare trenger 3 farger - mens II) - programmet - er en vanlig greedy metode. I) Vi begynner med å gi fargen til triomino som dekker den øvre, venstre rute på brettet (hvis denne er den defektive ruten, fargelegger vi den ikke, men fortsetter med algoritmen). Den får farge. Deretter fargelegger vi triomino som dekker den neste ikke fargede (eller defektive) rute i første rad av brettet. Den er nabo triomino til den første fargete derfor får den farge nummer 2 (eller hvis den første ruten var defekt). Vi fortsetter med å fargelegge den første ikke fargede rute (og resten av triomino som dekker den ruten) i øverste raden av brettet. Den er ikke lenger nabo til den første fargede triomino og kan få den samme fargen, dvs. farge nummer, osv. Man skulle observere her at en triomino generelt kan ha maksimalt 7 nabo triominoer og at det gir et konstant antall tester som må utføres for å finne hvilken farge som skulle brukes på den triominoen som fargelegges i øyeblikket. II) - Oppgave 2 c) public void tileandcolourboard ( int toprow, int topcol, int defectrow, int defectcol, int size) int half = size /2; int newrow = half +toprow; int newcol = half +topcol; if (size > ) // flere partitions nexttile++; if ( (defectrow < newrow ) && (defectcol < newcol) ) // Ø.venstre kvadrant board[newrow ][newcol-] = nexttile; board[newrow][newcol] = nexttile; board [newrow-][newcol] = nexttile; if(half > ) tileandcolourboard(toprow,topcol,defectrow,defectcol,half); tileandcolourboard(newrow,newcol,newrow,newcol,half); tileandcolourboard(newrow,topcol,newrow,newcol-,half); tileandcolourboard(toprow,newcol,newrow-,newcol,half); if ( (defectrow < newrow ) && (defectcol >= newcol ) ) // Ø. høyre kvadrant board[newrow -][newcol-] = nexttile; board[newrow][newcol-] = nexttile; board [newrow][newcol] = nexttile; if(half > ) tileandcolourboard(toprow,newcol,defectrow,defectcol,half); tileandcolourboard(toprow,topcol,newrow-,newcol-,half); tileandcolourboard(newrow,topcol,newrow,newcol-,half); tileandcolourboard(newrow,newcol,newrow,newcol,half);

if ( (defectrow >= newrow ) && (defectcol < newcol )) // N. venstre kvadrant board[newrow -][newcol-] = nexttile; board[newrow-][newcol] = nexttile; board [newrow][newcol] = nexttile; if(half > ) tileandcolourboard(newrow,topcol,defectrow,defectcol,half); tileandcolourboard(toprow,topcol,newrow-,newcol-,half); tileandcolourboard(toprow,newcol,newrow-,newcol,half); tileandcolourboard(newrow,newcol,newrow,newcol,half); if ( (defectrow >= newrow ) && (defectcol >= newcol )) // N. høyre kvadrant board[newrow ][newcol-] = nexttile; board[newrow-][newcol-] = nexttile; board [newrow-][newcol] = nexttile; if(half > ) tileandcolourboard(newrow,newcol,defectrow,defectcol,half); tileandcolourboard(newrow,topcol,newrow,newcol-,half); tileandcolourboard(toprow,topcol,newrow-,newcol-,half); tileandcolourboard(toprow,newcol,newrow-,newcol,half); // colour the tiles by the greedy method if ( size == lim ) // the first call // if (size== lim) return; for (int i = 0; i < lim ; i++) for (int j = 0 ; j < lim; j++) int k = board[i][j]; if( tilecolour[k] == 0) // this tile is not coloured int colour =0; do colour++; tilecolour [k] = colour; while (! okcolour(colour,k,i,j)); if (colour > maxcolour) maxcolour = colour; // i,j // end tileandcolourboard private boolean okcolour(int colour, int tilenum, int i, int j) int numfound = ; for(int k= i-; k < i+2; k++) for (int l= j-; l < j+2; l++) if ( (k>= 0 && k <lim && l>=0 && l<lim) && board[k][l] == tilenum) // test neighbours of (k,l) that is tile 'tilenum' for same colour if (k- >= 0 && board[k-][l]!= tilenum ) if (tilecolour[board[k-][l]] == colour) return false; if (l- >= 0 && board[k][l-]!= tilenum ) if (tilecolour[board[k][l-]] == colour) return false; if (k+ < lim && board[k+][l]!= tilenum ) if (tilecolour[board[k+][l]] == colour) return false; if (l+ < lim && board[k][l+]!= tilenum ) if (tilecolour[board[k][l+]] == colour) return false; return true;

// end okcolour Oppgave 2d) La T(k) være tiden som trengs til å flislegge det defekte 2 k x 2 k sjakkbrettet. Når k=0, size er lik og konstant tid d trengs. Når k>0, fire rekursive kall er sett i gang. De tar 4 T(k-) tid. I tillegg så er det if tester og flislegging av tre ikke defekte ruter. De tar konstant tid, la konstanten være lik c. Da får vi følgende rekursiv relasjon: T(k) = d hvis k = 0, ellers T(k) = 4 T(k-) + c hvis k > 0. Den kan løses ved iterativ substituering: T(k) = 4 T(k-) + c = 4 (4T(k-2) + c) +c = 4(4(4T(k-3) + c) + c) + c =...= O(4 k ). Fargeleggings delen av algoritmen går gjennom hele brettet en gang, så den også tar O(4 k ) tid. Derfor hele algoritmen tar O(4 k ) og, faktisk, siden vi trenger θ () tid til å sette eller farge en flis, så er det hele også θ (4 k ). Oppgave 3 Oppgave 3a) Frekvenstabellen for isismispi er: i m p s 4 3 og da skal treet se slik ut: 9 0 2 0 5 0 i m p s Kodene for symboler er : i 0, m 00, p 0 og s. Oppgave 3b) Dekoding av strengen gir: misissipi. Det som gjør at algoritmen alltid virker er at ingen kode er prefix av en annen kode. Algoritmen virker som følger:

. Siffrene leses ett av gangen, fra venstre mot høyre. 2. Hvis sifferet som leses er en kode for en bokstav tildeles denne bokstaven til sifferet. Hvis ikke leses neste siffer og de siffer som er lest hittil sammenlignes mot kode-tabellen. Dette gjentas inntil en unik kode er funnet. 3. Når en kode er identifisert gjentas punkt to fra det første siffer etter den identifiserte koden inntil hele strengen er identifisert.