G høgskolen i oslo I Emne: Emnekode: ~ I Faglig veileder: Algoritmer og datastrukturer LO 140 A UlfUttersrud I Gruppe(r): I Eksamensoppgaven IbestAr av: - l Tillatte hjelpemidler: - - Antall sider (inkl. forside og vedlegg): 5 I-Dato: I Eksamenstid: 08.12.2005 9-14 ~ Antall oppgaver: I 3 r--xn tan -y ed1 e gg: l -- - - I Aiie -sk:i=rftlige - bme trykte og håndskrevne, samt alle typer lommekalkulatorer, er tillatt Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn I for løsningen. Avdeling for Ingeniørutdanning. Con Adelersgote 30.0254 Oslo. tlf: 22 45 32 00. faks: 22 4532 05. iu@hio.no
RAd og tips: Bruk ikke for lang tid pa et punkt i en oppgave hvis du Ikke far 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, s~ 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 A la noen punkter st~ helt blanke. TIl og med det ~ demonstrere i en eller annen form at du har forstatt 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 liktl Hvis du skulle trenge en datastruktur eller en metode som hører til java. uti' 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! Oppgave 1 I denne oppgaven skal det lages en prloritetskø ved hjelp aven stakk. Vedlegget inneholder grensesnittene Stakk<T> og Priori tetskø<t>. De viser hvilke metoder en stakk har og hvilke metoder en prioritetskø skal ha. Det er ogsa satt opp et skjelett for klassen StakkPrioritetsKø<T>. Den har en komparator c og en stakk 5 som private InstansvarIabler. Det skal Ikke legges Inn flere Instansvariabler I denne klassen. Verdiene I prioritetskøen er rett og slett de verdiene som stakken 5 Inneholder. Verdiene skal ligge sortert pa stakken 5 med størst verdi øverst. Det skal vi benytte I metodene kikk og taut I klassen StakkPrioritetsKø<T>. En StakkPrioritetsKø<T> er tom hvis stakken 5 er tom og antallet verdier I prioritetskøen er Ilk antallet verdier pa stakken s. Metoden legginn I klassen StakkPrioritetsKø<T> ma kodes slik at stakken 5 er sortert med den største øverst, etter at Innleggingen er ferdig. Dette kan vi f~ til ved ~ ta ut en og en verdi fra stakken 5 og fortløpende lagre dem p~ en lokal hjelpestakk. Vi gjør dette inntil vi finner stedet der den nye verdien skal inn. S~ legges den p~ 5 o~ de verdiene som er lagret p~ hjelpestakken, flyttes tilbake til s. Dermed vil verdiene pa 5 bli sortert. A. Lag kode for metodene kikk, taut, antall og torn I klassen StakkPrioritetsKø<T>. I metodene kikk og taut skal det kastes et unntak hvis det er tomt. B. Lag kode for metoden legginn i klassen StakkPrioritetsKø<T>. Lag gjerne tegninger og kommentarer som viser hvordan du har tenkt at din legglnn-metode skal virke. Oppgave 2 Denne oppgaven handler om generelle binære trær av den typen som diskuteres I kompendiets De/kapitte/5.1. Klassen BinTre<T> er den som er satt opp I Avsnitt 5.1.5. A. Flg. kodebit bygger opp et binærtre. Tabellen p inneholder posisjonstallog tabellen v inneholder verdier (bokstaver/tegn): BinTre<Character> tre - new BinTre<Character>(); o int[ char p = 1,3,6,2,13,7,S,26,27,11,12,lO,21,42}; v - "ABCDEFGHIJKLHNw. tochararray () ; / posisjoner / verdier for int i - O; i < v.length; i++ tre.legginn(p[i),v[i Tegn det ~reet som kodebiten lager. Skriv for hver node nodeverdien Inne I noden og posisjonstallet ved siden av noden. Skriv s~ ut treets nodeverdier i preorden, inorden, postorden og niv~orden. ~-
B. En ny node legges alltid Inn p~ en bestemt posisjon I treet. Da m~ det Ikke finnes noen node med den posisjonen fra før og den nye nodens forelder m~ allerede ligge I treet. Det betyr at det må stilles bestemte krav til posisjonstallenes rekkefølge I posisjonstabellen p. Det første tallet m~ alltid være 1 og for hvert nytt posisjonstall k m~ vi ha at k er større enn 1 og at posisjonstallet til forelderen til k må ligge et sted til venstre for k i tabellen. Lag metoden public static boolean sjekkposisjoner (int [] p). Den skal returnere true hvis tallene I tabellen p oppfyller kravene over og returnere false ellers. Du kan ta som gitt at alle verdiene I posisjonstabellen p er forskjellige. Husk at hvis en node har posisjonstall k der k er større enn 1, så har foreldernoden posisjonstall k/2. De nodene som ligger p~ veien fra (og med) rotnoden og ned til (og med) en bladnode, kalles en hovedgren i treet. Det betyr at et binærtre har like mange hovedgrener som det er bladnoder. Den venstre hovedgrenen er den hovedgrenen som g~r ned til den bladnoden som ligger lengst til venstre av bladnodene. C. Lag metoden public void skrivvenstregren (). Den hører hjemme I klassen BinTre<T>. Den skal skrive ut til konsollet nodeverdiene I den venstre hovedgrenen med en blank mellom hver verdi. Hvis treet er tomt, skal det Ikke skrives ut noe. Hvis en bruker denne metoden pa treet fra oppgavens punkt A, vil utskriften bli: A D G L M N. I resten av Oppgave 2 skal det for hver node utføres en oppgave, dvs. det skal gjøres et kall p~ metoden utføroppgave fra grensesnittet Oppgave<T>, med nodens verdi som parameter. Dvs. hvis p er en node, skal kallet utføroppgave (p. verdi) Inng~. Grensesnittet Oppgave<T> er satt opp i vedlegget. D. lag metoden private void traversernoder (int k, Oppgave<T> o). Den hører hjemme I klassen BinTre<T>. Metoden skal utføre oppgaven p~ alle noder p~ veien fra og med rotnoden og ned til og med den node n som har posisjonstall k. Du kan ta som gitt at det er en node I treet med posisjonstall k. E. Lag metoden public vold traversergrener (Oppgave<T> o). Den hører hjemme i klassen BinTre<T>. Den skal utføre oppgaven p~ alle hovedgrenene i treet. For hver hovedgren skal oppgaven utføres pa alle nodene fra og med rotnoden og ned til og med grenens bladnode. Det er ønskelig at nodene pa den korteste hovedgrenen behandles først, deretter nodene pa den nest korteste hovedgrenen, osv. Hvis det er flere hovedgrener med samme lengde, er det ønskelig at de behandles I rekkefølge fra venstre mot høyre. Hvis treet er tomt, skal det ikke uføres noe. Denne m~ten ~ ga gjennom treet pa vii føre til at oppgaven utføres mange ganger p~ samme node. F.eks. vii oppgaven utføres pa rotnoden like mange ganger som det er bladnoder. Men det skal være slik. Oppgave 3 A. I vedlegget st&r metodene sparter og parter. De hører hjemme i samleklassen Tabell. Metoden parter er den som kalles fra metoden sparter. Metoden sparter brukes blant annet I kvikksortering. Hva blir utskriften n&r flg. programbit utføres: int a = 6,1,9,4,7,15,3,8,5,12,2,11,14,10,13)1 int k - (O + a.length)/2; / midten av tabellen Tabell.sParter(a, k) i Tabell.skriv(a); B. Tegn et komplett binært søketre som inneholder verdiene 7, 2, 15, 3, 12, 5, 20, 17, 8, 4, 14, 10 og 6. Her kan det være lurt ~ tegne et komplett tre uten verdier først. Det m~ ha 3-
plass til de oppgitte verdiene. Deretter legger du Inn verdiene slik at treet blir et binært søketre, dvs. en Inorden traversering vii gl verdiene I sortert rekkefølge. Den minste verdien m~ komme først i inorden, osv. Sett s~ de samme verdiene opp i en rekkefølge slik at hvis vi legger Inn en og en av verdiene i et p~ forh~nd tomt binært søktre, vii treet til slutt bli nøyaktig slik som det komplette treet du tegnet. C. Gitt flg. tegnsekvens: "ABAABBAAABBBC". Den skal komprimeres ved hjelp av LZWteknikken der første ledige tallkode er 256. Hvilke tallkoder vil bil skrevet ut? Slutt pa oppgavesettet! Vedlegg - Algoritmer og datastrukturer - 08.12.2005 / / Grense8ni tt og klasser for Oppgave l public interface Stakk<T> public void legglnn(t t); public T kikk(); public T taut(); public int antall(); public boolean tom(); public void nullstill(); I1 eng: push I1 eng: peek I1 eng: pop I1 eng: slze I1 eng: empty I1 eng: clear public interface prioritetsk0<t> l public void legglnn(t t); public T kikk()i public T taut()i public int antall()i public boolean tom()i public void nullstill() i ) II eng: offer I1 eng: peek II eng: poll II eng: s~ze I1 eng: isempty II eng: clear public class StakkPrioritetsKø<T> implements PrioritetsKø<T> private Stakk<T> s; II en stakk private Comparator<? super T> c; II en komparator public StakkPrioritetsKø(Comparator<? super T> c) this.c ~ Ci s - new TabellStakk<T>() i II konstruktør public void leqqinn(t verdi) public T kikk() ( II kode mangler - akal lages public T taut() public int antall() II kode mangler -.kal lages tf-
public boolean tom) \ public void nullstiut) s. nullstill O, /1 slutt p,f class StakkPrioritetsKø II Et grensesnitt for Oppgave 2 public interface Oppgave<T> public void utføroppgave(t t); r / / Metoder til Oppqave 3A I/verdien i po.slsjon/indeks k brukes som skilleverdi return Pi I returnerer posisjon- til skilleverdien public static int sparter(int[] a, int k) f / bruker hele tabellen return sparter(a,o,a.length-l,k); 'v - o og h - a.lenght-l while (v <- h && arv] < skilleverdi) v++; while (v <- h && skilleverdi <- arb]) h--; J ~ile... (t%i.1e) it (v < h) Tabell.bytt;(a,v++,h--)i else return Vi while (arv] < skilleverdi) V++i while (skilleverdi <- arb]) h--i return parter(a,o"a.lencjth-l,skilleverdi); I. kaller metoden ø~.r Slutt på vedlegget! - -!J