Datastrukturer og algoritmer

Henning Christiansen

 

Opgave til l¿sning ved ¿velserne 10. september 2002.

 

Opgavens eksempel er en simpel form for datamining pŒ tekstfiler baseret pŒ opt¾lling af sekvenser af ord. FormŒlet med opgaven er at diskutere og arbejde med, hvordan de begreber det handler om kan oms¾ttes til et fornuftigt klassihierarki og et fornuftigt Java-program.

 

 

 

Sp¿rgsmŒl 1

 

Der skal designes og implementeres en klasse til at repr¾sentere ord; kald den class word. Det g¾lder her, at vi vil undgŒ at repr¾sentere hver forekomst af en tekststreng mange gange. I stedet repr¾senteres hvert ord ved et heltal: Derved bliver sammenligning af ord langt mere effektivt, dvs. at en ÒequalsÓ metode kan implementeres ved at sammeligne to tal i stedet for at t¾lle sig ned gennem en streng.

 

Anbefalet strategi: Klassen word har en hukommelse af de ord, vi har set indtil nu. Hvert ord tildeles en unikt nummer n. Ud fra n kan vi finde tilh¿rende tekststreng

 

Eksempel:

 

new word(ÒsildepostejÓ)

 

Der oprettes et objekt; hvis ÒsildepostejÓ er registreret allerede, sŒ med den n-v¾rdi som h¿rer til ÒsildepostejÓ; ellers registreres ÒsildepostejÓ det n¾ste ubrugte nummer.

 

NB: Vi ved godt, at det ikke er s¾rligt effektivt at s¿ge sekventielt gennem en usorteret r¾kkef¿lge, men fidusen ved et godt struktureret program er, at vi altid kan udskifte den del af programmet, nŒr vi en gang har l¾rt om strategier til effektiv lagring og genfinding.

 

ImplementŽr klassen word med konstruktorer, equals, og toString-metoder. Benyt ArrayList til hukommelsen.

 


Sp¿rgsmŒl 2

 

Klassen word skal bruges i et program, der opt¾ller antallet af gange ord eller sekvenser af ord forekommer i en tekst. Vi s¾tter en gr¾nse pŒ sekvenser op til 4 ord, altsŒ, vi er interesserede i at t¾lle antal gange en sekvenser af l¾ngde 1 (svarende til ord), og af l¾ngde 2, 3 og 4. For eksemplet Òa b c d b c d a aÓ svarer det til f¿lgende:

 

a:         3                      c:         2                      d b c d: 1

a b:      1                      c d:      2                      b c d a: 1

a b c:    1                      c d b:   1                      c d a:    1

a b c d: 1                      c d b c: 1                      c d a a: 1

b:         2                      d:         2                      d a:      1

b c:      2                      d b:      1                      d a a:    1

b c d:   2                      d b c:   1                      a a:       1

b c d b: 2

 

Dette giver tydeligvis alt for meget information, sŒ vi s¾tter en nedre gr¾nse pŒ,

hvor mange gange ord en sekvens skal forekomme f¿r det er interessant; s¾tter vi den til 3

bliver der i eksemplet ovenfor kun sekvensen ÒaÓ tilbage (men vi er jo n¿dt til at t¾lle dem alle med fra starten og derefter tynde ud).

 

Skriv klasser til at repr¾sentere sekvenser og t¾llev¾rk. Benyt igen ArrayList (vel vidende at det ikke er det mest effektive i verden) til hukommelsen.

DiskutŽr hvad der er mest hensigtsm¾ssigt:

Žn klasse for samtlige sekvenser eller en overklasse med fire underklasser.

 

Vedlagt link til en fil med ÒDen grimme ¾llingÓ i engelsk overs¾ttelse, kun med smŒ bogstaver og alle punktuationstegn fjernet, og filen slutter med ordet ÒendoffileÓ.

Brug ovenstŒende til at skrive et program som opt¾ller og udskriver alle sekvenser som forekommer mere end fire gang.

 

Sp¿rgsmŒl 3

 

Indenfor den type tekstprocessering udskiller man ofte en gruppe ord kaldet stopord (en lidt misvisende betegnelse). Stopord er ord, som i sig selv ikke b¾rer meget betydning, men blot klistrer andre ord sammen. F.eks. ÒinÓ, ÒonÓ, ÒanÓ.

 

Vedlagt link til en fil med stopord, som slutter med ordet endoffile.

 

Diskutere, hvordan man kan indarbejde begrebet stopord i vores klassehierarki; det er meningen, at de faktiske stopord skal l¾ses ind fra omtalte fil, nŒr et program, som bruger dem startes.

 

Hvis tid: tilpas programmet sŒledes at det frasorterer (dvs. ikke medregner) sekvenser som starter med eller slutter med et stopord, men ellers fungerer u¾ndret.

ÿ