Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

Like dokumenter
... HASHING. Hashing. Hashtabeller. hash(x)

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

INF Algoritmer og datastrukturer

INF2220: Forelesning 3

INF1020 Algoritmer og datastrukturer

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

INF2220: Forelesning 3

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

public interface Collec>on<V> { public void add(v value); public default V remove(v value) { return null;

Hashing: Håndtering av kollisjoner

INF1010 Hashing. Marit Nybakken 8. mars 2004

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Hashfunksjoner. Hashfunksjonen beregner en indeks i hashtabellen basert på nøkkelverdien som vi søker etter

Hashtabeller. Lars Vidar Magnusson Kapittel 11 Direkte adressering Hashtabeller Chaining Åpen-adressering

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

INF Algoritmer og datastrukturer

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Datastrukturer for rask søking

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Notater til INF2220 Eksamen

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

INF2220: Forelesning 2

UNIVERSITETET. Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Hashliknende strukturer.

O(log n) - søk. Søking i et balansert søketre med n elementer er alltid O(log n) Søkingen er basert på parvise sammenligninger av to og to verdier

Øvingsforelesning 2 - TDT4120. Grafer og hashing. Benjamin Bjørnseth

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

O(1) søking? Søking i sortert array og i søketrær: Optimalt søk som er O(1):

Kapittel 14, Hashing. Tema. Definere hashing Studere ulike hashfunksjoner Studere kollisjonsproblemet 17-1

UNIVERSITETET I OSLO. Indeksering. Hvordan finne et element raskt? Institutt for Informatikk. INF Ellen Munthe-Kaas

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Treliknende strukturer Hashliknende strukturer Bitmapindekser

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

INF Algoritmer og datastrukturer

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET. Indeksering. Hvordan finne et element raskt? Vera Goebel, Ellen Munthe-Kaas

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Trestrukturer Hashliknende strukturer Bitmapindekser

Obligatorisk oppgave 1 INF1020 h2005

INF2220: Time 12 - Sortering

IN Algoritmer og datastrukturer

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Trestrukturer Hashliknende strukturer Bitmapindekser

INF2220: Forelesning 2

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

INF Algoritmer og datastrukturer

Uke 5 Disjunkte mengder

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Flerveis søketrær og B-trær

Algoritmer og Datastrukturer IAI 21899

Pensum: fra boken (H-03)+ forelesninger

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Liste som abstrakt konsept/datatype

INF Algoritmer og datastrukturer

Parallelle og distribuerte databaser del III

Pensum: fra boken (H-03)+ forelesninger

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Definisjon: Et sortert tre

Lars Vidar Magnusson

Korteste vei i en vektet graf uten negative kanter

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Innhold. Innledning 1

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

INF1040 Oppgavesett 1: Tallsystemer og binærtall

Binær heap. En heap er et komplett binært tre:

Turingmaskiner.

Disjunkte mengder ADT

Pattern matching algorithms. INF Algoritmer og datastrukturer. Lokalisering av Substrenger. Brute force

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

PG4200 Algoritmer og datastrukturer Forelesning 9

Studentnummer: Side 1 av 1. Løsningsforslag, Eksamen i TDT4120 Algoritmer og datastrukturer August 2005

Grunnleggende Datastrukturer

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

Algoritmer og Datastrukturer

Innledning. IN2010/INF Algoritmer og datastrukturer. Tirsdag 27. november 2018 Kl (4 timer)

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF Algoritmer og datastrukturer

Dagens temaer. Dagens emner er hentet fra Englander kapittel 11 (side ) Repetisjon av viktige emner i CPU-design.

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

MAT1030 Diskret matematikk

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

INF1010 notat: Binærsøking og quicksort

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

IN Algoritmer og datastrukturer

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Transkript:

Hashing INF2220 - Algoritmer og datastrukturer HØSTEN 200 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning : Hashing Hashtabeller (kapittel.) Hash-funksjoner (kapittel.2) Kollisjonshåndtering Åpen hashing (kapittel.) Lukket hashing (kapittel.) Rehashing (kapittel.) Utvidbar hashing (kapittel.) Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 HASHING Hashtabeller Anta at en bilforhandler har 0 ulike modeller han ønsker å lagre data om. Hvis hver modell har et entydig nummer mellom 0 og kan vi enkelt lagre dataene i en array som er 0 lang. Hva hvis numrene ligger mellom 0 og? Array som er 0 000 lang: sløsing med plass! Array som er 0 lang: søking tar lineær tid... En hashtabell tilbyr innsetting, sletting og søking med konstant gjennomsnittstid. Men: operasjoner som finnminste og skrivsortert har ingen garantier. Brukes gjerne når vi først og fremst ønsker et raskt svar på om et gitt element finnes i datastrukturen eller ikke. Eksempler: kompilatorer: Er variabel y deklarert? stavekontroller: Finnes ord x i ordlisten? spill: Har jeg allerede vurdert denne stillingen via en annen trekkrekkefølge? Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2

Ideen i hashing er å lagre elementene i en array (hashtabell), og la verdien til elementet x (eller en del av x, kalt nøkkelen til x) bestemme plasseringen (indeksen) til x i hashtabellen. tablesize = størrelsen på hashtabellen Hash-funksjon: Fra nøkkelverdier til tabellindekser Egenskaper til en god hash-funksjon: Rask å beregne Kan gi alle mulige verdier fra 0 til tablesize. Gir en god fordeling utover tabellindeksene. x hash(x) Idealsituasjonen Perfekt situasjon: n elementer tabell med n plasser hash-funksjon slik at den er lett (rask) å beregne forskjellige nøkkelverdier gir forskjellige indekser Eksempel: Hvis modellene er nummerert 0, 000, 2 000,..., 000, 000 kan data om modell i lagres på indeks i/ 000 i en tabell som er 0 stor. Problem: Hva hvis modell 000 får nytt nummer? Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Hashtabell er en abstrakt datatype (ADT) Hashing er en teknikk for å implementere denne ADTen. Størrelsen tablesize er en del av ADTen! Hovedproblemstillinger ved hashing Hvordan velge hash-funksjon? ofte er nøklene strenger Hvordan håndtere kollisjoner? Hvor stor bør hashtabellen være? I praksis Hash-funksjonen kan ikke mappe alle nøkler til ulike indekser. I stedet: hash-funksjonen bør gi en så jevn fordeling som mulig. Hash-funksjoner Eksempel Nøkler er heltall Begrenset antall tabellindekser La hash-funksjonen være hash(key) = key mod tablesize Gir jevn fordeling for tilfeldige tall. Hint: Pass på at ikke nøklene har spesielle egenskaper: Hvis tablesize = 0 og alle nøklene slutter på 0 vil alle elementene havne på samme indeks! Huskeregel: La alltid tabellstørrelsen være et primtall. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2

Strenger som nøkler Vanlig strategi: ta utgangspunkt i ascii/unicode-verdiene til hver bokstav og gjør noe lurt. Funksjon : Summer verdiene til hver bokstav. p u b l i c s t a t i c i n t hash ( S t r i n g key, i n t t a b l e S i z e ) { i n t hashval = 0 ; Funksjon 2: Bruk bare de tre første bokstavene og vekt disse. p u b l i c s t a t i c i n t hash2 ( S t r i n g key, i n t t a b l e S i z e ) { r e t u r n ( key. charat ( 0 ) + 2 key. charat ( ) + 2 key. charat ( 2 ) ) % t a b l e S i z e ; f o r ( i n t i = 0 ; i < key. l e n g t h ( ) ; i ++) { hashval += key. charat ( i ) ; r e t u r n ( hashval % t a b l e S i z e ) ; Fordel: Grei fordeling for tilfeldige strenger. Ulempe: Vanlig språk er ikke tilfeldig! Fordel: Enkel å implementere og beregne. Ulempe: Dårlig fordeling hvis tabellstørrelsen er stor. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 0 / 2 Funksjon : keysize i=0 key[keysize i ] i p u b l i c s t a t i c i n t hash ( S t r i n g key, i n t t a b l e S i z e ) { i n t hashval = 0 ; f o r ( i n t i = 0 ; i < key. l e n g t h ( ) ; i ++) { hashval = hashval + key. charat ( i ) ; Hash-funksjoner: oppsummering Må (i hvert fall teoretisk) kunne gi alle mulige verdier fra 0 til tablesize. Må gi en god fordeling utover tabellindeksene. Tenk på hva slags data som skal brukes til nøkler. hashval = hashval % t a b l e S i z e ; i f ( hashval < 0) { hashval += t a b l e S i z e ; r e t u r n hashval ; Fødselsår kan gi god fordeling i persondatabaser, men ikke for en skoleklasse! Fordel: Enkel og relativt rask å beregne. Stort sett bra nok fordeling. Ulempe: Beregningen tar lang tid for lange nøkler. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2

Eksempel: Ideell situasjon Kollisjonshåndtering Input: 0,,,,, 2,,,, Hash-funksjon: hash(x, tablesize) = x 0 0 2 0 2 Hva gjør vi hvis to elementer hashes til den samme indeksen? Hva hvis hash-funksjonen hadde vært hash(x, tablesize) = x mod tablesize istedenfor? 2 Åpen hashing: Elementer med samme hashverdi samles i en liste (eller annen passende struktur). Lukket hashing: Dersom en indeks er opptatt, prøver vi en annen indeks inntil vi finner en som er ledig. Det finnes flere strategier for å velge hvilken annen indeks vi skal prøve. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Åpen hashing ( Separate chaining ) Lukket hashing åpen adressering Elementer med samme hashverdi samles i en liste (eller annen passende struktur) Vi forventer at hash-funksjonen er god, slik at alle listene blir korte. Vi definerer load-faktoren, λ, til en hashtabell til å være antall elementer i tabellen i forhold til tabellstørrelsen. For åpen hashing ønsker vi λ.0. 0 0 2 2 Hvis hash-verdien allerede er brukt: Prøver alternative indekser h 0 (x), h (x), h 2 (x),... inntil vi finner en som er ledig. h i er gitt ved: og slik at f (0) = 0. h i (x) = (hash(x) + f (i)) mod tablesize Merk at vi trenger en større tabell enn for åpen hashing generelt ønsker vi her λ < 0.. Skal se på tre mulige strategier (valg av f ): Lineær prøving Kvadratisk prøving Dobbel hashing Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2

Lineær prøving Dobbel hashing Velger f til å være en lineær funksjon av i, typisk f (i) = i. Input:,,,, Hash-funksjon: hash(x, tablesize) = x mod tablesize Kvadratisk prøving: La f være f (i) = i 2. 0 2 Bruker en ny hash-funksjon for å løse kollisjonene, typisk f (i) = i hash 2 (x), med hash 2 (x) = R (x mod R) hvor R er et primtall mindre enn tablesize. Eksempel. Input:,,,, Andre hash-funksjon: hash 2 (x) = (x mod ) 0 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Rehashing Java s HashTable Hvis tabellen blir for full, begynner operasjonene å ta veldig lang tid. Mulig løsning: Lag en ny hashtabell som er omtrent dobbelt så stor (men fortsatt primtall!). Gå gjennom hvert element i den opprinnelige tabellen, beregn den nye hash-verdien og sett inn på rett plass i den nye hashtabellen. Dette er en dyr operasjon, O(n), men opptrer relativt sjelden (må ha hatt n/2 innsettinger siden forrige rehashing). Klassen java.util.hashtable: Implementerer en hashtabell som mapper nøkler til verdier. Bruker åpen hashing ved kollisjon lagres verdiene i en bøtte (som blir gjennomsøkt sekvensielt) Default load faktor λ < 0., tradeoff tid/plass. Når load faktor passeres, flyttes alle elemntene over i en større hashtabell ved rehashing Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 20 / 2

Når internminnet blir for lite Utvidbar hashing En lese-/skriveoperasjon på en harddisk (aksesstid -2 millisekunder) tar nesten 000 000 ganger lenger tid enn tilsvarende operasjon i internminnet (aksesstid ca. 0 nanosekunder). Dramatisk forskjell fanges dårlig opp av O modellen... Dersom ikke hele datastrukturen får plass i interminnet (hurtiglageret), lønner det seg nesten alltid å bruke datastrukturer som minimaliserer antall diskoperasjoner. Anta at vi skal lagre N dataelementer og at N varierer med tiden. kan lagre maksimalt M elementer i en diskblokk (= den delen av harddisken som kan hentes inn i en enkel leseoperasjon). Problemet med å bruke vanlig hashing er at kollisjoner kan føre til at find(x) må undersøke mange diskblokker selv om hashfunksjonen distribuerer elementene godt. rehashing blir fryktelig kostbart. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 22 / 2 Løsning: I diskblokken lagrer vi for hvert element Vi lar hashfunksjonen via en katalog angi hvilken diskblokk et element x befinner seg i (hvis det finnes). Dermed trenger find(x) bare to diskaksesser (og bare en aksess dersom katalogen kan lagres i internminnet). x hash(x) Inntil M elementer per diskblokk katalog x den binære strengen som koder hashverdien til elementet. innmaten i elementet eller en peker til denne. Vi benytter de D første bitene av hashverdien til oppslag i katalogen. I eksemplet til høyre forenkler vi litt og lagrer for hvert element bare hashverdien til elementet (som -sifret binærtall). D=2 M= 00 d=2 d=2 d=2 d=2 000 00000 00000 0000 00 0 0 000 00 0 000 00 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2

Innsettingsalgoritme Katalogen har 2 D indekser. Hver diskblokk har plass til M elementer. For hver diskblokk L lagrer vi et tall d L D. Invariant: Det garanteres at alle elementer i L har minst de d L første bitene felles. Hvis d L = D: akkurat én indeks i katalogen peker på diskblokk L. Hvis d L < D: to eller flere indekser i katalogen peker på L.. Beregn hash(x) og finn riktig diskblokk L ved å slå opp i katalogen på de D første sifrene i hashverdien. 2. Hvis det er færre enn M elementer i L, så sett x inn i L.. Hvis diskblokken derimot er full, så sammenlign d L med D:. Hvis d L < D: splitt L i to blokker L og L 2 :.. Sett d L = d L2 = d L +...2 Gå gjennom elementene i L og plasser dem i L eller L 2 avhengig av verdien på de d L + første sifrene... Prøv på nytt å sette inn x (gå til punkt 2)..2 Hvis d L = D:.2. Doble katalogstørrelsen ved å øke D med..2.2 Fortsett som ovenfor (splitt L i to blokker osv.). Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Eksempel M = (maks. elementer i en diskblokk) Antall bits i hashverdiene = D=2 M= 00 d=2 d=2 d=2 d=2 000 00000 00000 0000 00 0 0 000 00 0 000 00 Sett inn 0000 Diskblokk 00 er full og d 00 = D: Vi utvider katalogen, splitter deretter diskblokken og flytter elementer til ny blokk. Dermed blir det plass. D= M= 000 00 00 0 00 0 0 d= d= 00000 00000 0000 00 d=2 d=2 d=2 000 0000 000 00 0 000 00 Sett inn element med hashverdi 0000 Det er ledig plass i diskblokken, så vi setter rett inn. De andre oppslagene i katalogen deler de andre blokkene parvis. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2

Sett inn 00 Diskblokk 0 er fortsatt full, så vi må øke D til og splitte en gang til. Diskblokk 0 er full og d 0 < D, så vi splitter diskblokken: 000 00 00 0 D= M= 000 00 00 0 00 0 0 d= d= 00000 00000 0000 0000 00 d=2 000 0000 d= d= 000 00 0 d=2 000 00 D= M= d= d= d= 000 00 00 0 Men: Vi får ikke flyttet noen elementer til den nye blokken! Merk: Dupliserte hash-verdier Algoritmen virker ikke hvis mer enn M elementer hasher til samme verdi. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 0 / 2 Fyllingsgrad til diskblokkene Veldig stor katalog hvis elementer har mange ledende sifre felles. For bedre spredning bruker vi hashfunksjon (ikke nøkkelen til elementet direkte). Hvis vi antar uniform fordeling av bitmønstrene, blir antall blokker N M log 2 e = N M ln 2 Forventet antall elementer pr. diskblokk blir da: N N M ln 2 = N M N ln 2 = M ln 2 = 0.M dvs. at i det lange løp vil ca. % av hver diskblokk være fylt opp. Forventet størrelse på katalogen blir da Hashing Oppsummering Hashtabell gir innsetting, sletting, og søking med konstant gjennomsnittstid Hvor stor bør hash-tabellen være: tablesize Hash-funksjon: jevn fordeling over indeksene 0 til tablesize. Kollisjoner: åpen vs. lukket hashing Utvidbar hashing: optimert for rehash-funksjonen N + M M dvs. at liten M gir stor katalog. Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning / 2 Einar Broch Johnsen (Ifi, UiO) INF2220 H200, forelesning 2 / 2