14c. Hashtabel analyse
2021-03-26
slides.com/jod/pt_14c
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Voordeel hashtabel
Hashtabel is snel (bvb. tov zelf-balancerende zoekboom) indien er geen (of weinig) collisions optreden
- geen iteratie over buckets
- enige overhead is berekenen van
- veel collisions leiden tot grote buckets
Collisions hangen af van
- gekozen hashfunctie
-
load factor:
# key-waarde-paren in de hashtabel
/ lengte van de array- load factor > 1 leidt altijd tot collisions
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Rehashing
Veronderstel n key-waarde-paren en l de lengte van array
Bij hoge load factor, zorg dat l groter wordt!
Rehashing:
- Verdubbel de grootte van de dynamische array
- Bereken de nieuwe bucket i van elk bestaand key-waarde-paar
- "Voeg toe" aan de nieuwe bucket
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Rehashing
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"barack", 59
"joe", 78
"donald", 74
"george", 74
"bill", 74
- n=5, l=6, load factor = ~0.83
-
Rehash naar l=12
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Rehashing
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 |
"barack", 59
"joe", 78
"donald", 74
"george", 74
"bill", 74
- n=5, l=6, load factor = ~0.83
-
Rehash naar l=12
-
Herbereken buckets
-
Verplaats key-waarde-paren naar nieuwe bucket
Naam | hash | hash%l (l=12) |
---|---|---|
bill | 35 | 11 |
george | 57 | 9 |
barack | 36 | 0 |
donald | 50 | 2 |
joe | 30 | 6 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Rehashing
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 |
"barack", 59
"joe", 78
"donald", 74
"george", 74
"bill", 74
- n=5, l=6, load factor = ~0.83
-
Rehash naar l=12
-
Herbereken buckets
-
Verplaats key-waarde-paren naar nieuwe bucket
Naam | hash | hash%l (l=12) |
---|---|---|
bill | 35 | 11 |
george | 57 | 9 |
barack | 36 | 0 |
donald | 50 | 2 |
joe | 30 | 6 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Rehashing
- Rehash naar dubbele lengte indien load factor > 1
- Rehash naar halve lengte indien load factor < 0.25
- Na elke rehash, load factor = 0.5
- Load factor blijft tussen 0.25 en 1
- Laag genoeg om (hopelijk) weinig collisions te hebben
- Enumeratie over de array doet dan hoogstens factor 4 teveel werk
- "Oplossing 2" uit 14b
- Rehash is een dure operatie, maar gebeurt voldoende infrequent
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Keuze hashfunctie
key | hash |
---|---|
bill | 35 |
george | 57 |
barack | 36 |
donald | 50 |
joe | 30 |
- Goede hashfunctie verdeelt keys X uniform over de range van getallen {0,1,...,k}
- minder kans op collisions
- Tot nu toe: hash(key) = som van alfabetwaarde (a=1, b=2, ...) van letters
- Normale namen hebben < 30 letters, dus hash(key) < 1000 voor typische keys
- een hashtabel met 100.000 unieke namen zal véél collisions hebben
- Geen onderscheid in volgorde: greet vs geert
- Niet uniform in de range {0,1,...,2^32-1}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Keuze hashfunctie
key | hash |
---|---|
bill | 2090113448 |
george | 4286896414 |
barack | 4086564937 |
donald | 4181295159 |
joe | 193496195 |
- Betere hashfunctie voor strings
- Efficiënt te berekenen
- In het algemeen: veel onderzoek naar gedaan, vind het wiel niet opnieuw uit!
// gebaseerd op http://www.cse.yorku.ca/~oz/hash.html
unsigned int hash(char *s) {
unsigned int hash = 5381; // magic number
while (*s != '\0') {
hash = hash*33 + *s; // magic number
++s;
}
return hash;
}
key | hash |
---|---|
bill | 35 |
george | 57 |
barack | 36 |
donald | 50 |
joe | 30 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Implementatie
- Uitstekende oefening om zelf een hashtabel te implementeren
- Eigen poging: zie pastebin.com/MWh7qEuj
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Set
- Set: collectie unieke elementen
- Toevoegen, verwijderen, opzoeken, enumereren
- "Tabel zonder waarden"
- keys zijn de waarden :)
- Kan met zelfde datastructuren geïmplementeerd worden
- gebalanceerde zoekboom
- hashtabel
Naam | Leeftijd |
---|---|
bill | 74 |
george | 74 |
barack | 59 |
donald | 74 |
joe | 78 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
- Collisions vertragen operaties op hashtabel
- Hoge load factor leidt tot collisions
- Rehashing verkleint load factor
- Goede keuze hashfunctie vermindert collisions
- Hashtabel kan ook gebruikt worden voor collectie unieke elementen ipv key-waarde-paren
14c. Hashtabel analyse
By Jo Devriendt
14c. Hashtabel analyse
- 659