IN2010 Gruppe 4
Uke 9
Hashing!
Er en nyttig teknikk, som vi kan bruke for å lage effektive mengder.
Brukes f.eks. i hashmaps, og er hovedgrunnen til at disse er så raske.
Hashing!
Vi ønsker å ha god kjøretidskompleksitet for:
Hashing!
Hashing er tredelt:
Del 1: Hashfunksjoner
Del 2: Håndtere kollisjoner
To metoder vi skal se på:
Separate chaining
Linear probing eksempel
2
2
Del 3: Balansering og effektivitet
Viktig å ha en ‘god’ størrelse på arrayet vårt for å sikre effektivitet
Hvordan vet vi hva som er godt?
Load factor sier noe om hvor fullt arrayet vårt er
Balansering: Rehashing
Må gjøres en gang i blant når vi får så mange elementer at kollisjoner blir vanlige
Består av å lage et helt nytt array med en ny størrelse, og å flytte alle elementene inn i dette
Lineær tid
Amortisert tid
Iblant når vi gjør en insetting må vi også gjøre rehashing (O(n))
Dette fører til at verste-tilfelle kjøretid for innsetting blir lineær tid!
MEN dette vil jo ikke være tilfellet for de fleste av innsettingene! - derfor har vi uttrykket amortisert tid.
Det vil si at vi aksepterer at det en gang iblant blir verre kjøretid, men dette er jo på grunn av at vi har gjort veldig mange tidligere (raske) innsettinger! Hvis vi tenker at disse raske innsettingene ‘betaler’ litt av denne tidskostnaden, får vi det vi kaller amortisert tid.
Vi sier derfor at Hashmaps har amortisert konstant tid på innsetting.