UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 12. desember 2008 Tid for eksamen: 9.00 12.00 Oppgavesettet er på 7 sider. Vedlegg: Tillatte hjelpemidler: INF2220 Algoritmer og Datastrukturer Metode grensesnitt Alle trykte og skrevne Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene. Innhold 1 Hashing (vekt 15%) side 1 2 Binærtre (vekt 15%) side 2 3 Tekstalgoritmer (vekt 20%) side 2 4 Grafer (vekt 20%) side 3 5 Fritekst søk (vekt 30%) side 4 Husk at svarene dine skal begrunnes. Oppgave 1 Hashing (vekt 15%) 1a Hashfunksjoner (vekt 7.5%) Finn to svakheter ved hashfunksjonen gitt under. int hashfunc ( String s, int tablesize ) { int hashvalue =0; for ( int i = 0; i < s. length ( ) ; i ++){ hashvalue += 7 * ( int ) s. charat ( i ) ; return hashvalue % tablesize ; (Fortsettes på side 2.)
Eksamen i INF2220, 12. desember 2008 Side 2 1b Åpen og Lukket Hashing (vekt 7.5%) Forklart kort problemene som kan oppstå ved sletting av elementer når en bruker lukket hashing (åpen adressering). Oppgave 2 Binærtre (vekt 15%) 2a Todeling av elementer (vekt 7.5%) Hvor mange ganger kan en dele tallet N i to før en får en verdi som er mindre eller lik 1? Begrunn svaret. 2b Binærheap (vekt 7.5%) Anta at en binærheap har N elementer, og høyde M. Hvor mange elementer må vi sette inn i heapen for at vi med med sikkerhet kan si at den vil få høyde M + 1? Begrunn svaret. HINT: Hvor mange noder er det på nederste nivå i et komplett binærtre, sammenlignet med resten av treet? Oppgave 3 Tekstalgoritmer (vekt 20%) 3a Boyer Moore (vekt 7.5%) Boyer Moore bruker en int-array som kalles bad-character-shift som har lengde 256, hvorfor er denne av lengde 256? Og hva inneholder den? 3b Huffmankoding (vekt 7.5%) Når vi komprimerer en fil med Huffmankoding, så teller vi opp antall forekomster av hver bokstav i filen, hvorfor gjør vi det? Forklar kort hvordan dette brukes til å generere Huffman koden. 3c Huffmankoding (vekt 5%) Når vi komprimerer en fil med Huffmankoding så lagrer vi binærsekvensene som representerer bokstavene uten noe form for skilletegn. Binær-sekvensene er ofte av forskjellig lengde, hvordan kan vi vite når et tegn slutter og når neste begynner? (Fortsettes på side 3.)
Eksamen i INF2220, 12. desember 2008 Side 3 Oppgave 4 Grafer (vekt 20%) 4a Topologisk Sortering (vekt 5%) F B E D C A Figur 1: Avhengighetsgraf Skriv to lovlige topologiske sorteringer av nodene i Figur 1. 4b Rekursive etterfølgere (vekt 7.5%) Anta at nodene i grafen gitt over er representert ved denne klassen: public class Node { char id ; Set<Node> children ; Node ( char id ) { this. id = id ; children = new HashSet<Node > ( ) ; void reachable ( Set<Node> set ) { // TODO void addchild ( Node n ) { children. add ( n ) ; Implementer funksjonen reachable som legger alle elementene (Nodene) som kan nås fra kall-noden, i mengden Set<Node> set. (Se eksempel). (Fortsettes på side 4.)
Eksamen i INF2220, 12. desember 2008 Side 4 Eksempel Hvis denne funksjonen blir kalt med Node-klasse-instansen til element A så skal alle elementene i grafen bli lagt til mengden set. Hvis funksjonen blir kalt med instansen til element B, så skal elementene B og F bli lagt til i mengden set, dvs. vi legger rekursivt til alle elementer som kan nås fra noden der metoden blir kalt. 4c Sykler (vekt 7.5%) Dersom grafen vår inneholder sykler/løkker vil ikke funksjonen reachable nødvendigvis terminere. Modifiser funksjonen slik at rekursjonen stopper dersom vi kommer til et element som allerede fins i mengden. Oppgave 5 Fritekst søk (vekt 30%) I denne oppgaven skal vi tenke oss at vi lager et fritekst søk for nyhetsartikler. Et fritekst søk er bare et vanlig søk etter en term (ord), slik som en kan gjøre på for eksempel google. For at et fritekst søk skal gå fort må vi preprosessere innholdet vi skal søke i for å lage en indeks. Det er dette som skiller et indeksert søk fra et vanlig søk, at vi har preprosessert all informasjonen det går an å søke i på forhånd. Dvs. google eller andre søkemotorer leter ikke igjennom hele Internet på 0.012 sekunder, men all informasjonen de har indeksert (preprosessert) kan slås opp i på 0.012 sekunder. Hva er en indeks? En indeks er en datastruktur der en raskt kan finne ut om en term (ord) eksisterer i materiale en har indeksert. Dvs. hvis ordet brannbil var tilstede i noen av artiklene vi har indeksert så bør datastrukturen vår kunne gi en rask tilbakemelding på at dette finnes, og hvor vi kan finne det hen. Vi skal starte med å lage en indeks som ofte blir kalt en reversindeks. Navnet kommer av at dette er en mapping mellom termer og de artiklene der termene forekommer, se tabellen under her for et utsnitt av en revers-indeks. Nøkkelord brannbil finanskrise rekordvarme Treff artikkel1, artikkel2, artikkel7, artikkel23, artikkel11 artikkel23, artikkel7 artikkel12, artikkel11, artikkel22 (Fortsettes på side 5.)
Eksamen i INF2220, 12. desember 2008 Side 5 Vi kan med en gang se at ordet eller termen rekordvarme forekommer i artiklene med navn: artikkel12, artikkel11, artikkel22. Vi kan representere en revers-indeks med en HashMap, der nøklene er ordene det går an å søke etter, dvs. ord funnet i en eller flere artikler, og hvor verdiene bare er lister av artikkelnavn. Map<String, LinkedList <String >> index = new HashMap<String, LinkedList <String > >(); /* * mapping fra : * * ord > l i s t e r av artikkelnavn */ Når artiklene er satt inn i datastrukturen index kan vi for eksempel gjøre søk etter enkle termer på denne måten. void search ( String word ) { LinkedList <String > l i s t ; i f ( index. containskey ( word ) ) { System. out. println ( " fant : "+word ) ; l i s t = index. get ( word ) ; for ( String a r t i c l e : l i s t ) { System. out. println ( a r t i c l e ) ; else { System. out. println ( " fant ikke : "+word ) ; 5a Implementer metoden indexarticle (vekt 7.5%) Dere kan anta at artikler på forhånd er blitt konvertert fra sitt originale format (pdf,ps,doc,html... ) til String arrayer. Du kan også anta at HashMapen index (se over) er global i klassen denne metoden implementeres. Du skal nå implementere følgende metode for å legge en ny artikkel inn i indeksen. void indexarticle ( String [ ] articlewords, String articlename ) { /* implementer metoden */ (Fortsettes på side 6.)
Eksamen i INF2220, 12. desember 2008 Side 6 5b Sletting (vekt 7.5%) Vi er også interessert i å kunne slette artikler fra indeksen vår, implementer metoden med signaturen under, som sletter en artikkel fra indeksen. void removearticle ( String articlename ) { /* implementer metoden */ 5c Kompleksitet (vekt 7.5%) Anta at vår indeks (HashMap) har hashet alle ord i indeksen til forskjellige verdier, dvs. kompleksiteten av å finne et ord i HashMapen (index) er lik 1. Anta også at vi har M forskjellige ord i indeksen vår, dvs. index. keyset ( ). s i z e ( ) == M Anta at vi har indeksert N forskjellige artikler, dvs. vi kan få returnert maksimalt N artikler når vi søker på et ord. Hva blir da worst-case kompleksiteten av å slette en artikkel fra indeksen? Forbedret datastruktur Vi prøver å forbedre indeksen vår ved å bytte ut datastrukturen artiklene ligger i (listen), vi velger å legge artiklene våre i et rødsort tree i steden for en liste, dvs. vi legger artikkelnavnene våre i et balansert binærtre. Map<String, TreeSet <String >> index = new HashMap<String, TreeSet <String > >(); /* * mapping fra : * * ord > balanserte bin t r e av artikkelnavn */ 5d Kompleksitet (vekt 7.5%) I denne oppgaven er alt som i spørsmålet over, dvs. vi antar fortsatt at alle ordene har hashet til forskjellig verdier slik at kompleksiteten av å finne en nøkkel er lik 1. Den eneste forskjellen er at vi har (Fortsettes på side 7.)
Eksamen i INF2220, 12. desember 2008 Side 7 byttet ut listene med balanserte binærtre. Hva blir da worst-case kompleksiteten av å slette en artikkel fra indeksen? Lykke til! Metode grensesnitt Her følger en liste av funksjoner dere kommer til å trenge for å gjøre implementasjonsoppgavene. De første tre funksjonene er felles for alle klassene som implementerer java.util.collection interfacet, og sånn sett fins de i både java.util.set og java.util.list, dvs. alle klassene som implementerer liste-interfacet og mengde-interfacet. De neste tre funksjonene tilhører interfacet java.util.map og fins i alle klassene som implementerer dette (java.util.hashmap bl.a.) java. u t i l. Set<E> java. u t i l. List <E> * boolean add (E e ) // add element e * boolean remove ( Object o ) // remove Object o * boolean contains ( Object o ) // i s Object o an element? java. u t i l.map<k,v> * boolean containskey ( Object o ) // i s Object o a key? * V put (K k, V v ) // add key value pair * V get ( Object key ) // f e t c h value based on key * V remove ( Object key ) // remove key value pair