INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 13: Eksamensgjennomgang Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 1 / 22
Generelle Tips Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 2 / 22
Generelle Tips Du blir bedømt etter hva du viser at du kan Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 2 / 22
Generelle Tips Du blir bedømt etter hva du viser at du kan Du må begrunne svar Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 2 / 22
Generelle Tips Du blir bedømt etter hva du viser at du kan Du må begrunne svar Du må ikke skrive av bøker eller foiler Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 2 / 22
Generelle Tips Du blir bedømt etter hva du viser at du kan Du må begrunne svar Du må ikke skrive av bøker eller foiler Gjør de enkleste oppgavene først Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 2 / 22
Hashfunksjoner Finn to svakheter ved hashfunksjonen gitt under. int hashfunc ( String s, int t a b l e S i z e ){ int hashvalue =0; for ( int i = 0; i < s. length ( ) ; i ++){ hashvalue += 7 ( int ) s. charat ( i ) ; return hashvalue % t a b l e S i z e ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 3 / 22
Hashfunksjoner Finn to svakheter ved hashfunksjonen gitt under. int hashfunc ( String s, int t a b l e S i z e ){ int hashvalue =0; for ( int i = 0; i < s. length ( ) ; i ++){ hashvalue += 7 ( int ) s. charat ( i ) ; return hashvalue % t a b l e S i z e ; 1. Funksjonen er kommutativ dvs. hashfunc( abc ) == hashfunc( acb ) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 3 / 22
Hashfunksjoner Finn to svakheter ved hashfunksjonen gitt under. int hashfunc ( String s, int t a b l e S i z e ){ int hashvalue =0; for ( int i = 0; i < s. length ( ) ; i ++){ hashvalue += 7 ( int ) s. charat ( i ) ; return hashvalue % t a b l e S i z e ; 1. Funksjonen er kommutativ dvs. hashfunc( abc ) == hashfunc( acb ) 2. Funksjonen gir alt for lave verdier, en ganger bare int verdi med 7 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 3 / 22
Åpen og Lukket Hashing Forklart kort problemene som kan oppstå ved sletting av elementer når en bruker lukket hashing (åpen adressering). Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 4 / 22
Åpen og Lukket Hashing Forklart kort problemene som kan oppstå ved sletting av elementer når en bruker lukket hashing (åpen adressering). A En kan ende opp med å måtte traversere hele hashtabellen på leiting etter elementer, fordi en tom tabell-celle betyr ikke nødvendigvis at ingenting har hashet til denne verdien. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 4 / 22
Todeling av elementer 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. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 5 / 22
Todeling av elementer 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. A log 2 (N) siden dette er revers funksjonen til 2 N, dvs. log 2 (2 N ) = N 2 (log 2(N)) = N Dvs. 2 N = {1, 2, 4, 8, 16, 32,.. dobler 1, og log 2 (N) sier hvor mange ganger vi kan halvere N før vi er tilbake til 1. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 5 / 22
Todeling av elementer A En kan evt. sette opp ligning og løse denne N 2 x 1 (1) N 2 x (2) log 2 (N) log 2 (2 x ) (3) log 2 (N) x log 2 (2) (4) log 2 (N) x (5) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 6 / 22
Binærheap 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? Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 7 / 22
Binærheap 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? A Minst N, siden siste nivå i et komplett binærtre innholder like mange noder som resten av treet + 1, dvs. worst-case tilfelle er når nederste nivå i treet bare har 1 node, da vil N - 1 nye noder fylle opp siste nivå, og N vil gi oss en node på neste nivå. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 7 / 22
Boyer Moore 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? Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 8 / 22
Boyer Moore 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? A bad-character-shift.length 256 fordi vi antar at bokstavene våre er 8-bit characters, (2 8 = 256) vi lager en shift-verdi for alle mulige characters i nålen dvs. hvor langt vi kan flytte nålen fram basert på missmatch i siste element, siden vi matcher bakfra. Boyer Moore vil ikke fungere for UTF-8 dersom spesielle tegn blir brukt, og vil aldri fungere for UTF-16, eller andre tegnsett som bruker mer enn 8-bits enkoding, selv om det fins spesielle versjoner av Boyer Moore for disse.. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 8 / 22
Huffmankoding 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. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 9 / 22
Huffmankoding 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. A 1. Grunnen til at vi teller opp forekomster er fordi vi vil bruke den korteste bit-sekvensen til å lagre den bokstaven som forekommer oftest. 2. Vi bygger et binærtre av alle forekomstene, der vi slår sammen noder basert på frekvens. de nodene som forekommer oftest vil havne høyest opp i binætreet (og sånn sett få kortest binær-representasjon) mens de som opptrer sjelden vil få lengre sekvenser. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 9 / 22
Huffmankoding Når vi komprimerer en fil med Huffmankoding så lagrer vi binær-sekvensene 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? Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 10 / 22
Huffmankoding Når vi komprimerer en fil med Huffmankoding så lagrer vi binær-sekvensene 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? A Bitsekvensene som brukes har unik start, fordi de alle er løvnoder i et binætre, dvs. det fins ikke to bit-sekvenser med samme start hvor den ene er lenger enn den andre. sånne binærtre bli kalt TRIES, dvs. binætre som kun har verdier i løvnodene. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 10 / 22
Topologisk Sortering F E B D C A Skriv to lovlige topologiske sorteringer av nodene. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 11 / 22
Rekursive etterfølgere Anta at nodene i grafen gitt over er representert ved denne klassen: public c l a s s Node{ char id ; Set<Node> c h i l d r e n ; Node( char id ){ t h i s. id = id ; c h i l d r e n = new HashSet<Node >(); void reachable ( Set<Node> set ){ // TODO void addchild (Node n){ c h i l d r e n. add (n ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 12 / 22
Rekursive etterfølgere Implementer funksjonen reachable som legger alle elementene (Nodene) som kan nås fra kall-noden, i mengden Set<Node> set. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 13 / 22
Rekursive etterfølgere Implementer funksjonen reachable som legger alle elementene (Nodene) som kan nås fra kall-noden, i mengden Set<Node> set. A void reachable ( Set<Node> set ){ set. add ( t h i s ) ; for (Node n : c h i l d r e n ){ n. reachable ( set ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 13 / 22
Sykler 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. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 14 / 22
Sykler 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. A void reachable ( Set<Node> set ){ i f ( set. contains ( t h i s )){ return ; set. add ( t h i s ) ; for (Node n : c h i l d r e n ){ n. reachable ( set ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 14 / 22
Fritekst søk Denne oppgaven omhandler et fritekst søk og bygging av en revers-indeks. En revers-indeks er en datastruktur der du ut ifra et søkeord, kan finne ut hvilke artikler dette ordet forekommer. Map<String, LinkedList <String >> index = new HashMap<String, LinkedList <String >>(); / mapping f r a : ord > l i s t e r av artikkelnavn / Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 15 / 22
Fritekst søk Det blir også gitt et eksempel på hvordan et søk kan implementeres når en har en revers-indeks. void search ( String word ){ LinkedList <String > l i s t ; i f ( index. containskey ( word )){ System. out. p r i n t l n ( fant : +word ) ; l i s t = index. get ( word ) ; for ( String a r t i c l e : l i s t ){ System. out. p r i n t l n ( a r t i c l e ) ; e l s e { System. out. p r i n t l n ( fant ikke : +word ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 16 / 22
Fritekst søk - implementer indexarticle 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 i n d e x A r t i c l e ( String [ ] articlewords, String articlename ){ / implementer metoden / Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 17 / 22
Fritekst søk - implementer indexarticle A void i n d e x A r t i c l e ( String [ ] articlewords, String articlename ){ LinkedList <String > l i s t ; for ( String word : articlewords ){ i f ( index. containskey ( word )){ l i s t = index. get ( word ) ; i f (! l i s t. contains ( articlename )){ l i s t. add ( articlename ) ; e l s e { l i s t = new LinkedList <String >(); l i s t. add ( articlename ) ; index. put (word, l i s t ) ; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 18 / 22
Fritekst søk - sletting av artikler 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 / Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 19 / 22
Fritekst søk - sletting av artikler A void removearticle ( String articlename ){ LinkedList <String > l i s t ; Set<String > keys = index. keyset ( ) ; for ( String key : keys ){ l i s t = index. get ( key ) ; i f ( l i s t. contains ( articlename )){ / optional / l i s t. remove ( articlename ) ; / optional / Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 20 / 22
Fritekst søk - kompleksitet 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? Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 21 / 22
Fritekst søk - kompleksitet 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? A O(N, M) = N M Vi har M nøkler, alle disse kan gi oss lister med N elementer, og vi må leite i hele listen etter vår artikkel, dvs. vi må leite i lister som er maksimalt N lange, M ganger. Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 21 / 22
Fritekst søk - kompleksitet Vi prøver å forbedre indeksen vår ved å bytte ut datastrukturen artiklene ligger i (listen), vi velger å legge artiklene våre i et rød-sort 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 f r a : ord > balanserte bin tre av artikkelnavn / Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 22 / 22
Fritekst søk - kompleksitet Vi prøver å forbedre indeksen vår ved å bytte ut datastrukturen artiklene ligger i (listen), vi velger å legge artiklene våre i et rød-sort 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 f r a : ord > balanserte bin tre av artikkelnavn / A O(N, M) = M log 2 (N) Her er da har vi fortsatt M nøkler, men å finne artikkelen vår i disse balanserte binærtreene har en maksimal kompleksitet på log 2 (N) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 13 22 / 22