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

Collisions hangen af van

  1. gekozen hashfunctie
  2. 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

\text{load factor} = n/l

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

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

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

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