Till KTH:s startsida Till KTH:s startsida

Laboration 7

rosetta

Laboration 7: Implementera hashtabell

Läsning

Läs i Miller-Ranum  om Hashing.

1. Hashning med Pythons inbyggda dictionary

Minns du hur du i labb 2 gjorde en enklel kö med Pythons array? Nu ska du göra en egen hashtabell med Pythons dictionary!

Skriv en klass DictHash som använder dictionary. Den ska ha metoderna

  • store(nyckel, data)
  • x = search(nyckel)

Prova din dictionary med datafilen från förra labben. Tar det lika lång tid att köra?

Vill du kunna skriva d[nyckel] istället för d.search(nyckel)? Definiera då metoden __getitem__(self, nyckel) 
Om du vill kunna skriva if nyckel in d definierar du metoden __contains__(self, nyckel)

2. En egen implementation av hashtabellen

Nu ska du även göra hashningen själv, i din nya klass Hashtabell med samma gränssnitt och funktionalitet som DictHash. Krav:

  • Definiera en klass HashNode för hashtabellens noder. Noderna måste innehålla både nyckel och värde.
  • Hashtabellen ska vara lagom stor
  • Du måste skriva en egen hashfunktion, som ger en bra fördelning över hela tabellen
  • Redogöra för hur bra fördelningen är. T.ex. med en teoretisk analys av din algoritm eller genom att mäta hur många krockar det är som mest vid insättning
  • Någon krockhantering måste ingå, t ex krocklistor eller probning
  • Du ska använda KeyError för att tala om att en nyckel inte finns

Testkörning 1

Prova med datafilen från förra labben. Du behöver inte använda enbart artist som nyckel. 

Testkörning 2

Programmet hashtest.py innehåller data om alla atomer (namn och atomvikt). Lista ut vad det gör och hur det anropar hashtabellen. Modifiera det sedan för att kontrollera om din hashtabell fungerar.

Redovisning

Labben lämnas in på git och redovisas muntligt av bägge gruppmedlemmarna.

Vid redovisningen ska du kunna

  • motivera ditt val av hashfunktion, krockhantering och tabellstorlek,
  • skissa hashtabellen,
  • förklara varför hashning ger snabb sökning

Betyg

Denna labb kan endast ge betyg E. Du måste lämna in den och redovisa den i tid för att få göra labbarna för högre betyg i period 2.

Alexander Baltatzis skapade sidan 16 januari 2017

kommenterade 27 januari 2017

2. En egen implementation av hashtabellen

ska man då göra en Dictionary i klassen Hashtabell där nycklarna är våra hashade värden (typ hashade artistnamn) och value är HashNode? Tänker eftersom det står KeyError måste man ha en dictionary?

kommenterade 13 februari 2017

man ska inte bara använda en Dict i klassen Hashtabell! KeyError får man definiera och raisa själv. 

kommenterade 21 februari 2017

Ska vi läsa in hela unique_tracks listan? Jag har svårt att hitta en algoritm som inte gör att det tar orimligt mycket tid att läsa in alla 1 000 000 låtar, och har mindre än en miljon platser.

kommenterade 22 februari 2017

@Martin Larsson

Du behöver mer än 1M platser i hashtabellen. Teorin säger >= 2M platser för att inte få för många krockar. 

kommenterade 24 februari 2017

Ska man i klassen Hashtabell skapa en hashtabell med en dictionary där HashNodes är values och keys är hashvärden? eller ska man skapa den med en vektor där en HashNode ligger på index[hashvärde] i vektorn?

kommenterade 24 februari 2017

Vektor med hasnode på index[hasvärde] Sabeen

Lärare kommenterade 28 februari 2017

@Sabeen det beror på om du använder probning eller krocklista. Det hjälper om du ritar vektorn. 

Lärare kommenterade 28 februari 2017

Jag har förtydligat uppgift 2. DictHash och HashTabell ska ha samma gränssnitt och funkionalitet. Som ArrayQ och LinkedQ i lab2. 

Lärare kommenterade 1 mars 2017

Jag har fått några frågor om varför man ska kasta undantag om search inte hittar en nyckel. Svaret är att det fungerar inte att returnera ett värde som false eller None eftersom dessa är giltiga värden som skulle kunna finnas i hashtabellen. 

En användare har tagit bort sin kommentar