I Kontrollert I høgskolen i oslo Emne Emnekode: Faglig veileder: Algoritmer og datastrukturer 80 131A UlUttersrud ppe(r): Dato: Eksamenstid:- 09.12.2003 9-14 Eksamensoppgaven består av: ta11 sider (inkl orsiden): 4 ta11 oppgaver: 4 Antall vedlegg 1 (3 sider) TiIiitte hjelpemidler Nle skritlige hjelpemidler-både trykte og håndskrevne, er tillatt Kandidaten må selv kontrollere at oppgavesettet er ullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre or de orutsetninger du legger til grunn or løsningen. I Utarbeidet av av (en av disse): Studieledersl (aglærer): I Fagkoordinators underskrit: --?' Avdeling or ingeniørutdanning. Con Adelersgate 30. 0254 Oslo. tl: 22 45 32 00. aks: 22 45 32 05. iu@hio.no
Algoritmer og datastrukturer - 09.12.2003 RAd og tips: Bruk ikke orjang tid pl et punkt i en oppgave hvis du ikke r det til innen rimelig tid. GI isteden videre til neste punkt. Hvis du i et senere punkt r bruk or det du skulle ha laget i et tidligere punkt, sl kan du ritt bruke resultatet som om det var løst og at løsningen virker slik som krevd i oppgaven. Prøv alle punktene. Det er ikke lurt I la noen punkter sti helt blanke. Til og med det I demonstrere i en eller annen orm at du har orstltt hva det spørres etter og/eller at du har en ide om hvordan det kunne løses, er bedre enn ingenting. Det er heller ikke slik at et senere punkt i en oppgave nødvendigvis er vanskeligere enn et tidlig punkt. AI/e de 10 bokstavpunktene tel/er likt! Hvis du skulle trenge en datastruktur eller en metode som hører til java. uti! eller er laget i undervisningen, kan du ritt bruke det uten mtte lage det selv. Men du bør kommentere at du gjør det! Oppgave 1 A. Lag metoden public static void snustakk(stakk sy. Den skal snu rekkeølgen av elementene p stakken s. Flg. eksempel viser hvordan den skal virke: SFakk s - new TabellStakk(); "'A" ).,, : "B") ; "C") ; "O") ; Sl;luStakk(sl; stakken 6 snus ile s.tom System.out.print(s.taUt +.. "); r.ttskrit: A B C D B. Gitt en vilkrlig tegntabell ( char [] ) der elementene er bokstavene R, Wog B. En slik tabell kan or eksempel se slik ut: char[] c z 'R' 'B' 'R' 'W' 'B' 'R' 'W' 'B' 'W' 'B, ",,, ", Det kan hende at den inneholder bare en av bokstavene eller bare to av bokstavene. Lag metoden public static void omorganiser(char[] c). Den skal omorganisere tabellen c slik at alle R-ene (hvis den inneholder R-er) kommer ørst, s alle W-ene (hvis den inneholder W-er) og til slutt alle B-ene (hvis den inneholder B-er). Eksempel:. char t Rt ' B' ' R' ' W' ' B' ' R' 'W' ' B' 'W' ' B ' """, I1 omorganisertc); II omorganiserer tabellen.; int i - O; i<.length; i++ System. out.prlnt (c (1 + " "); ut$krit RRRWWWBBBB Bokstavene R, Wog B st r orøvrig or argene Red, White og Blue og oppgaven er kjent som the Dutch national lag problem. - I -
Oppgave 2 Tegningen under viser et binært søketre med heltall som nodeverdier. :/ '- '/,, '" / Figur 1 A. i) Skriv ut treets verdier, dvs. treet i igur 1, i nivaorden og i preorden. Angi s en rekkeølge som er slik at hvis verdiene legges inn i et binæ rt søketre i den rekkeølgen, vii treet bli maken til (samme innhold og samme orm) som treet i igur 1. ii) Legg inn verdiene 6 og 15 I treet. Slett s rotnoden og den siste noden (den siste i inorden). Slettingen skal ølge reglene or sletting i et binært søketre. Tegn s treet du har tt. I vedlegget er det satt opp et "skjelett" or class BinTre - et binært søketre der duplikater ikke er tillatt. Metoden public boolean legglnn(object verdi) er erdiglaget. Den returnerer alse hvis parameterverdien verdi allerede ligger i treet. Hvis ikke legger metoden verdien p rett sortert plass og returnerer true. Klassen har ogs en erdiglaget iterator som gir oss treets verdier i inorden og en erdiglaget metode som returnerer treets komparator. B. En nodes dybde er avstanden mellom rotnoden og noden, dvs. lengden ps veien mellom dem. Lag metoden (se vedlegget) Int dybde(object verdi) slik at den returnerer -1 hvis verdi ikke innes i treet, og ellers returnerer dybden til den noden som inneholder verdi. C. Den siste noden (siste i inorden) i et binært søketre har ikke høyre barn. Den kan deror slettes ved at pekeren dit blir omdirigert. Lag metoden (se vedlegget) public Object slettsisteverdi() slik at den sletter den siste noden (siste i inorden) og returnerer nodens verdi. Hvis treet er tomt returneres nu". La X og Y være to noder. Hvis X er en etterkommer av Y eller Y er en etterkommer av X, så er avstand(x, Y) lik lengden på veien mellom dem. Hvis verken X er en etterkommer av Y eller Y er en etterkommer av X, så må X og Y ha en nærmeste elles orgjenger Z. Da sier vi at avstand(x, Y) = avstand(z,x) + avstand(z, Y). Eksempel: i) Hvis X er 31-noden og Yer 17-noden i treet i igur 1, s& er Yen etterkommer av X. Da blir avstand(x,y) = 3. ii) Hvis X er 2-noden og Yer lo-noden, s& har de 3-noden som nærmeste elles orgjenger. Dermed blir avstand(x, Y) = 1 + 3 = 4. D. Lag metoden (se vedlegget) int avstand(object verdi1, Object verdi2). Den skal returnere -l hvis en eller ingen av verdiene verdi1 og verdi2 ligger i treet. Hvis begge ligger i treet skal metoden returnere avstanden mellom nodene som inneholder de to verdiene. -2-
Oppgave 3 Du bør ha sett p oppgave 2 ør du starter med oppgave 3. I vedlegget er det satt opp et "skjelett" or c/ass TreTest. Den inneholder de to indre klassene NodeDybde og DybdeKomparator. Klassen DybdeKomparator har en komparator som instansvariabel og den r verdi i konstruktøren. A. Lag compare-metoden i klassen DybdeKomparator. Den skal sammenligne to instanser av klassen NodeDybde. Den av de to instansene som har minst dybde ( int dybde) sies S være størst, og hvis de har samme dybde er den størst som har minst verdi ( Object verdi ). Verdiene sammenlignes ved hjelp av instansvariablen c i DybdeKomparator- klassen. B. Lag metoden (se vedlegget) public static BinTre kopi(bintre tre) i c/ass TreTest. Den skal returnere et tre. Treet som returneres skal være en ekte kopi av det treet som er parameter til metoden. En ekte kopi er et tre med samme orm og innhold. Siden kodingen n oregr i c/ass TreTest, og ikke i c/ass BinTre, er det kun de oentlige metoder ra c/ass BinTre som kan brukes or lage en kopi. I main-metoden i c/ass TreTest er det et eksempel p hvordan metoden kan brukes. Oppgave 4 A. Sett inn, i den gitte rekkeølgen, lg. verdier i et rød-svart binærtre: lo, 4, 7, 13, 11, 6, 8, 9. Lag tre tegninger, en når du har satt inn 4 verdier, en når du har satt inn 6 verdier og en tegning til slutt når de 8 verdiene er satt inn. Gjør så om det rød-svarte treet med de 8 verdiene til et 2-3-4 tre. Det vil si sett opp et 2-3-4 tre som er slik at når det omormes til et rød-svart tre ved hjelp av "omregningsormlene", vil det gi vrt rød-svarte tre. B. Tegnene A, B, C, D, E, F, G og H har rekvenser 8, 4, 1, 5, 16, 6, 2 og 9. Dette gir det Humantreet som tegningen nedenor viser. S oppdager vi at A skal ha en rekvens p 10 istedenor 8, og E en rekvens p 14 istedenor 16. Tegn det Humantreet vi da r. :,, c 8/ H "",/ Figur 2 Slutt pa oppgavesettet! -3-
Vedlegg til SO131A Algoritmer og datastrukturer 09.12.2003 import java.util..; public claes BinTre private static class Node en indre nodeklasse private Object verdi private Node venstre private Node høyre; private Node(Object verdi) this.verdi z verdi konstruktør class Node private Node rot; private Cornparator c; private int antall; public BinTre(Comparator c) konstruktør rot - null; this.c - c; antall = O; II returnerer treets komparator public Comparator komparator() return Ci } public int antall() return antall; public boolean tom return antall -- O; public boolean legg(object verdi) Node p = rot, q int cmp - Oi while (p - null q = Pi cmp - c.compare(verdi,p.verdi) i it (cmp - O) return alse; P = cmp < O? p.venstre : p.høyre it (rot -- null) rot = new Node(verdi); else it (cmp < O) q.venstre = new Node(verdi else q.høyre = new Node(verdi); antall++; return true; public int dybdecobject verdi kode mangler - skal lages _.4-
public Object slettsisteverdi(> / kode mangler - skal lages public int avstand(object verdil, Object verdi2) II kode mangler - skal lages private class Inordenlterator implements Iterator private Stakk s - new TabellStakk( private Node p; private Node ørst (Node p) II ørste node i treet til p ax' (.; p.venstre!= nulli p = p.venstre) s..legg(p)i rturn Pi c}, private Inordenlterator() i (rot -- null) return; lnn(null); p = ørst(rot); / konstruktør public boolean hasnext() return p..' ; 11., public Object next() II neste er m.h.p. inorden r Object verdi - p.verdi; i (p.høyre!- null) p = ørst(p.høyre); else p = (Node)s.taUt(); II henter ra stakken return verdi; public void remove(} throw new UnsupportedOperationException(); c '; } l Ir class InordenIterator public Iterator iterator return new Inordenlterator } II class BinTre lllll IiII IiII Il?IHIl. HrllltlllllVl1. publj.c class TreTest private static class NodeDybde, private Object verdi private int dybde; -5-
:o l) c private NodeDybde(Object verdi, int dybde) II konstruktør this.verdi - verdi; this.dybde = dybde; ) } I1 class NodeDybde private static class DybdeKomparator implements Comparator private Comparator c; II instansvariabel private DybdeKomparator(Comparator C) this.c - c; J. II konstruktør public int cornpare(object ol, Object 02) II kode mangler - skal lages.l / / class DybdeKompara tor public static BinTre kopi(bintre tre) II kode mangler - skal lages public static void main(string[) args) ( int a - 12,3,31,2,8,16,38,5,11,14,20;33,10,17,23,35}; BinTre tre - new BinTre(new ComparableComparator(»i II lager treet i igut 1 ra oppgave 2 or (int i - O; i < a.length; i++) tre.legglnn(new Integer(a[i BinTre kopitre - kopi(tre); lager en kopi av treet II sjekker at de to trærne har samme nodeantall System.out.println(tre.antall() +" "+ kopitre.antall(»; II sletter siste verdi 5 ganger i det gamle treet or (int i - O; i < 5; i++) tre.slettsisteverdi() II skriver ut det "gamle" treets verdier i inorden or (Iterator i - tre.iterator()i i.hasnext()i ) System.out.print(i.next() + " ")i System.out.println(""); II skriver ut det RnyeR treets verdier i inorden or (Iterator i - kopitre.iterator(); i.hasnext(); System.out.print(i.next() + R R); II Utskrit: II 16 16 II 2 3 5 8 10 11 12 14 16 17 20 II 2 358 10 11 12 14 16 17 20 23 31 33 35 38 } II class TreTest Slutt pa vedlegget -6-