Ordliste. Obligatorisk oppgave 1 - Inf 1020



Like dokumenter
Obligatorisk oppgave 1 INF1020 h2005

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Algoritmer og Datastrukturer

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Obligatorisk oppgave 2 inf

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Obligatorisk oppgave 2 - inf

Kapittel 14, Hashing. Tema. Definere hashing Studere ulike hashfunksjoner Studere kollisjonsproblemet 17-1

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

UNIVERSITETET I OSLO

TOD063 Datastrukturer og algoritmer

Løse reelle problemer

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Løsningsforslag EKSAMEN

Løsnings forslag i java In115, Våren 1998

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

Løsnings forslag i java In115, Våren 1996

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

EKSAMEN. Emne: Algoritmer og datastrukturer

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

UNIVERSITETET I OSLO

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Utførelse av programmer, metoder og synlighet av variabler i JSP

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Kanter, kanter, mange mangekanter

UNIVERSITETET I OSLO

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

INF oktober Dagens tema: Uavgjørbarhet. Neste uke: NP-kompletthet

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

INF1000 Metoder. Marit Nybakken 16. februar 2004

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

Et eksempel: Åtterspillet

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Algoritmer og Datastrukturer

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Algoritmer og Datastrukturer

INF Innleveringsoppgave 6

Obligatorisk oppgave 1 i INF 4130, høsten 2008

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

EKSAMEN med løsningsforslag

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Algoritmer og Datastrukturer

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Datastrukturer for rask søking

INF1010 notat: Binærsøking og quicksort

Oppgaven består av to deler, del A og del B. Alle skal besvare både del A og del B, men det finnes noen valgmuligheter innenfor hver del.

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Gjennomgang av eksamen H99

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

EKSAMEN. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad.

UNIVERSITETET I OSLO

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

UNIVERSITETET. Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Hashliknende strukturer.

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Obligatorisk oppgave 1 i INF 4130, høsten 2009

Høst Øving 5. 1 Teori. 2 Månedskalender. Norges teknisknaturvitenskapelige universitet Institutt for datateknikk og informasjonsvitenskap

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Algoritmeanalyse. (og litt om datastrukturer)

Dagens tema INF1010 INF1010 INF1010 INF1010

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

HØGSKOLEN I SØR-TRØNDELAG

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

Transkript:

Ordliste. Obligatorisk oppgave 1 - Inf 1020 I denne oppgaven skal vi tenke oss at vi vil holde et register over alle norske ord (med alle bøyninger), og at vi skal lage operasjoner som kan brukes til f. eks. å sjekke om ord er stavet riktig. Ordene som skal stå i registeret blir oppgitt på en fil, og første del av oppgaven vil være å lese inn filen og organisere registeret. En komplett liste av alle norske ord med alle bøyninger inneholder nærmere en million ord. For at vårt register skal få en overkommelig størrelse skal vi derfor bare ta med et utsnitt av registeret (ikke mer enn 15 000 ord), men dette vil være komplett fra et gitt ord til et annet i den sorterte rekkefølge. Programmet skal imidlertid ikke begrenses til denne input-filen. De aktuelle ordene ligger i filen ordbok1.txt på kurssiden. Antall ord på fila overgår ikke femten tusen, og de kommer i helt tilfeldig rekkefølge i forhold til sorteringsrekkefølge etc. Ordene ligger fortløpende, med en eller flere blanke (eller linjeskift) mellom hvert ord. Linjelengden er ikke over 80 tegn. Alle ordene er i små bokstaver, og vi antar også at ord blir gitt fra brukeren i små bokstaver. Det siste skal imidlertid sjekkes før oppslag starter. Et oppslag i registeret får man gjort ved å oppgi et ord, og man skal da i første omgang få vite om ordet står i registeret eller ikke. Dersom man får negativt svar skal man i stedet få en liste over liknende ord i registeret. En nøyere definisjon av hva som skal regnes som liknende ord er gitt under. MERK: I denne oppgaven blir man påtvunget en bestemt implementasjon (se under), og man kan, som alltid, diskutere om akkurat denne implementasjonen ville være den beste for nettopp det registeret, den datamengden og den dynamikken vi arbeider med her. Bakgrunnen for at vi har valgt denne implementasjonen er imidlertid dels at vi ønsket å anvende flere av de teknikker som er sentrale i pensum, og dels at denne implementasjons-måten, eller varianter av den, blir mer meningsfylt om man har et større register, der det kanskje også løpende kan komme tillegg til registeret. Med en million ord ville det f.eks. være rimelig å holde dataene på sekundær-lager (gjerne da som et B-tre i stedet for som et binært søketre), og da ville hash-mekanismen som vi skal bruke ha en mye viktigere funksjon. Innlesing og lagring av ordene Ordene skal lagres i et vanlig binært søketre, der nodene har en vanlig tekst-variabel. Vi skal anta at ordene kommer fra fila i så tilfeldig orden at de kan settes inn på enkleste vis uten at treet blir spesielt ubalansert. Etter at at treet er bygget opp med ordene fra fila, skal det foretas en liten endring: Ordet evneveik skal først tas ut av treet og deretter settes inn i treet igjen. Dette krever at dere implementerer en metode for uttak av det binære søketreet. Pass på at treet fremdeles er et binært søketre etter uttak av et ord! Når vi skal lete etter liknende ord vil vi komme til å slå opp mange ord i registeret, og bare få av dem vil gi tilslag. For å effektivisere dette (ved hurtig å kunne få en pekepinn om et gitt ord står i registeret) skal vi også lage en hash-struktur, der vi for hver hash-indeks bare har angitt om det finnes ord i tabellen med denne hashindeksen (men ikke hvilket ord det er, og om det eventuelt er flere). For hver hashindeks trenger man derfor bare en boolsk verdi, som ideelt sett 1

kunne implementeres som et bit i maskinen (men se under). Hashlengden skal her være omtrent ti ganger så stor som antall ord i registeret, og om vi slår opp på et ord som ikke er i registeret vil vi da i ni av ti tilfeller umiddelbart få vite at ordet ikke er å finne. Denne hash-tabellen ville i et virkelig tilfelle vært implementert slik at vi bare brukte ett bit på hver indeks (slik at vi fikk 8 indekser i hver byte, og at tabellen for f.eks. en million ord altså ville kreve omkring 1,2 Mbyte). Vi skal imidlertid implementere den som en boolean array av passelig lengde (som normalt trenger en byte til hver indeks). I vårt tilfelle skal denne altså være omtrent 150 000 lang, og en viktig del av oppgaven blir å finne en hash-funksjon som for vanlige ord (oftest på fra tre til ti bokstaver) sprer godt over hele området på 150 000 indekser. Den bør også være enkel, med tanke på raskt oppslag. Selv om første bokstav hos oss bare vil ha én eller noen få verdier, skal hash-funksjonen lages som om vi hadde en komplett ordliste. Når man er ferdig med innlesningen skal man skrive ut litt statistikk på hvor bra lagringen av ordene ble. Følgende skal rapporteres: For treet: Dybden av den dypeste noden i treet (vi følger læreboka og sier at roten har dybde null) Hvor mange noder det er på hver dybde fra null til største dybde Hva er den gjennomsnittlige dybde over alle nodene Du kan anta at den største dybden ikke blir større enn 100, og kan enten gjøre denne registreringen mens du setter inn, eller i et eget gjennomløp etter hele innsettingen. I tillegg skal det rapporteres hva som er det første (alfabetisk) og siste ordet i ordlisten. For hashingen: Angi hvor mange hashindekser som er brukt, satt opp mot antall ord i registeret. Del hashindeksene inn i intervaller med n indekser i hvert. Tell antall brukte indekser i hvert intervall. Angi hvor mange intervaller som har b brukte indekser, for alle b fra 0 til n. Bruk n=30, som altså i gjennomsnitt skulle gi rundt tre brukte indekser per intervall. (Hva som er fornuftige tall og fordelinger her trengs det statistikk for å ha kvalifiserte meninger om, men man vil vel ha en intuitiv idé om hva som er helt vilt ). Bruk av registeret Med liknende ord somordxskalvimene: Ord som er lik X, bare at to bokstaver ved siden av hverandre er byttet om. Ord som er lik X, bare at én bokstav er skiftet ut med en annen. Ord som er lik X, bare at én bokstav er fjernet. Ord som er lik X, bare at det er lagt til én bokstav foran, bak eller innimellom. 2

Det å undersøke om ett gitt ord X er med i registeret skal vi kalle et oppslag. Dette gjøres altså ved først å beregne hashindeksen til X, og å slå opp på denne i hashtabellen. Om det her er angitt at intet ord har denne indeks kan man umiddelbart svare at X ikke finnes. I motsatt fall må man også søke etter X i søketreet. Om det finnes her svarer man positivt, i motsatt fall negativt. Når brukeren ber om å få vurdert et ord X, skal det dermed foregå slik: Først gjør man et oppslag på X, og om svaret er positivt kommer man med et bekreftende svar, og er ferdig. I motsatt fall skal man systematisk generere alle liknende ord av X, gjøre oppslag på alle disse og skrive ut de som gir positivt svar. I de tilfellene der det opprinnelige ordet ikke var i registeret (og man derfor gjør gjentatte oppslag på liknende ord ) skal man også skrive ut en liten statistikk til slutt over hvordan de enkelte oppslagene forløp. Man skal her angi tre tall: Antall oppslag som gav positivt svar Antall oppslag som gav negativt svar, men som passerte hash-testen Antall oppslag som gav negativt svar, og som ble stoppet i hash-testen Om hash-funksjonen er godt laget skulle det siste tallet være omtrent ni (ti?) ganger så stort som det midterste. Innlesning og utskrift Det skal ikke legges stor vekt på vakker innlesing/utskrift etc., men det skal testes at det ordet brukeren vil ha vurdert består av bare små bokstaver. En enkel variant kan være at systemet skriver ut Ord til vurdering: eller liknende hver gang den er ferdig med forrige ord. Brukeren angir så et ord, som avsluttes med Return. Dersom ordet bare er tegnet / kan dette passelig bety avslutning. Forskjellige feilsituasjoner får man behandle på en rimelig måte, uten at det helt store forlanges. Noen forslag til detaljer i implementasjonen Merk at også de norske bokstavene æ, ø og å skal være med, både når man godkjenner små bokstaver, og når man skal skifte ut hver bokstav i et ord med alle andre muligheter. Dette går greit i Java, merk at man kan sammenligne char-variable direkte for likhet, <,..osv (hvis man trenger det). Vi viser også til det rikholdige settet av metoder i classen Character. F-eks vil følgende programbit skrive ut Bingo. char c= å, b = b, a = a ; if (Character.isLetter(c) & b < c & b >= a) { System.out.println("Bingo"); } else { System.out.println("Huff"); } 3

For å kunne gå gjennom alle bokstaver på en behagelig måte kan det være greit å ha en char[] bnr = new char[29], som fast er fylt med bokstavene fra a til å. String- og StringBuffer klassene i Java er prima til visse formål, mens det til andre ting kan bli litt fiklete. Når det gjelder det å generere alle liknende ord vil nok mange mene at det siste er tilfelle, og vi anbefaler derfor at man holder en char[] ord = new char[maxlengde]; og en heltalls-variabel ordlengde som angir det ordet man holder på med (med maxlengde f.eks. lik 50). Muligens trenger man et par slike arrayer for å kunne arbeide fritt. Denne array-formen av et ord bruker man så til å holde det aktuelle ordet i alle andre tilfeller enn når det lagres i treet, altså når man leser inn ett og ett fra fila, når man skal beregne hash-indeks for et ord, og man må også lage en liten rutine som skriver ut et ord på en slik form. Det å få det over på tekst-form når man skal arbeide i treet kan man legge inn i en metode, f.eks. ved at alle tre-oppslag bruker følgende metode: boolean treoppslag(char[] ord, int ordlengde, boolean settinn) { String T = new String(ord); // Let opp om det finnes node med verdi T i treet // (ikke rekursivt!) // Om T ikke fantes og settinn er TRUE, // sett inn ny node med T. } // Om T ikke fantes returneres FALSE ellers TRUE Man kan selvfølgelig også lage to metoder av dette, én for innsetting, og én for rent oppslag. Det å komponere en rimelig metode for beregning av hash-indeks er altså en del av oppgaven, men det er antakeligvis greit å basere den på at verdien av en char-variabel direkte kan finnes ved å sette en int lik denne. F.eks vil følgende programutsnitt skrive ut int-verdien av K er: 75 : char d= K ; int i = d; System.out.println("int-verdien av K er: " + i); Et siste råd angående uttestingen: Det å implementere alle varianter av liknende ord kan være litt fiklete. Implementer derfor bare én enkel variant av dette først, f.eks. bare den med å skifte ut én og én bokstav med en annen. Når man så har fått alt til å virke, kan man til slutt bygge ut med de andre variantene av liknende ord (og det er jo også mulig å legge inn flere varianter enn det oppgaven foreskriver). 4

Innlevering Oppgaven skal løses individuelt. Frist for levering: fredag 29. september kl 16. Oppgaven skal leveres til den gruppen du normalt går på. (Hvis du ikke går på noen gruppe: den gruppen du er oppmeldt på.) Du skal levere: Kildekoden. Testutskrift på en fil kalt utskrift.txt som viser: De forskjellige statistikkene Sjekking av ordene: etterfølger eterfølger etterfolger etterfølgern tterfølger For at oppgaven skal bli vurdert, må den kompilere og kjøre i et terminalvindu på en av instituttets unix-maskiner, dvs. at brukergrensesnitt må være tekstbasert (uten vinduer, applet, cgi eller annen form for GUI). Kildekoden må være godt dokumentert der den ikke er selvforklarende. Hvis du er i tvil om hva som er nødvendig av kommentarer, spør gruppelæreren din. Besvarelsen skal leveres per e-post til gruppelærer. Du skal sende en tar bal som inneholder en katalog kalt <brukernavn>. I denne katalogen skal det ligge.java filer med kildekoden til besvarelsen, samt andre filer som trengs for å kompilere og kjøre den. Ikke lever.class filer, gruppelærerne ønsker å kompilere den selv. Hvis du har tilleggsinformasjon til gruppelæreren om bevarelsen, så skriv dette i en README.txt fil som også legges i denne katalogen. Er du i tvil om innleveringsformatet, ta kontakt med gruppelæreren din eller en termvakt! 5