8 Dynamische Datenstrukturen 2: Heaps und Hashtabellen

Werbung
AlgorithmenundDatenstrukturen
8.DYNAMISCHEDATENSTRUKTUREN2
HEAPSUNDHASHTABELLEN
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
1
AlgorithmenundDatenstrukturen
8.1.HEAPS
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
2
Datenstrukturen
Was ist ein “Heap”?
•  Zwei völlig verschiedene Definitionen von
Heap:
1.  Ein größeres Gebiet im Hauptspeicher, aus
dem Programmierer Blöcke beanspruchen
und wieder freigeben können
2.  Ein balancierter, linksbündiger Binärbaum in
dem kein Knoten einen Wert hat, der größer
ist als der Wert seines Elternknoten
•  Hier nutzen wir die zweite Definition
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
3
Datenstrukturen
Alternative Definition eines balancierten Binärbaumes
•  Terminologie:
–  Jeder Knoten ist in einer Ebene platziert, der Wurzelknoten in
Ebene 0
–  Die Höhe eines Baumes ist die Distanz von seiner Wurzel zum
weitestentfernten Knoten plus 1
–  Ein Knoten ist tiefer als ein anderer Knoten, wenn seine Ebene
eine höhere Zahl hat
•  Ein Binärbaum der Höhe h ist balanciert, wenn alle Knoten der
Ebenen 0 bis h-3 zwei Kinder haben
h-3
h-2
h-1
Balanciert
Balanciert
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
Unbalanciert
4
Datenstrukturen
Linksbündiger, balancierter Binärbaum
•  Ein balancierter Binärbaum der Höhe h ist
linksbünding, wenn:
–  er 2k Knoten in der Ebene k hat
für alle k < h-1,
und alle Blätter der Ebene h-1 sind so weit
links wie möglich
h-1
Linksbündig
Nicht linksbündig
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
5
Datenstrukturen
Die Heap Eigenschaft
• Ein Knoten hat die Heap-Eigenschaft, wenn der Wert in
dem Knoten so groß oder größer ist als die Werte
seiner Kinder
12
8
12
3
Blauer Knoten
hat die HeapEigenschaft
8
12
12
Blauer Knoten
hat die HeapEigenschaft
8
14
Blauer Knoten hat
die HeapEigenschaft nicht
•  Alle Blattknoten haben automatisch die Heap
Eigenschaft
•  Ein Binärbaum ist ein Heap, wenn alle Knoten die
Heap-Eigenschaft besitzen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
6
Datenstrukturen
Anmerkung
•  EinHeapistkein(binärer)Suchbaum!
•  DasSorJerkriteriumbeiSuchbäumenwar
–  DerWerteinesKnotensiststetsgrößeralsdieWerteder
Knoten,dieimlinkenTeilbaumliegen
–  DerWerteinesKnotensiststetskleineralsdieWerteder
Knoten,dieimrechtenTeilbaumliegen
•  DasSorJerkriteriumbeiHeapsist:
–  DerWerteinesKnotensiststetsgrößer/gleichalsdie
WertederKnoten,dieinbeidenTeilbäumenliegen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
7
Datenstrukturen
Vorgehensweise
•  Erst: wie transformiere ich einen Binärbaum in
einen Heap?
•  Dann: wie transformiere ich einen Binärbaum in
einen Heap nachdem er verändert wurde?
•  Schließlich: wie kann man diese Ideen nutzen,
um einen Array zu sortieren?
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
8
Algorithmen
siIUp(wörtlichübersetzt:„hochsieben“)
•  Wenn ein Knoten nicht die Heap-Eigenschaft hat, dann kann
man ihm diese verleihen, indem man seinen Wert mit dem
Wert des größeren Kindes tauscht
12
8
14
14
Blauer Knoten hat die
Heap-Eigenschaft nicht
8
12
Blauer Knoten
hat die HeapEigenschaft
•  Das nennt man “sifting up”
•  Das Kind kann dadurch die Heap-Eigenschaft verlieren!
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
9
Algorithmen
Konstruktion eines Heaps I
•  Ein Baum, der nur aus einem Knoten besteht,
ist ein Heap
•  Wir konstruieren einen Heap durch
inkrementelles Hinzufügen von Knoten:
–  Füge den Knoten rechts von dem Knoten ein, der
am tiefsten und am weitesten rechts steht
–  Wenn die tiefste Ebene voll ist, dann beginne eine
neue Ebene
•  Beispiele:
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
10
Algorithmen
Konstruktion eines Heaps II
•  Jedesmal wenn wir einen Knoten hinzufügen, kann
die Heap-Eigenschaft des Eltern-Knoten zerstört
werden
–  Sift-up!
•  Bei jedem Sift-up wächst der Wert des
obenliegenden Knotens und das kann die HeapEigenschaft seines Elterknotens zerstören
•  Sift-up wird wiederholt im Baum nach oben
durchgeführt bis entweder
–  man einen Knoten erreicht, dessen Werte nicht
ausgetauscht werden müssen, weil der Elterknoten immer
noch größer ist als beide Kinder, oder
–  man den Wurzelknoten errreicht.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
11
Algorithmen
Konstruktion eines Heaps III
8
8
10
10
8
1
12
8
5
2
10
8
10
3
10
5
12
12
5
8
10
8
4
Erinnerung:Immerlinksbündigeinfügen!
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
5
12
Algorithmen
Andere Kinder sind nicht betroffen
12
10
8
12
5
14
14
8
14
5
12
10
8
5
10
•  Der Knoten mit Wert 8 ist nicht betroffen, da sein Elternknoten größer wird,
nicht kleiner.
•  Der Knoten mit Wert 5 ist nicht betroffen, da sein Elterknoten größer wird,
nicht kleiner.
•  Der Knoten mit Wert 8 ist immer noch nicht betroffen. Obwohl sein
Elternknoten kleiner wird, ist es immer noch größer als am Anfang.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
13
Algorithmen
Ein Beispiel-Heap
•  Ein beispielhafter Binärbaum als Heap
25
22
19
18
17
22
14
21
14
3
9
15
11
•  Den Binärbaum in einen Heap zu verwandeln, ändert nicht die
Gestalt des Baumes; dieser Binärbaum ist balanciert und
linksbündig, weil er am Anfang balanciert und linksbündig war.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
14
Algorithmen
Entfernung des Wurzelknotens
•  Die größte Zahl ist im Wurzelknoten
•  Nehmen wir an, wir entfernen die Wurzel:
11
22
19
18
17
22
14
21
14
3
9
15
11
•  Wie können wir den Binärbaum so reparieren, dass er erneut
balanciert und linksbündig ist?
•  Lösung: entferne den am weitesten rechts gelegenen
Blattknoten in der größten Tiefe und benutze ihn als
Wurzelknoten
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
15
Algorithmen
DiereHeapMethodeI
•  Der Baum ist balanciert und linksbündig, aber kein Heap
•  Aber: nur dem Wurzelknoten fehlt die Heap-Eigenschaft
11
22
19
18
17
22
14
21
14
3
15
9
•  Wir können siftUp() auf dem Wurzelknoten ausführen
•  Anschließend hat genau ein Kind die Heap-Eigenschaft
verloren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
16
Algorithmen
DiereHeapMethodeII
•  Nun fehlt dem linken Kind des Wurzelknotens die HeapEigenschaft (der mit dem Wert 11)
22
11
19
18
17
22
14
21
14
3
15
9
•  siftUp() diesen Knoten
•  Wiederum verliert genau ein Kind die Heap-Eigenschaft
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
17
Algorithmen
DiereHeapMethodeIII
•  Nun fehlt dem rechten Kind des linken Kindes des
Wurzelknotens die Heap-Eigenschaft (der mit dem Wert 11)
22
22
19
18
17
11
14
21
14
3
15
9
•  siftUp() diesen Knoten
•  Jetzt könnte ein Kind die Heap-Eigenschaft verloren haben –
das ist aber nicht der Fall, da es ein Blattknoten ist
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
18
Algorithmen
DiereHeapMethodeIV
•  Der Baum ist wieder ein Heap, da jeder Knoten die HeapEigenschaft besitzt
22
22
19
18
17
21
14
11
14
3
15
9
•  Der größte Werte ist wieder im Wurzelknoten
•  Wir können den Prozess wiederholen, bis der Baum leer ist
•  Dies liefert eine Folge der Werte, zuerst die größten, dann die
kleinsten
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
19
Algorithmen
Sortieren
•  Was haben Heaps mit Sortieren zu tun?
•  Der interessante Teil:
–  Weil der Binärbaum balanciert und linksbündig ist,
kann er leicht als Array repräsentiert werden
–  Alle Operationen auf Binärbäumen können als
Operationen auf Arrays formuliert werden
–  Zum Sortieren:
  Mache das Array zum Heap;
  while das Array nicht leer ist {
 
entferne und ersetze die Wurzel;
 
reheap den neuen Wurzelknoten;
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
20
Algorithmen
Abbildung in einen Array
25
22
17
19
18
0
22
14
1
2
14
21
3
4
3
5
6
9
7
8
15
11
9
10
25 22 17 19 22 14 15 18 14 21 3
11
12
9 11
•  Bemerkungen:
–  Das linke Kind von Index i ist bei Index 2*i+1
–  Das rechte Kind von Index i ist bei Index 2*i+2
–  Beispiel: die Kinder von Knoten 3 (19) sind 7 (18) und 8 (14)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
21
Algorithmen
Entfernen und Ersetzen des Wurzelknotens
•  Der Wurzelknoten ist das erste Element im Array
•  Der Knoten in der tiefsten Ebene, der am weitesten rechts gelegen
ist, ist das letzte Element
•  Tausche die beiden ...
0
1
2
3
4
5
6
7
8
9
10
11
25 22 17 19 22 14 15 18 14 21 3
0
1
2
3
4
5
6
7
8
9
12
9 11
10
11
11 22 17 19 22 14 15 18 14 21 3
12
9 25
•  ...und tue so als würde das letzte Element im Array nicht mehr existieren – der
neue letzte Indexeintrag ist nun 11 (9)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
22
Algorithmen
Reheap und Wiederhole
•  Mache Wurzelknoten zum Heap-Knoten (Index 0, enthält die 11)...
0
1
2
3
4
5
6
7
8
9
10
11 22 17 19 22 14 15 18 14 21 3
0
1
2
3
4
5
6
7
8
9
10
22 22 17 19 21 14 15 18 14 11 3
0
1
2
3
4
5
6
7
8
9
10
11
12
9 25
11
12
9 25
11
12
9 22 17 19 21 14 15 18 14 11 3 22 25
•  ...und entferne und ersetze den Wurzelknoten wieder!
•  Aber: der höchste Indexwert hat sich geändert!
•  Wiederhole die Prozedur, bis der höchste Indexwert auf 0 liegt
– und das Array damit sortiert ist!
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
23
Algorithmen
HeapSort:PseudoCode
Mache das Array zum Heap;
Mache
Array
zumist
Heap;
Whiledas
das
Array
nicht leer {
While das Array ist nicht leer {
  Entferne
ersetzeden
den
Wurzelknoten;
 Entferneund
und ersetze
Wurzelknoten;
 reheapden
den neuen
neuen Wurzelknoten;
  reheap
Wurzelknoten;
}
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
24
Algorithmen
HeapSortinJava
class HeapSort implements Sort{
ErstelleHeapausArray
void execute(int[] f){
makeHeap(f);
for(int i = f.length - 1; i > 0; i--){
swap(f,0,i);
„EnYerne“Wurzel
reHeap(f,i-1);
RepariereHeap(bis
}
Indexi-1)
}
void swap(int[] f, int x, int y){
int tmp = f[x];
f[x] = f[y];
f[y] = tmp;
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
25
Algorithmen
HeapSortinJava:makeHeap
void makeHeap(int[] f){
for(int i = 1; i < f.length; i++)
siftUp(f,i);
FügeElementedemHeaphinzu
undrepariereHeap(bo5om-up)
}
void siftUp(int[] f, int idx){
RekursionsendebeiWurzel
if(idx == 0)
return;
int parent=(int)Math.floor((new Double(idx)-1)/2);
if(f[parent] < f[idx]){
swap(f,idx, parent);
VergleicheWertdesKnotensmit
Elternknoten;tauschebeiBedarf
siftUp(f,parent);
undfahrebeimEltenknotenfort
}
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
26
Algorithmen
HeapSortinJava:reHeap
void reHeap(int[] f, int end){
int current = 0;
while(current < end){
int childLeft = 2*current + 1;
int childRight = 2*current + 2;
if(childLeft > end)
return;
if(childRight <= end){
if(f[current] >= f[childLeft] && f[current] >= f[childRight])
return;
else if(f[childLeft] > f[childRight]){
swap(f,current,childLeft);
current = childLeft;
}else{
swap(f,current,childRight);
current = childRight;
}
}else if(f[current] >= f[childLeft])
return;
else{
swap(f,current,childLeft);
current = childLeft;
}
}
}
RepariereHeaptop-down
FallscurrentBla5ist,sindwirferJg
Heap-Eigenschaaerfüllt,
nichtsmehrzutun
VergleichemitWertenderKinder,
tauscheggfs.undfahretop-downfort
Heap-Eigenschaaerfüllt,
nichtsmehrzutun
VergleichemitWertenderKinder,
tauscheggfs.undfahretop-downfort
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
27
Analysen
Analyse
Lemma
DerAufrufmakeHeap(f)machtausfeinenHeap,d.h.
fürallei=0,...,kgiltf[i]≥f[2i+1]undf[i]≥f[2i+2],wobei
void makeHeap(int[] f){
k=(f.length-2)/2.
for(int i = 1; i < f.length; i++)
siftUp(f,i);
}
Beweis:
siftUp(int[] f, int idx){
DurchIndukJonnachi=f.length-1: void if(idx
== 0)
return;
int parent=(int)Math.floor((new
•  i=0:Einein-elemenJgesArray Double(idx)-1)/2);
if(f[parent] < f[idx]){
swap(f,idx, parent);
iststetseinHeapnach
siftUp(f,parent);
}
DefiniJon
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
28
Analysen
Analyse
void makeHeap(int[] f){
for(int i = 1; i < f.length; i++)
siftUp(f,i);
}
•  i-1->i:NachIndukJons-
voraussetzungistf[0..i-1]
void siftUp(int[] f, int idx){
if(idx == 0)
einHeap.InderMethode
return;
int parent=(int)Math.floor((new
siaUp(f,idx)wird
Double(idx)-1)/2);
if(f[parent] < f[idx]){
swap(f,idx, parent);
zunächstdasneueElement
siftUp(f,parent);
}
mitseinemElterverglichen.
}
Ggfs.werdendieWerte
getauschtundeswirdbo5om-upfortgefahren.Da
einKnotendadurchhöchstenseinengrößerenWert
erhältbleibtdieHeap-Eigenschaabestehen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
29
Analysen
Analyse
Lemma
Istf[0...i-1]einHeapbeidemmaximalfürden
WurzelknotendieHeap-Eigenschaaverletztist,soist
nachreHeap(f,i-1)dasArrayf[0...i-1]einHeap.
Beweis:
InreHeapwirdzunächstderWurzelknotenmitseinen
beidenKindernverglichen.IstderWertderWurzel
nichtkleineralsdieWertebeiderKinder,soterminiert
dieMethode.Damitistf[0...i-1]einHeap.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
30
Analysen
Analyse
AndernfallswirdderWertderWurzelmitdemgrößten
WertseinerKindervertauscht,dieHeap-Eigenschaaist
damitanderWurzelwiederhergestellt.Anschliessend
wirditeraJvmitdemvertauschtenKindfortgefahren.
NachIndukJonfolgtdann,dassf[0...i-1]amEndeein
Heapist.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
31
Analysen
Analyse
Theorem
DerAlgorithmusheapSortlöstdasProblemdes
vergleichsbasiertenSorJerens.
Beweis:
FolgtdirektausdenvorherigenbeidenLemmataund
derBeobachtung,dassinjedemSchri5derheapSortMethodedasgrößteElementandasEndedesArrays
getauschtwirdundnurnocheinumeinsverkleinertes
Arraybetrachtetwird.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
32
Analysen
Analyse
Theorem
DerAlgorithmusheapSort(f)terminiertfürjede
EingabefnachendlicherZeit.
Beweis
DieHauptmethodeheapSortverfügtübereine
konstanteAnzahlanSchleifendurchläufen.Injedem
rekursivenAufrufvonmakeHeapwirdderIndexecht
verringert,beiIndex0istderRekursionsanfang
erreicht.InreHeapwirddieVariablecurrentinjedem
Durchgangummindestens1erhöhtundbeiErreichen
von„end“wirdabgebrochen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
33
Analysen
Analyse
Theorem
DerAlgorithmusheapSorthateinenAufwandvon
O(nlogn),sowohlfürdenbesten,schlechtesten,und
mi5lerenFall.
Beweis
FürmakeHeapgilt:
WirfügenjedendernKnotendazu
–  AufjedenKnotenwirdsiaUpausgeführt–
möglicherweisebiszumWurzelknoten
–  DaderBinärbaumperfektbalanciertist,benöJgt
siaUp()aufeinemeinzelnenKnotenO(logn)Zeit
–  Weilwirdasn-malmachen,benöJgenwirn*O(logn)
vielZeit,d.h.O(nlogn)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
34
Analysen
Analyse
Für
for(int i = f.length - 1; i > 0; i--){
swap(f,0,i);
reHeap(f,i-1);
}
gilt:
•  DieSchleifewirdn-mal(genauern-1mal)durchlaufen,
weilwirimmereinendernKnotenenYernen
•  EnYernenundErsetzendesWurzelknotensbeansprucht
O(1)vielZeit
•  DeswegenbeträgtdieGesamtzeitn,fürdasEnYernen
undErsetzen(ohnereHeap)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
35
Analysen
Analyse
•  UmreheapaufdenWurzelknotenauszuführen,müssenwir
einenPfadvonderWurzelbiszueinemBla5knotenverfolgen
(eventuellkönnenwirfrüherauwören)
•  DerBinärbaumistperfektbalanciert
•  DeswegenistdieserPfadO(logn)lang
–  UndwirführennurO(1)OperaJonenaufjedemKnoten
aus
–  DeswegenbenöJgtreheapO(logn)vielZeit
•  Weilwirreheapinnerhalbeinerwhile-Schleifeausführen,
benöJgenwirhierfürO(nlogn)
DieGesamtzeitistdeswegen:
O(nlogn)+O(nlogn)=O(nlogn)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
36
AlgorithmenundDatenstrukturen
8.1HEAPS
ZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
37
Zusammenfassung
•  Heaps sind
–  binäre,linksbündige,balancierteBäume
–  jederKnotendesBaumeserfülltdie„Heap“-Eigenschaa:
•  DerWertdesKnotensistnichtkleineralsdieWerteseinerKinder
•  Heaps implementieren eine Baumstruktur auf Arrays
•  Anwendung HeapSort
–  Interpretiere Array als Baum und mache ihn zum Heap
(Aufruf „siftUp“ für jeden Knoten)
–  Entferne die Wurzel (=maximales Element) und repariere
den Heap („reHeap“)
–  Iteriere bis der Baum leer ist
–  Aufwand O(n log n)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
38
AlgorithmenundDatenstrukturen
8.2.HASHTABELLEN
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
39
Datenstrukturen
Problemstellung
Gesucht:
DynamischeDatenstrukturmitsehrschnellemdirekten
ZugriffaufElemente
IdeeHashfunkJon:
•  NutzeeinFeld0bisN-1(z.B.Array),einzelne
PosiJonenoaals„Buckets“bezeichnet
•  HashfunkJonh(e)besJmmtfürElementedie
PosiJonimFeld
–  h(e)istschnellberechenbar
–  h(e)≠h(e‘)wenne≠e‘
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
40
Datenstrukturen
Beispiel
•  Beispiel:Arrayvon0bis9,h(i)=imod10
•  ArraynachEinfügenvon42und119
Vorteil vom Hashing:
Anfragen der Form „Enthält die
Datenstruktur das Element 42?“
sind schnell beantwortbar
Anmerkung:
Hashtabellen verhalten sich zu binären
Suchbäumen ähnlich wie
BucketSort zu vergleichsbasierten
Sortierverfahren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
41
Datenstrukturen
Beispiel
•  Beispiel:Arrayvon0bis9,h(i)=imod10
•  ArraynachEinfügenvon42und119
Was tun wenn „62“ eingefügt
werden soll?
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
42
Datenstrukturen
Hashfunk]onen
•  HängenvomDatentypderElementeundkonkreter
Anwendungenab
•  FürIntegeroa
h(i)=imodN
•  funkJonierti.A.gut,wennNeinePrimzahlist
•  hängtmitMethodenzurErzeugungvonZufallszahlenzusammen
•  FürandereDatentypen:RückführungaufInteger
–  Fließpunkt-Zahlen:AddiereManJsseundExponent
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
43
Datenstrukturen
Hashfunk]onen:Anforderungen
•  DieHash-Wertesollengut„streuen“
•  EventuellvonBesonderheitenderEingabewerte
abhängig
–  Z.B.BuchstabendesAlphabetsinNamentauchen
unterschiedlichhäufigauf
•  DieHash-Wertemüsseneffizientberechenbarsein
–  KonstanterZeitbedarferfordert
(nichtabhängigvonderAnzahldergespeichertenWerte)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
44
Datenstrukturen
Ungüns]geHashfunk]onen
•  Beispiel
–  MatrikelnummerninHashtabellemit100Einträgen
–  Variantea:erstebeidenStellenalsHashwert
→AbbildungaufwenigeBuckets
–  Varianteb:letztebeidenStellen
→gleichmäßigeVerteilung
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
45
Algorithmen
Kollisionsstrategien
•  Verke5ungderÜberläuferbeiKollisionen
•  Sondieren(SucheneineralternaJvenPosiJon)
–  LinearesSondieren
–  QuadraJschesSondieren
–  DoppeltesHashen,Sondierenmit„Zufallszahlen“,…
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
46
Algorithmen
Verke^ungderÜberläufer
•  Idee:alleEinträgeeinerArray-PosiJonwerdenineiner
verke5etenListeverwaltet
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
47
Algorithmen
LinearesSondieren
•  Idee:fallsIndexh(e)besetztist,versuche
h(e)+1, h(e)+2,h(e)+3,…,h(e)+i,...
•  Varianten
–  h(e)+c, h(e)+2c,h(e)+3c,…fürKonstantec
–  h(e)+1, h(e)-1,h(e)+2,h(e)-2,…
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
48
Algorithmen
LinearesSondieren
Wie findet man nun die Antwort auf die Frage „Enthält die Struktur die Zahl 69“?
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
49
Algorithmen
Quadra]schesSondieren
•  Idee:fallsh(e)besetztist,versuche
h(e)+1, h(e)+4,h(e)+9,…,h(e)+i2,…
•  Variante:
h(e)+1, h(e)-1,h(e)+4,h(e)-4,…
•  AnfälliggegenüberfalschgewähltemN(Feldgröße)
–  BeispielN=16:
SondierenistzyklischohnealleElementezutesten
–  WählePrimzahlenfürN
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
50
Algorithmen
Quadra]schesSondieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
51
Analysen
AufwandbeimHashen
•  BeigeringerKollisionswahrscheinlichkeit:
–  SucheninO(1)
–  EinfügeninO(1)
–  LöschenbeiSondierverfahren:
•  nurMarkierenderEinträgealsgelöscht(O(1))oder
•  „Rehashen“dergesamtenTabellenotwendig(O(n))
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
52
Analysen
AufwandbeimHashen:verke^eteÜberläufer
•  Füllgrad(loadfactor)α=m/N
–  mAnzahlgespeicherterElemente
–  NAnzahlBuckets
•  ErfolgloseSuche(HashingmitÜberlaufliste):Θ(1+α)
•  ErfolgreicheSucheebenfallsindieser
Größenordnung
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
53
Analysen
AufwandbeimHashen:Sondieren
•  WahrscheinlichkeitenbasierenaufFüllgradα
–  Bucketbelegt:Wahrscheinlichkeitα
–  BucketbelegtundsondiertesBucketauchbelegt:ungefährα2,
etc.
2
1
3
1 + ↵ + ↵ + ↵ + ... =
1
↵
•  ErfolgreicheSuchebesser,abergleicheGrößenordnung
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
54
Datenstrukturen
HasheninJava
•  ZahlreichevordefinierteKlassenundMethodenzur
UnterstützungvonHashing
–  VordefinierteHashfunkJonenfürbeliebigeObjekte
–  HashbasierteDatenstrukturen(Maps,Sets,etc.)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
55
Datenstrukturen
UnterstützungdurchJava
•  VordefinierteMethodezurBerechnungeines
Hashwertes:
int java.lang.Object.hashCode()
•  Kannüberschriebenwerden
–  BeijedemAufrufgleicherWert
–  GleicheObjektelieferngleichenHashwert
•  VergleicheEquals-Methode
•  Default-ImplemenJerunginJava:
–  SpeicheradressedesObjektes
–  Fürjava.lang.String:
h(s)=s[0]*31(n-1)+s[1]*31(n-2)+!+s[n-1]
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
56
Datenstrukturen
Datenstruktureninjava.util
•  Hashtable<K,V>:Array-basierteImplemenJerung
einerHashtabellemitverke5eterListeals
Kollisionsbehandlung(keinSondiereninirgendeiner
Javaklasse),RehashingundSteuerungderTabellengröße
undmaximalenloadFactor(effizientbis0.75)
•  HashMap<K,V>:ähnlichHashtable,erlaubtabernull
alsSchlüssel
•  LinkedHashMap<K,V>:verwaltetzusätzlicheine
doppeltverke5eteListezumErhaltender
Einfügereihenfolge
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
57
Datenstrukturen
Datenstruktureninjava.util
•  HashSet<E>:HashMap-basierteImplemenJerung
einerMengemitO(1)AufwandfürLookup.
•  LinkedHashSet<E>:LinkedHashMap-basierte
ImplemenJerungeinerMenge.
•  IdentityHashMap<K,V>:Hash-Tabelleunter
VerwendungderGleichheitderObjektreferenzsta5
derGleichheitderObjektwerte
–  WeakHashMap<K,V>:Hash-Tabelle,ausderals
ReferenzgelöschteElementeautomaJschgelöscht
werden.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
58
AlgorithmenundDatenstrukturen
8.2HASHTABELLEN
ZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
59
Zusammenfassung
•  Hashfunktion: Zuordnung eines Elements zu
einem HashWert
•  Leseoperationen im besten Fall in O(1) möglich
•  Kollisionsstrategien:
–  Verkettung der Überläufer
–  Sondieren: linear, quadratisch
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
60
Herunterladen