G høgskolen i oslo Emne: Algoritmer og datastrukturer Emnekode: 80131A Faglig veileder: UlfUttersrud Gruppe(r) : Dato: 09.12.2004 Eksamenstid: 9-14 Eksamensoppgaven består av: Tillatte hjelpemidler Antall sider (inkl. forsiden): 3 Antall oppgaver 4 Antall vedlegg: 1 (2 sider) Alle skriftlige hjelpemidler - både trykte og håndskrevne. er tillatt Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle nklarheter oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn for løsningen. Råd og tips: Bruk ikke for lang tid på et punkt i en oppgave hvis du ikke får det til innen rimelig tid. Gå isteden videre til neste punkt. Hvis du i et senere punkt far bruk for det du skulle ha laget i et tidligere punkt, kan du fritt 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 å la noen punkter stå helt blanke. Til og med det å demonstrere i en eller annen form at du har forstått 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. Alle de 10 bokstavpunktene teller likt! Hvis du skulle trenge en datastruktur eller en metode som hører til java.util eller er laget i undervisningen, kan du fritt bruke det uten å måtte lage det selv. Men du bør kommentere at du gjør det! 1/ I f.- f-
Oppgave 1 A) Lag metoden public static int[] ffnn(int[] a, int verdil, int verd/2) der tabellen a på forhgnd er sortert stigende. Den kan inneholde Ilke verdier. Metoden skal returnere en inttabell som Inneholder I sortert rekkefølge nøyaktig de verdiene fra a som er større enn eller Ilk verdilog mindre enn eller Ilk verd/2. Verdiene verdilog verdi2 kan, men behøver ikke ligge i tabellen a. Hvis det ikke finnes slike verdier i a (dvs. verdier som er større enn eller lik verdilog mindre enn eller lik verdi2), returneres en tom tabell. Kravet er at metoden skal virke, men for å f~ topp score mg løsningen være effektiv. Eksempel: Hvis a Inneholder verdiene 2, 3, 5, 5, 7,8, 10, 12, 13 skal kallet ffnn(a,s,9) returnere en tabell som Inneholder S, S, 7, 8. B) Gitt tallene 5, 15, 10, 20, 17, 19, 18 og 22. Legg dem inn forløpende I et pa forhand tomt rød-svart tre og tegn det treet du tar n~r alle er lagt Inn. Legg s~ de samme verdiene fortløpende Inn I et p~ forhand tomt 2-3-4 tre og tegn det treet du f~r nar alle er lagt Inn. Bruk Innleggingsalgoritmen slik den er beskrevet i kompendlet. Gjør sa 2-3-4 treet om til et rød-svart tre og tegn treet. Bruk konsekvent Forme/2a fra kompendlet nar du "oversetter" en 2-3-4 node med to verdier til to node r I det rød-svarte treet. Oppgave 2 En prioritetskø skal organiseres som en usortert pekerkjede. Det betyr at vi m& lete gjennom hele pekerkjeden for & finne den som har høyest prioritet (dvs. den største verdien). Men innlegging av verdier blir lett siden nye verdier kan legges helt fø rst I pekerkjeden. I vedlegget er det satt opp et skjelett' for klassen ListePrioritetsKø. Den inneholder c/ass Node som en lokal klasse. Det skal Ikke legges inn flere instansvariabler I c/ass ListePrioritetsKø og c/ass Node enn de som allerede er satt opp. Klassen UstePrioritetsKø er generisk. En komparator brukes til sammenligningene. A) Lag metoden public void legglnn(object verdi). Den skal legge parameterverdien verdi Inn i en ny node og denne skal plasseres helt først I pekerkjeden. Prioritetskøen er tom hvis pekeren hode er nu". Lag metoden public boolean tom(). Klassen Inneholder Ingen antall-variabel. Dermed m~ pekerkjeden traverseres og nodene telles opp for at vi skal kunne finne antallet verdier I prioritetskøen. Lag metoden public Int antallq. Den skal returnere antallet verdier. B) Lag metoden public Object kikk(). Den skal returnere den verdien i prioritetskøen som har høyest prioritet (størst verdi). Hvis det er flere med samme høyeste prioritet er det likegyldig hvilken av dem som returneres. Lag metoden public Object taut(). Den skal returnere og fjerne fra prioritetskøen den verdien som har høyest prioritet (størst verdi). Hvis det er flere med samme høyeste prioritet er det likegyldig hvilken av dem som returneres (og fjernes). Oppgave 3 I vedlegget er det satt opp en datastruktur for et binært søketre (et sortert binærtre). Klassen heter BinTre. En konstruktør og metodene /egglnn og tom er ferdigkodet. Det er tillatt med Ilke verdier I treet. Det skal ikke legges inn flere Instansvariabler i c/ass B/n Tre og c/ass Node enn de som allerede er satt opp. A) Lag metoden public Object finnmaks(). Den skal returnere treets største verdi. Hvis treet er tomt skal metoden returnere nu". B) Metoden public Object finn(object verdi) har verdi som parameterverdi. Metoden skal returnere verdi hvis den finnes i treet og returnere den verdien i treet som kommer rett etter verdi I Inorden hvis verdi ikke finnes. Hvis verdi er større enn største verdi i treet skal metoden returnere nu". Lag metoden. C) Lag metoden public Object[l finn(object ver~il;'object verdi2). Metoden skal returnere -ai.;;.:
en Object-tabell som inneholder I sortert rekkefølge nøyaktig de verdiene I treet som er større enn eller lik verdilog mindre enn eller lik verdi2. Verdiene verdilog verdi2 kan, men behøver ikke ligge I treet. Hvis det Ikke finnes slike verdier I treet (dvs. verdier som er større enn eller Ilk verdilog mindre enn eller Ilk verdi2), returneres en tom tabell. Kravet er at metoden skal virke, men for ~ f~ topp score m~ løsningen være effektiv. Hvis du finner det vanskelig ~ f~ returnert de aktuelle verdiene som en tabell, vil du kunne f~ noe uteiling her hvis du I stedet f~r skrevet dem ut til skjermen. Du vii ogs~ kunne f~ noe utelling hvis du f r ut de rette verdiene uten at de er sortert. Oppgave 4 / A) Skriv ut nodeverdiene i binærtreet I FIgur 1 I preorden, Inorden, postorden og omvendt niv~orden. Omvendt niv~orden betyr nlv~ for nlv~ fra det øverste (O-te) nlv~et og nedover og fo~hvert nlv~ fra høyre mot venstre. B) Gitt flg. frekvensfordeling for tegnene A, B, C, D, E og F: ~ Frekvens' Figur 1 Tegn det treet som Huffmans algoritme gir for denne frekvensfordelingen. Tegn deretter det tilhørende kanoniske treet. Sett til slutt opp de bitkodene som det kanoniske treet (se avsnitt 5.4.7 og 5.4.8 I kompendiet) gir for tegnene. C) Et binærtre med positive hele tall som nodeverdier, vii være et Huffmantre hvis a) treet har minst 3 noder, b) treet er fullt, c) nodeverdien I hver Indre node er Ilk summen av verdiene i nodens to barn og d) nodeverdlene.ier avtagende I omvendt niv~orden. Hvis vi tilordner et tegn til hver bladnode I et slik tre, vil treet bli Huffmantreet til frekvensfordelingen gitt av bladnodeverdiene. Treet I Figur 1 er et eksempel p~ et tre som oppfyller kravene a), b), c) og d). Vi tenker oss at metoden private boolean erhuffmalj(node rot) ligger I en eller annen BinTre-klasse der den lokale nodeklassen ser slik ut: private static class Node private int verdi; private Node venstre, høyre; Parameteren rot er en peker til rotnoden i et binærtre der nodeverdiene garantert er positive tall. Metoden skal returnere true hvis treet oppfyller kravene a), b) c) og d) over og returnere false ellers. Lag metoden. Du bestemmer selv om du vii lage egne hjelpemetoder. Slutt pl oppgavesettet! 'Tegn A ~BIC D :;.J!- 12 3 2 7 15r4-3-
Vedlegg (2 sider) Algoritmer og datastrukturer - 09.12.2004 public class ListePrioritesKø implements PrioritetsKø private static final class Node private Object verdi; private Node neste; private Node(Object verdi, Node neste this.verdi = verdi; this.neste = neste; II class Node private Node hode; private Comparator c; p~lic ListePrioritesKø(Comparator C this.c = Ci hode = null; public void legginn(object verdi / kode mangler - Skal lages public Object kikk). public Object taut(). ~lic boolean tom () l I kode mangler - skal lages ~lic int antall() public void nu1.1sti!1() hode = null;. II class ListePrioritesKø IltltHilLIII/11 Illflll '111/flliff/
public class BinTre II et binært søketre private static final class Node II lokal nodeklasse private Object verdi; private Node venstre, høyre; private Node(Object verdi) this.verdi - verdi; / konstruktør I1 class Node private Node rot; private Comparator comp; I1 peker til rotnoden I1 en komparator public BinTre(Comparator c rot - null; comp = c )' II konstruktør public void legginn(object verdi) Node p = rot, q - null; int cmp = O; while (p!- null) J q ~ p; II q skal være forelder til p cmp = comp.compare(verdi,p.verdi); II bruker komparatoren p = cmp < O? p.venstre : p.høyre; II flytter p ii (q =- null) rot = new Node(verdi); else ii (cmp < O) q.venstre = new Node(verdi); else q.høyre - new Node(verdi); public boolean tom() return rot == null; public Object finnmaks() kode mangler - skal lages public Object finn(object verdi f public Object finn (Object verdi!, Object verdi2) II class BinTre 2