hashing - forsiden - universitetet i oslo · ideen i hashing er å • lagre elementene i en array...
TRANSCRIPT
Hashing
IN2010høsten2019
Theterm"hash"comesbywayofanalogywithitsnon-technicalmeaning,to"chopandmix".Indeed,typicalhashfuncDons,likethemodoperaDon,"chop"theinputdomainintomanysub-domainsthatget"mixed"intotheoutputrangetoimprovetheuniformityofthekeydistribuDon.
BrukesgjernenårviharganskemangeelementerogønskeretrasktsvarpåometgiJelementfinnesidatastrukturenellerikke.Eksempler:• Kompilatorer:Ervariabelydeklarert?• Stavekontroller:Finnesordxiordlisten?• Spill:HarjegalleredevurdertdennesDllingenviaenannen
trekkrekkefølge?• XMLparsering:NøklerbliraJribuJnavn,verdiblirinnhold.• Rutere:BestemmehvilkenlinjeendatapakkeskalsendesDl
(IP-adresseernøkkel).
Nestenallescriptspråkharhashsomdelavspråket.(Perl,Python,Ruby,PHP,…)
Nårbrukervihashtabeller?
publicinterfaceMap<K,V>{publicVget(Kkey);publicvoidput(Kkey,Vvalue);publicVremove(Kkey);}
MapADT
HashtabellerIdeenihashingerå• lagreelementeneienarray(hashtabell).• laverdienDlelementetx(ellerendelavx,dakaltnøkkelenDlx),bestemmeplasseringen(indeksen)Dlxihashtabellen.
EgenskaperDlengodhash-funksjon:• raskåberegne.• kangiallemuligeverdierfra0DltableSize-1.• girengodfordelingutovertabellindeksene.
x
0123456789
hash(x)
Idealsituasjonen• antallelementer=tableSize• hashfunksjonsomgirforskjelligeindekserforalleelementene
x
0123456789
hash(x)
Idealsituasjonen• antallelementer=tableSize• hashfunksjonsomgirforskjelligeindekserforalleelementene
Foreksempel10elementermednøklene0,1,4,9,16,25,36,49,64,81
x
0123456789
Idealsituasjonen• antallelementer=tableSize• hashfunksjonsomgirforskjelligeindekserforalleelementene
Foreksempel10elementermednøklene0,1,4,9,16,25,36,49,64,81hash(x)=√xhash(x)=sqrt(x) x
0123456789
espehje
thoaivd
mailinek
joakimov
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
espehje
thoaivd
mailinek
joakimov
0
1
2
3
4
Enfunksjonf(k)somgiret(stort)heltall,m
Objektermedennøkkel,k
n=5array.length
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
3
4
Enfunksjonf(k)somgiret(stort)heltall,m
Objektermedennøkkel,k
n=5array.length
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
3
4
Enfunksjonf(k)somgiret(stort)heltall,m
Objektermedennøkkel,k
Enfunksjonf(m)somgiretheltalliiintervallet[0,n-1]
n=5array.length
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
3
4
Objektermedennøkkel,k
Enfunksjonf(m)somgiretheltalliiintervallet[0,n-1]
n=5array.length
m=f(k)=∑k.charAt(i)
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmodn
Modulo-operatoren
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
espehje
thoaivd
mailinek
joakimov
740
751
842
864
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
m=f(k)=∑k.charAt(i) i=mmod5
hashfunksjonh(k)
m=f(k)=∑k.charAt(i) h(k)=mmodtableSize
hashfunksjonh(k)
h(k)=(∑k.charAt(i))modtableSize
hashfunksjonh(k)
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:Hvordanfinneutometobjektmednøkkel“malinek”finnesiarrayenellerikke?
Person[]
studenter
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
studenter
Person[]
Oppgave:Hvordanfinneutometobjektmednøkkel“malinek”finnesiarrayenellerikke?VibrukerdensammehashfunksjonensomvibruktedavisaJeinn,ogfinneratnårk=“malinek”,såer∑k.charAt(i)=737.737mod5=2.Så«slårviopp»iarrayenpåindeks2:
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
studenter
Person[]
mailinek
Oppgave:Hvordanfinneutometobjektmednøkkel“malinek”finnesiarrayenellerikke?VibrukerdensammehashfunksjonensomvibruktedavisaJeinn,ogfinneratnårk=“malinek”,såer∑k.charAt(i)=737.737mod5=2.Så«slårviopp»iarrayenpåindeks2:
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.
studenter
Person[]
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.∑k.charAt(i)=868
studenter
Person[]
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.∑k.charAt(i)=868868mod5=3
studenter
Person[]
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.∑k.charAt(i)=868868mod5=3
studenter
Person[]
sDanosc
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.∑k.charAt(i)=868868mod5=3
studenter
Person[]
sDanosc
espehje
thoaivd
mailinek
joakimov
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“sDanosc”.∑k.charAt(i)=868868mod5=3
studenter
Person[]
sDanosc
espehje
thoaivd
mailinek
joakimov
0
1
2
3
4
Objektermedennøkkel,k
studenter.length=5
Oppgave:SeJinnetPerson-objektmedk=“philipnh”.
studenter
Person[]
sDanosc
espehje
thoaivd
mailinek
joakimov
espehje
thoaivd
mailinek
joakimov
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
h(k)=(∑k.charAt(i))mod5
hashfunksjonh(k)
espehje
thoaivd
mailinek
joakimov
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
h(k)=(∑k.charAt(i))mod5
hashfunksjonh(k)
espehje
thoaivd
mailinek
joakimov
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
h(k)=(∑k.charAt(i))mod5
hashfunksjonh(k)
espehje
thoaivd
mailinek
joakimov
0
1
2
4
0
1
2
3
4
Objektermedennøkkel,k
n=5array.length
h(k)=(∑k.charAt(i))mod5
hashfunksjonh(k)
1. Bestemme(Dlordne)nøkkel.Dennemåværeunikslikattoforskjelligeelementerikkekanha/fåsammenøkkel.
1. Bestemme(Dlordne)nøkkel.Dennemåværeunikslikattoforskjelligeelementerikkekanha/fåsammenøkkel.
2. Bestemme(iniDell)tabellengde.
1. Bestemme(Dlordne)nøkkel.Dennemåværeunikslikattoforskjelligeelementerikkekanha/fåsammenøkkel.
2. Bestemme(iniDell)tabellengde.
3. Bestemmehashfunksjon(er).
1. Bestemme(Dlordne)nøkkel.Dennemåværeunikslikattoforskjelligeelementerikkekanha/fåsammenøkkel.
2. Bestemme(iniDell)tabellengde.
3. Bestemmehashfunksjon(er).
4. Hvordanhåndterekollisjoner?
1.MapisaninterfaceinJavaanditsconcreteimplementaDonsarecalledHashMapsandHashtables,amongother2.Python-DicDonaries3.C++-hash_map,unordered_mapandsoonaredifferentimplementaDons
HashtabellerIdeenihashingerå• lagreelementeneienarray(hashtabell).• laverdienDlelementetx(ellerendelavx,dakalt
nøkkelenDlx),bestemmeplasseringen(indeksen)Dlxihashtabellen.
Idealsituasjonen• nelementer• tabellmednplasser• hash-funksjonslikat
-denerleJ(rask)åberegne-forskjelligenøkkelverdiergirforskjelligeindekser
Idealsituasjonen• nelementer• tabellmednplasser• hash-funksjonslikat
-denerleJ(rask)åberegne-forskjelligenøkkelverdiergirforskjelligeindekser
Eksempel:Hvisobjekteneharnummer(nøkkel)
0,1000,2000,…,48000,49000kanobjektetlagrespåindeksi/1000ientabellsomer50stor.
Idealsituasjonen• nelementer• tabellmednplasser• hash-funksjonslikat
-denerleJ(rask)åberegne-forskjelligenøkkelverdiergirforskjelligeindekser
Eksempel:Hvisobjekteneharnummer(nøkkel)
0,1000,2000,…,48000,49000kanobjektetlagrespåindeksi/1000ientabellsomer50stor.Problem:Hvahvisobjekt4000fårnyJnummer3999?
TidsforbrukEnhashtabellDlbyr• innse{ng• sle{ng• søking(gjenfinning)medkonstantgjennomsniJsDd.
TidsforbrukEnhashtabellDlbyr• innse{ng• sle{ng• søking(gjenfinning)medkonstantgjennomsniJsDd.MenoperasjonersomfinnMinsteogskrivSortertharingengaran,er.
Hash-funksjonerEksempel:• Heltallsomnøkler• Begrensetantalltabellindekser• Lahash-funksjonenvære
hash(x,tableSize)=xmodtableSizeDeJegirjevnfordelingforDlfeldigetall.
Hash-funksjonerEksempel:• Heltallsomnøkler• Begrensetantalltabellindekser• Lahash-funksjonenvære
hash(x,tableSize)=xmodtableSizeDeJegirjevnfordelingforDlfeldigetall.
Passpåatnøkleneikkeharspesielleegenskaper;hvistableSize=10ogallenøklenesluJerpå0vilalleelementenehavnepåsammeindeks!Huskeregel:LaallDdtabellstørrelsenværeetprimtall.
StrengersomnøklerVanligstrategi:tautgangspunktiascii/unicode-verdieneDlhverbokstavog”gjørnoelurt”.
StrengersomnøklerFunksjon1:SummerverdieneDlhverbokstav.Fordel:Enkelåimplementereogberegne.Ulempe:Dårligfordelinghvistabellstørrelsenerstor.
StrengersomnøklerFunksjon2:Brukbaredetreførstebokstaveneogvektdisse.Fordel:GreifordelingforDlfeldigestrenger.Ulempe:VanligspråkerikkeDlfeldig!
h(k)=(k.charAt(0)+k.charAt(1)*27+k.charAt(2)*729)modtableSize
StrengersomnøklerFunksjon3:∑i=0
keySize-1key[keySize−i−1]*37iFordel:EnkelogrelaDvtraskåberegne.StortseJbranokfordeling.Ulempe:VanligspråkerikkeDlfeldig!
Hash-funksjoner─Oppsummering
Hash-funksjoner─Oppsummering• Må(ihvertfallteoreDsk)kunnegiallemuligeverdier
fra0DltableSize-1.
Hash-funksjoner─Oppsummering• Må(ihvertfallteoreDsk)kunnegiallemuligeverdier
fra0DltableSize-1.• Mågiengodfordelingutovertabellindeksene.
Hash-funksjoner─Oppsummering• Må(ihvertfallteoreDsk)kunnegiallemuligeverdier
fra0DltableSize-1.• Mågiengodfordelingutovertabellindeksene.• TenkpåhvaslagsdatasomskalbrukesDlnøkler:
Fødselsårkangigodfordelingipersondatabaser,menikkeforenskoleklasse!
Hash-funksjoner─Oppsummering• Må(ihvertfallteoreDsk)kunnegiallemuligeverdier
fra0DltableSize-1.• Mågiengodfordelingutovertabellindeksene.• TenkpåhvaslagsdatasomskalbrukesDlnøkler:
Fødselsårkangigodfordelingipersondatabaser,menikkeforenskoleklasse!
Generelt:BørværemangegangertableSizeførmangjørmodulo-operasjonen.
hashCodeiJavainthashCode()Returnsahashcodevaluefortheobject
hashCodeiJavainthashCode()ReturnsahashcodevaluefortheobjectTypiskenminneadressekonvertertDlint.ForskjelligeobjekterharallDdforskjellighashCode()
hashCodeiJavainthashCode()ReturnsahashcodevaluefortheobjectTypiskenminneadressekonvertertDlint.ForskjelligeobjekterharallDdforskjellighashCode()Menhuskativåranvendelsekandetværeslikattoforskjelligeobjekterskalregnessomlikeogderformåfåsammehashverdi.DeJekanviløsemed@Override
string_hashiPython01arguments:stringobject02returns:hash03funcDonstring_hash:04ifhashcached:05returnit06setlentostring'slength07iniDalizevarppoinDngto1stcharofstringobject08setxtovaluepointedbyple�shi�edby7bits09whilelen>=0:10setvarxto(1000003*x)xorvaluepointedbyp11incrementpointerp12setxtoxxorlengthofstringobject13cachexasthehashsowedon'tneedtocalculateitagain14returnxasthehash
KollisjonshåndteringHvagjørvinårtoelementerhashesDldensammeindeksen?
KollisjonshåndteringHvagjørvinårtoelementerhashesDldensammeindeksen?Åpenhashing:Elementermedsammehashverdisamlesienliste(ellerannenpassendestruktur).
KollisjonshåndteringHvagjørvinårtoelementerhashesDldensammeindeksen?Åpenhashing:Elementermedsammehashverdisamlesienliste(ellerannenpassendestruktur).Lukkethashing:DersomenindekseropptaJ,prøvervienannenindeksinnDlvifinnerensomerledig.
KollisjonshåndteringHvagjørvinårtoelementerhashesDldensammeindeksen?Åpenhashing:Elementermedsammehashverdisamlesienliste(ellerannenpassendestruktur).Lukkethashing:DersomenindekseropptaJ,prøvervienannenindeksinnDlvifinnerensomerledig.NBSleHngavelementerblirenfarligoperasjon.
Åpenhashing(Separatechaining)
Forventerathashfunksjonenergod,slikatallelisteneblirkorte.Load-faktorenλerantallelementerihashtabelleniforholdDltabellstørrelsen.Foråpenhashingønskerviλ≈1.
0123456789
0
25
49 9
81 1
64 4
36 16
Lukkethashing–åpenadressering
PrøveralternaDveindekserh0(x),h1(x),h2(x),…innDlvifinnerensomerledig.
Lukkethashing–åpenadressering
PrøveralternaDveindekserh0(x),h1(x),h2(x),…innDlvifinnerensomerledig.hiergiJved
hi(x)=(hash(x)+f(i))modtableSizeslikatf(0)=0.
Lukkethashing–åpenadressering
PrøveralternaDveindekserh0(x),h1(x),h2(x),…innDlvifinnerensomerledig.hiergiJved
hi(x)=(hash(x)+f(i))modtableSizeslikatf(0)=0.Merkatvitrengerenstørretabellennforåpenhashing–genereltønskerviherλ≈0,5.Skalsepåtremuligestrategier(valgavf):
Lukkethashing–åpenadressering
PrøveralternaDveindekserh0(x),h1(x),h2(x),…innDlvifinnerensomerledig.hiergiJved
hi(x)=(hash(x)+f(i))modtableSizeslikatf(0)=0.Merkatvitrengerenstørretabellennforåpenhashing–genereltønskerviherλ≈0,5.Skalsepåtremuligestrategier(valgavf):• Lineærprøving• KvadraDskprøving• Dobbelhashing
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69
0123456789
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSize
0123456789
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizeStartmedhash(0,x),såmedhash(1,x),osv.innDlInndeksenerledig.
0123456789
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,89)=(89mod10)+0=9+0=9
0123456789
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,89)=(9+0)mod10=9
0123456789 89
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,18)=(8+0)mod10=8
0123456789 89
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,18)=(8+0)mod10=8
0123456789 89
18
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,49)=(9+0)mod10=9
0123456789 89
18
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(1,49)=(49mod10+1)mod10=(9+1)mod10=10mod10=0
0123456789 89
18
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(1,49)=(49mod10+1)mod10=(9+1)mod10=10mod10=0
0123456789 89
18
49
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,58)=(58mod10+0)mod10=(8+0)mod10=8mod10=8
0123456789 89
18
49
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(1,58)=(58mod10+1)mod10=(8+1)mod10=9mod10=9
0123456789 89
18
49
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(2,58)=(58mod10+2)mod10=(8+2)mod10=10mod10=0
0123456789 89
18
49
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(3,58)=(58mod10+3)mod10=(8+3)mod10=11mod10=1
0123456789 89
18
49
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(3,58)=(58mod10+3)mod10=(8+3)mod10=11mod10=1
0123456789 89
18
4958
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(0,69)=(69mod10+0)mod10=(9+0)mod10=9mod10=9
0123456789 89
18
4958
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(1,69)=(69mod10+1)mod10=(9+1)mod10=10mod10=0
0123456789 89
18
4958
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(2,69)=(69mod10+2)mod10=(9+2)mod10=11mod10=1
0123456789 89
18
4958
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(3,69)=(69mod10+3)mod10=(9+3)mod10=12mod10=2
0123456789 89
18
4958
Lineærprøving
VelgerfDlåværeenlineærfunksjonavi,typiskf(i)=iEksempel:Input:89,18,49,58,69Hash-funksjon:
h(x,tableSize)=xmodtableSizehash(i,x)=(h(x,tableSize)+f(i))modtableSizehash(3,69)=(69mod10+3)mod10=(9+3)mod10=12mod10=2
0123456789 89
18
495869
Lineærprøving–nyinput
VelgerfDlåværef(i)=iOppgave:Hvordanblirarrayenmeddenneinput:0,1,4,9,16,25,36,49,64,81Hash-funksjon:hash(i,x)=(xmod10+f(i))mod10
0123456789
Lineærprøving–nyinput
0123456789
0149814251636649
VelgerfDlåværef(i)=iOppgave:Hvordanblirarrayenmeddenneinput:0,1,4,9,16,25,36,49,64,81Hash-funksjon:hash(i,x)=(xmod10+f(i))mod10
Lukkethashingmedkvadra[skprøving
VelgerfDlåværeenkvadra[skfunksjonavi,somo�estf(i)=i2Eksempel:Input:89,18,49,58,69Hash-funksjon:hash(i,key)=(keymod10+f(i))mod10,derf(i)=i2
0123456789
Lukkethashing−dobbelhashing
VelgerfKlåværefunksjonsombrukerennyhashfunksjon,typisk
f(i)=i×[R−(xmodR)]hvorReretprimtallmindreenntableSizeEksempelmedinput:89,18,49,58,69Hash-funksjoner:hash(0,key)=keymod10hash(i,key)=i×[7−(keymod7)](fori=1,2,…)
0123456789
SelvommanlagersofisDkertehash-funksjonervedåpenadressering,risikerermanatselvomdetfinnesledigeindekser,vildealdrifinnes.DeJeskjernårhashfunksjonengirindeksverdiersom«gåriring».DeJekanikkeskjevedenkellineærprøving.
Sekundæropphopning
Hvistabellenblirforfull,begynneroperasjoneneåtaveldiglangDd.Muligløsning:
Rehashing
Hvistabellenblirforfull,begynneroperasjoneneåtaveldiglangDd.Muligløsning:• lagennyhashtabellsomeromtrentdobbeltsåstor
(menfortsaJprimtall!).
Rehashing
Hvistabellenblirforfull,begynneroperasjoneneåtaveldiglangDd.Muligløsning:• lagennyhashtabellsomeromtrentdobbeltsåstor
(menfortsaJprimtall!).• gågjennomhvertelementidenopprinnelige
tabellen,beregndennyehash-verdienogseJinnpåreJplassidennyehashtabellen.
Rehashing
Hvistabellenblirforfull,begynneroperasjoneneåtaveldiglangDd.Muligløsning:• lagennyhashtabellsomeromtrentdobbeltsåstor
(menfortsaJprimtall!).• gågjennomhverelementidenopprinnelige
tabellen,beregndennyehash-verdienogseJinnpåreJplassidennyehashtabellen.
DeSeerendyroperasjon,O(n),menopptrerrelaKvtsjelden(måhahaSn/2innseHngersidenforrigerehashing).
Rehashing
Klassenjava.uDl.HashMap<K,V>:
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)• implementererinterfacetMap
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)• implementererinterfacetMap• brukeråpenhashing
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)• implementererinterfacetMap• brukeråpenhashing• defaulttabellstørrelse16
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)• implementererinterfacetMap• brukeråpenhashing• defaulttabellstørrelse16• load-faktorλ=0,75
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
Klassenjava.uDl.HashMap<K,V>:• implementererentabellsomgiJetobjektavtypeK
(key)gir(mapper)etobjektavtypeV(value)• implementererinterfacetMap• brukeråpenhashing• defaulttabellstørrelse16• load-faktorλ=0,75• rehashinghvisλ≥0,75
JavasHashMap
publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing• vedkollisjonbrukesf(i)=2i
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing• vedkollisjonbrukesf(i)=2i• defaulttabellstørrelse8
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing• vedkollisjonbrukesf(i)=2i• defaulttabellstørrelse8• load-faktorλ=0,75
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing• vedkollisjonbrukesf(i)=2i• defaulttabellstørrelse8• load-faktorλ=0,75• rehashinghvisλ≥0,75
PythonDic[onaries
FrahJps://www.laurentluce.com/posts/python-dicDonary-implementaDon/
• brukerlukkethashing• vedkollisjonbrukesf(i)=2i• defaulttabellstørrelse8• load-faktorλ=0,75• rehashinghvisλ≥0,75• nytabellstørrelseer4×b,derberopptaJeindekser
idengamletabellen.(Førstegangerblik6,siden6/8=0,75)
PythonDic[onaries
map(dicDonary)nøkkelverdihashmaphashtabellhashfunksjonhashkodemodulo-operatorenload-faktorkollisjonshåndtering
åpenhashingseparatechaininglukkethashingåpenadresseringlineærprøvingkvadraDskprøvingsekundæropphopningdobbelhashingrehashing