14b. Hashtabel
2021-03-26
slides.com/jod/pt_14b
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
Hashfunctie
- Stel:
- X is een verzameling elementen
- k is een natuurlijk getal
- Dan beeldt een hashfunctie de elementen uit X af op een natuurlijk getal tussen 0 en k:
- Voor onze doeleinden, k = 2^32-1 of
k = 2^64-1 - Voor cryptografie, bvb. k = 2^4096-1
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Hashfunctie
Bvb. voor een naam, tel de plaats in het alfabet van de letters op (a=1, b=2, c=3, ...)
X | hash(x) |
---|---|
bill | 35 |
george | 57 |
barack | 36 |
donald | 50 |
joe | 30 |
"Omzetting" van vorige lesvideo - tel de letters, maar 'a' telt dubbel - is ook een hashfunctie
bill
4
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Hashtabel
Naam | leeftijd | hash |
---|---|---|
bill | 74 | 35 |
george | 74 | 57 |
barack | 59 | 36 |
donald | 74 | 50 |
joe | 78 | 30 |
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
- In de kern is een hashtabel een dynamische array met lengte l
- Gegeven een hashfunctie, dan wordt een key-waarde-paar gestockeerd op index
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Hashtabel
- In de kern is een hashtabel een dynamische array met lengte l
- Gegeven een hashfunctie, dan wordt een key-waarde-paar gestockeerd op index
Naam | leeftijd | hash | hash%l(l=6) |
---|---|---|---|
bill | 74 | 35 | 5 |
george | 74 | 57 | 3 |
barack | 59 | 36 | 0 |
donald | 74 | 50 | 2 |
joe | 78 | 30 | 0 |
Index | key-waarde |
---|---|
0 | "barack", 59 |
1 | |
2 | "donald", 74 |
3 | "george", 74 |
4 | |
5 | "bill", 74 |
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Hashtabel
- In de kern is een hashtabel een dynamische array met lengte l
- Gegeven een hashfunctie, dan wordt een key-waarde-paar gestockeerd op index
- Wat als we (dezelfde!) keys toevoegen met dezelfde index i?
- botsingen of collisions
Naam | leeftijd | hash | hash%l(l=6) |
---|---|---|---|
bill | 74 | 35 | 5 |
george | 74 | 57 | 3 |
barack | 59 | 36 | 0 |
donald | 74 | 50 | 2 |
joe | 78 | 30 | 0 |
Index | key-waarde |
---|---|
0 | "barack", 59 |
1 | |
2 | "donald", 74 |
3 | "george", 74 |
4 | |
5 | "bill", 74 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Collisions aanpakken
-
Elke index in de hashtabel bevat een gelinkte lijst met key-waarde-paren - de bucket
- meest eenvoudige oplossing
- Voeg alle key-waardes met zelfde index i toe aan bucket i
- Stel, we willen "kamala", 56 toevoegen
- hash("kamala")=39, bucket = 39%6 = 3
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"barack", 59
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Collisions bij toevoegen
-
Elke index in de hashtabel bevat een gelinkte lijst met key-waarde-paren - de bucket
- meest eenvoudige oplossing
- Voeg alle key-waardes met zelfde index i toe aan bucket i
- Stel, we willen "kamala", 56 toevoegen
- hash("kamala")=39, bucket = 39%6 = 3
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"barack", 59
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
"kamala", 56
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Opzoeken en verwijderen
-
Opzoeken is eenvoudig
- gegeven key, bereken hash(key), bereken
bucket = index = hash(key)%lengte, zoek key in bucket - indien niet in bucket, dan ook niet in tabel
- gegeven key, bereken hash(key), bereken
-
Verwijderen is gelijkaardig
- gegeven key, bereken hash, bereken bucket, zoek key in bucket, verwijder indien aanwezig
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"barack", 59
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
"kamala", 56
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Opzoeken en verwijderen
-
Opzoeken is eenvoudig
- gegeven key, bereken hash(key), bereken
bucket = index = hash(key)%lengte, zoek key in bucket - indien niet in bucket, dan ook niet in tabel
- gegeven key, bereken hash(key), bereken
-
Verwijderen is gelijkaardig
- gegeven key, bereken hash, bereken bucket, zoek key in bucket, verwijder indien aanwezig
- bvb verwijder "barack", hash = 36, bucket = 0, eerste node
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"barack", 59
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
"kamala", 56
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Opzoeken en verwijderen
-
Opzoeken is eenvoudig
- gegeven key, bereken hash(key), bereken
bucket = index = hash(key)%lengte, zoek key in bucket - indien niet in bucket, dan ook niet in tabel
- gegeven key, bereken hash(key), bereken
-
Verwijderen is gelijkaardig
- gegeven key, bereken hash, bereken bucket, zoek key in bucket, verwijder indien aanwezig
- bvb verwijder "barack", hash = 36, bucket = 0, eerste node
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
"kamala", 56
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Enumereren
- Loop over alle indexen, overloop de bucket per index
- traag als er veel meer lege buckets dan aanwezige key-waarde-paren zijn
- Oplossing 1: extra gelinkte lijst van niet-lege buckets
- Oefening voor thuis: hoe die lijst consistent houden tijdens toevoegen / verwijderen?
- Oplossing 2: zorg dat array niet te groot wordt (zie 14c)
Index | key-waarde |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 |
"joe", 78
NULL
NULL
NULL
"donald", 74
"george", 74
"bill", 74
NULL
NULL
NULL
"kamala", 56
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Alternatieve collisionbehandeling
- Dus: collisions kunnen via buckets van gelinkte lijsten behandeld worden
- Andere methodes bestaan ook, bvb. (uit de cursus):
- probing
- double hashing
- Centraal idee is om botsende key-waarde-paren op te slaan in lege indexen in de array
- Volwaardig alternatief, maar moeilijker te implementeren
- cursus legt niet uit hoe te verwijderen
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
- Hashfuncties beelden objecten af op een eindige verzameling natuurlijke getallen
- Eenvoudige hashtabel is dynamische array van gelinkte lijsten
- Index van key = = bucket
- Identieke indexen voor keys leiden tot collisions
14b. Hashtabel
By Jo Devriendt
14b. Hashtabel
- 691