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
\mathit{hash} \colon X \rightarrow \{0,1,\ldots,k\}

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
i=\mathit{hash}(\mathit{key})\%l

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
i=\mathit{hash}(\mathit{key})\%l
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
i=\mathit{hash}(\mathit{key})\%l
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
  • 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
  • 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
  • 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
\mathit{hash}(\mathit{key})\%\mathit{lengte}

14b. Hashtabel

By Jo Devriendt