Chalmers | Göteborgs universitet
Data- och informationsteknik

  DIT960 | LP4 | VT2012 Datastrukturer DV[an error occurred while processing this directive]: Inlämningsuppgift 2

Warning! This is the 2012 course's website! You probably want the current course website.

Inlämningsuppgift 2: Testning av mängder

I denna inlämningsuppgift ska ni testa några olika mängd-implementeringar och beräkna deras tidskomplexitet utifrån körningarna.

Bakgrund

Följande klasser ska ni testa:

Ni ska testa på följande två textfiler:

Till er hjälp finns ett testprogram, TestLexiconLookup, som anropas såhär:

  $ java TestLexiconLookup [lexikon-klass] [textfil] [lexikon-storlek] [antal-test]
där lexikon-klass är någon av klasserna ovan, textfil är någon av textfilerna ovan, lexikon-storlek är ett heltal som säger hur många ord som lexikonet maximalt får innehålla, och antal-test säger hur många gånger testet ska köras.

Programmet läser in filen och bygger ett lexikon. Sedan läser den in filen igen och slår upp varje ord i lexikonet, och beräknar hur lång tid varje lexikonuppslagning tog i medeltal. Detta gör programmet det givna antalet gånger och skriver ut en tabell. När ni ska beräkna komplexiteten nedan så ska ni alltid utgå från det bästa resultatet, dvs. den snabbaste körningen! (Anledningen till detta är att förseningar antagligen har mer med att göra med Garbage Collection och liknande saker, än med algoritmernas effektivitet).

Ladda ner

Filerna finns i ett zip-arkiv: inlupp2.zip. Arkivet är ca 5 MB stort, och packas upp till fem filer om ca 14 MB.

Uppgift

Er uppgift är att beräkna de fyra olika algoritmernas tidskomplexitet i praktiken. En del beter sig linjärt, andra logaritmiskt och åter andra har konstant tidskomplexitet. För varje klass och textfil, ska ni köra testet med olika lexikonstorlekar, och utifrån detta beräkna om komplexiteten är (huvudsakligen) konstant, logaritmisk eller linjär.

Ett tips är att skapa en enkel tabell där ni mäter tider och skillnaden mellan närliggande rader. Lexikonstorleken ska antingen öka konstant med varje rad (t.ex. ni = 5000·i), eller exponentiellt (t.ex. ni = 5000·2i). Om tidsskillanden mellan raderna är (i stort sett) konstant, så kan ni räkna ut tidskomplexiteten.

Rad (i) Lexikonstorlek (ni) Uppmätt tid per ord, T(ni) Skillnad, T(ni) – T(ni-1)
    
    
    
    
    

Inlämning

Fyll i en sånhär tabell för varje kombination av lexikon-klass och textfil, alltså totalt 8 tabeller.

Lexikonklass:
Textfil:
Komplexitet: (linjär, logaritmisk, eller konstant?)
Konstanter: A = B =
Lexikonstorlek (n) Uppmätt tid per ord, T(n) Beräknad tid T'(n) = A·n + B
[alternativt T'(n) = A·log(n) + B]
   
   
   
   
   

Skriv även en kort rapport (max en halv A4-sida) om hur det gick, vilka svårigheter ni hade, slutsatser man kan dra utifrån resultaten, etc.