Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
8.DYNAMISCHEDATENSTRUKTUREN2HEAPSUNDHASHTABELLEN
AlgorithmenundDatenstrukturen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 1
8.1.HEAPSAlgorithmenundDatenstrukturen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 2
Was ist ein “Heap”?
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 3
• 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
Datenstrukturen
Alternative Definition eines balancierten Binärbaumes
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 4
• 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
Balanciert Balanciert Unbalanciert
h-3 h-2 h-1
Datenstrukturen
Linksbündiger, balancierter Binärbaum
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 5
• 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
Linksbündig Nicht linksbündig h-1
Datenstrukturen
Die Heap Eigenschaft
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 6
• Ein Knoten hat die Heap-Eigenschaft, wenn der Wert in dem Knoten so groß oder größer ist als die Werte seiner Kinder
• Alle Blattknoten haben automatisch die Heap Eigenschaft
• Ein Binärbaum ist ein Heap, wenn alle Knoten die Heap-Eigenschaft besitzen
12
8 3 Blauer Knoten hat die Heap-Eigenschaft
12
8 12 Blauer Knoten hat die Heap-Eigenschaft
12
8 14 Blauer Knoten hat die Heap-Eigenschaft nicht
Datenstrukturen
Anmerkung
• EinHeapistkein(binärer)Suchbaum!• DasSorJerkriteriumbeiSuchbäumenwar
– DerWerteinesKnotensiststetsgrößeralsdieWertederKnoten,dieimlinkenTeilbaumliegen
– DerWerteinesKnotensiststetskleineralsdieWertederKnoten,dieimrechtenTeilbaumliegen
• DasSorJerkriteriumbeiHeapsist:– DerWerteinesKnotensiststetsgrößer/gleichalsdieWertederKnoten,dieinbeidenTeilbäumenliegen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 7
Datenstrukturen
Vorgehensweise
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 8
• 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?
Datenstrukturen
siIUp(wörtlichübersetzt:„hochsieben“)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 9
• 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
• Das nennt man “sifting up” • Das Kind kann dadurch die Heap-Eigenschaft verlieren!
14
8 12 Blauer Knoten hat die Heap-Eigenschaft
12
8 14 Blauer Knoten hat die Heap-Eigenschaft nicht
Algorithmen
Konstruktion eines Heaps I
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 10
• 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:
Algorithmen
Konstruktion eines Heaps II
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 11
• 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 Heap-Eigenschaft 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.
Algorithmen
Konstruktion eines Heaps III
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 12
8 8
10
10
8
10
8 5
10
8 5
12
10
12 5
8
12
10 5
8
1 2 3
4
Erinnerung:Immerlinksbündigeinfügen!
Algorithmen
Andere Kinder sind nicht betroffen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 13
• 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.
12
10 5
8 14
12
14 5
8 10
14
12 5
8 10
Algorithmen
Ein Beispiel-Heap
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 14
• Ein beispielhafter Binärbaum als Heap
• 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.
19
14 18
22
3 21
14
11 9
15
25
17 22
Algorithmen
Entfernung des Wurzelknotens
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 15
• Die größte Zahl ist im Wurzelknoten • Nehmen wir an, wir entfernen die Wurzel:
• 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
19
14 18
22
3 21
14
11 9
15
17 22
11
Algorithmen
DiereHeapMethodeI
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 16
• Der Baum ist balanciert und linksbündig, aber kein Heap • Aber: nur dem Wurzelknoten fehlt die Heap-Eigenschaft
• Wir können siftUp() auf dem Wurzelknoten ausführen • Anschließend hat genau ein Kind die Heap-Eigenschaft
verloren
19
14 18
22
3 21
14
9
15
17 22
11
Algorithmen
DiereHeapMethodeII
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 17
• Nun fehlt dem linken Kind des Wurzelknotens die Heap-Eigenschaft (der mit dem Wert 11)
• siftUp() diesen Knoten • Wiederum verliert genau ein Kind die Heap-Eigenschaft
19
14 18
22
3 21
14
9
15
17 11
22
Algorithmen
DiereHeapMethodeIII
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 18
• Nun fehlt dem rechten Kind des linken Kindes des Wurzelknotens die Heap-Eigenschaft (der mit dem Wert 11)
• siftUp() diesen Knoten • Jetzt könnte ein Kind die Heap-Eigenschaft verloren haben – das ist aber nicht der Fall, da es ein Blattknoten ist
19
14 18
11
3 21
14
9
15
17 22
22
Algorithmen
DiereHeapMethodeIV
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 19
• Der Baum ist wieder ein Heap, da jeder Knoten die Heap-Eigenschaft besitzt
• 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
19
14 18
21
3 11
14
9
15
17 22
22
Algorithmen
Sortieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 20
• 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;
}
Algorithmen
Abbildung in einen Array
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 21
• 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)
19
14 18
22
3 21
14
11 9
15
25
17 22
25 22 17 19 22 14 15 18 14 21 3 9 11 0 1 2 3 4 5 6 7 8 9 10 11 12
Algorithmen
Entfernen und Ersetzen des Wurzelknotens
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 22
• 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 ...
• ...und tue so als würde das letzte Element im Array nicht mehr existieren – der neue letzte Indexeintrag ist nun 11 (9)
25 22 17 19 22 14 15 18 14 21 3 9 11 0 1 2 3 4 5 6 7 8 9 10 11 12
11 22 17 19 22 14 15 18 14 21 3 9 25 0 1 2 3 4 5 6 7 8 9 10 11 12
Algorithmen
Reheap und Wiederhole
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 23
• Mache Wurzelknoten zum Heap-Knoten (Index 0, enthält die 11)...
• ...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!
22 22 17 19 21 14 15 18 14 11 3 9 25 0 1 2 3 4 5 6 7 8 9 10 11 12
9 22 17 19 21 14 15 18 14 11 3 22 25 0 1 2 3 4 5 6 7 8 9 10 11 12
11 22 17 19 22 14 15 18 14 21 3 9 25 0 1 2 3 4 5 6 7 8 9 10 11 12
Algorithmen
HeapSort:PseudoCode
Mache das Array zum Heap; While das Array ist nicht leer { Entferne und ersetze den Wurzelknoten; reheap den neuen Wurzelknoten; }
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 24
Mache das Array zum Heap; While das Array ist nicht leer {
Entferne und ersetze den Wurzelknoten; reheap den neuen Wurzelknoten;
}
Algorithmen
HeapSortinJava
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 25
class HeapSort implements Sort{void execute(int[] f){
makeHeap(f);for(int i = f.length - 1; i > 0; i--){
swap(f,0,i);reHeap(f,i-1);
}}
void swap(int[] f, int x, int y){int tmp = f[x];f[x] = f[y];f[y] = tmp;
}
ErstelleHeapausArray
„EnYerne“Wurzel
RepariereHeap(bisIndexi-1)
Algorithmen
HeapSortinJava:makeHeap
void makeHeap(int[] f){for(int i = 1; i < f.length; i++)
siftUp(f,i);}
void siftUp(int[] f, int idx){if(idx == 0)
return;int parent=(int)Math.floor((new Double(idx)-1)/2);if(f[parent] < f[idx]){
swap(f,idx, parent);siftUp(f,parent);
}}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 26
FügeElementedemHeaphinzuundrepariereHeap(bo5om-up)
RekursionsendebeiWurzel
VergleicheWertdesKnotensmitElternknoten;tauschebeiBedarfundfahrebeimEltenknotenfort
Algorithmen
HeapSortinJava:reHeapvoid 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;
}}
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 27
RepariereHeaptop-down
FallscurrentBla5ist,sindwirferJg
Heap-Eigenschaaerfüllt,nichtsmehrzutun
VergleichemitWertenderKinder,tauscheggfs.undfahretop-downfort
Heap-Eigenschaaerfüllt,nichtsmehrzutun
VergleichemitWertenderKinder,tauscheggfs.undfahretop-downfort
Algorithmen
Analyse
LemmaDerAufrufmakeHeap(f)machtausfeinenHeap,d.h.fürallei=0,...,kgiltf[i]≥f[2i+1]undf[i]≥f[2i+2],wobeik=(f.length-2)/2.Beweis:DurchIndukJonnachi=f.length-1:• i=0:Einein-elemenJgesArrayiststetseinHeapnachDefiniJon
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 28
void makeHeap(int[] f){for(int i = 1; i < f.length; i++)
siftUp(f,i);}
void siftUp(int[] f, int idx){if(idx == 0)
return;int parent=(int)Math.floor((new
Double(idx)-1)/2);if(f[parent] < f[idx]){
swap(f,idx, parent);siftUp(f,parent);
}}
Analysen
Analyse
• i-1->i:NachIndukJons-voraussetzungistf[0..i-1]einHeap.InderMethodesiaUp(f,idx)wirdzunächstdasneueElementmitseinemElterverglichen.Ggfs.werdendieWertegetauschtundeswirdbo5om-upfortgefahren.DaeinKnotendadurchhöchstenseinengrößerenWerterhältbleibtdieHeap-Eigenschaabestehen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 29
void makeHeap(int[] f){for(int i = 1; i < f.length; i++)
siftUp(f,i);}
void siftUp(int[] f, int idx){if(idx == 0)
return;int parent=(int)Math.floor((new
Double(idx)-1)/2);if(f[parent] < f[idx]){
swap(f,idx, parent);siftUp(f,parent);
}}
Analysen
Analyse
LemmaIstf[0...i-1]einHeapbeidemmaximalfürdenWurzelknotendieHeap-Eigenschaaverletztist,soistnachreHeap(f,i-1)dasArrayf[0...i-1]einHeap.Beweis:InreHeapwirdzunächstderWurzelknotenmitseinenbeidenKindernverglichen.IstderWertderWurzelnichtkleineralsdieWertebeiderKinder,soterminiertdieMethode.Damitistf[0...i-1]einHeap.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 30
Analysen
Analyse
AndernfallswirdderWertderWurzelmitdemgrößtenWertseinerKindervertauscht,dieHeap-EigenschaaistdamitanderWurzelwiederhergestellt.AnschliessendwirditeraJvmitdemvertauschtenKindfortgefahren.NachIndukJonfolgtdann,dassf[0...i-1]amEndeeinHeapist.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 31
Analysen
Analyse
TheoremDerAlgorithmusheapSortlöstdasProblemdesvergleichsbasiertenSorJerens.Beweis:FolgtdirektausdenvorherigenbeidenLemmataundderBeobachtung,dassinjedemSchri5derheapSort-MethodedasgrößteElementandasEndedesArraysgetauschtwirdundnurnocheinumeinsverkleinertesArraybetrachtetwird.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 32
Analysen
Analyse
TheoremDerAlgorithmusheapSort(f)terminiertfürjedeEingabefnachendlicherZeit.BeweisDieHauptmethodeheapSortverfügtübereinekonstanteAnzahlanSchleifendurchläufen.InjedemrekursivenAufrufvonmakeHeapwirdderIndexechtverringert,beiIndex0istderRekursionsanfangerreicht.InreHeapwirddieVariablecurrentinjedemDurchgangummindestens1erhöhtundbeiErreichenvon„end“wirdabgebrochen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 33
Analysen
Analyse
TheoremDerAlgorithmusheapSorthateinenAufwandvonO(nlogn),sowohlfürdenbesten,schlechtesten,undmi5lerenFall.BeweisFürmakeHeapgilt:WirfügenjedendernKnotendazu
– AufjedenKnotenwirdsiaUpausgeführt–möglicherweisebiszumWurzelknoten
– DaderBinärbaumperfektbalanciertist,benöJgtsiaUp()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üssenwireinenPfadvonderWurzelbiszueinemBla5knotenverfolgen(eventuellkönnenwirfrüherauwören)
• DerBinärbaumistperfektbalanciert• DeswegenistdieserPfadO(logn)lang
– UndwirführennurO(1)OperaJonenaufjedemKnotenaus
– DeswegenbenöJgtreheapO(logn)vielZeit• Weilwirreheapinnerhalbeinerwhile-Schleifeausführen,
benöJgenwirhierfürO(nlogn)DieGesamtzeitistdeswegen:O(nlogn)+O(nlogn)=O(nlogn)AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 36
Analysen
8.1HEAPSZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen
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
8.2.HASHTABELLEN
AlgorithmenundDatenstrukturen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 39
Problemstellung
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 40
Gesucht:DynamischeDatenstrukturmitsehrschnellemdirektenZugriffaufElementeIdeeHashfunkJon:• NutzeeinFeld0bisN-1(z.B.Array),einzelnePosiJonenoaals„Buckets“bezeichnet
• HashfunkJonh(e)besJmmtfürElementediePosiJonimFeld– h(e)istschnellberechenbar– h(e)≠h(e‘)wenne≠e‘
Datenstrukturen
Beispiel
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 41
• 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
Datenstrukturen
Beispiel
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 42
• Beispiel:Arrayvon0bis9,h(i)=imod10• ArraynachEinfügenvon42und119
Was tun wenn „62“ eingefügt werden soll?
Datenstrukturen
Hashfunk]onen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 43
• HängenvomDatentypderElementeundkonkreterAnwendungenab
• FürIntegeroa h(i)=imodN
• funkJonierti.A.gut,wennNeinePrimzahlist• hängtmitMethodenzurErzeugungvonZufallszahlenzusammen
• FürandereDatentypen:RückführungaufInteger– Fließpunkt-Zahlen:AddiereManJsseundExponent
Datenstrukturen
Hashfunk]onen:Anforderungen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 44
• DieHash-Wertesollengut„streuen“
• EventuellvonBesonderheitenderEingabewerteabhängig– Z.B.BuchstabendesAlphabetsinNamentauchenunterschiedlichhäufigauf
• DieHash-Wertemüsseneffizientberechenbarsein– KonstanterZeitbedarferfordert(nichtabhängigvonderAnzahldergespeichertenWerte)
Datenstrukturen
Ungüns]geHashfunk]onen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 45
• Beispiel– MatrikelnummerninHashtabellemit100Einträgen– Variantea:erstebeidenStellenalsHashwert→AbbildungaufwenigeBuckets
– Varianteb:letztebeidenStellen→gleichmäßigeVerteilung
Datenstrukturen
Kollisionsstrategien
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 46
• Verke5ungderÜberläuferbeiKollisionen
• Sondieren(SucheneineralternaJvenPosiJon)– LinearesSondieren– QuadraJschesSondieren– DoppeltesHashen,Sondierenmit„Zufallszahlen“,…
Algorithmen
Verke^ungderÜberläufer
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 47
• Idee:alleEinträgeeinerArray-PosiJonwerdenineinerverke5etenListeverwaltet
Algorithmen
LinearesSondieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 48
• Idee:fallsIndexh(e)besetztist,versucheh(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,…
Algorithmen
LinearesSondieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 49
Wie findet man nun die Antwort auf die Frage „Enthält die Struktur die Zahl 69“?
Algorithmen
Quadra]schesSondieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 50
• 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
Algorithmen
AufwandbeimHashen
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 52
• BeigeringerKollisionswahrscheinlichkeit:– SucheninO(1)– EinfügeninO(1)– LöschenbeiSondierverfahren:
• nurMarkierenderEinträgealsgelöscht(O(1))oder• „Rehashen“dergesamtenTabellenotwendig(O(n))
Analysen
AufwandbeimHashen:verke^eteÜberläufer
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 53
• Füllgrad(loadfactor)α=m/N– mAnzahlgespeicherterElemente– NAnzahlBuckets
• ErfolgloseSuche(HashingmitÜberlaufliste):Θ(1+α)
• ErfolgreicheSucheebenfallsindieserGrößenordnung
Analysen
AufwandbeimHashen:Sondieren
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 54
• WahrscheinlichkeitenbasierenaufFüllgradα– Bucketbelegt:Wahrscheinlichkeitα – BucketbelegtundsondiertesBucketauchbelegt:ungefährα2,etc.
• ErfolgreicheSuchebesser,abergleicheGrößenordnung
1 + ↵+ ↵2 + ↵3 + . . . =1
1� ↵
Analysen
HasheninJava
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 55
• ZahlreichevordefinierteKlassenundMethodenzurUnterstützungvonHashing– VordefinierteHashfunkJonenfürbeliebigeObjekte– HashbasierteDatenstrukturen(Maps,Sets,etc.)
Datenstrukturen
UnterstützungdurchJava
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 56
• VordefinierteMethodezurBerechnungeinesHashwertes: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]
Datenstrukturen
Datenstruktureninjava.util
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 57
• Hashtable<K,V>:Array-basierteImplemenJerungeinerHashtabellemitverke5eterListealsKollisionsbehandlung(keinSondiereninirgendeinerJavaklasse),RehashingundSteuerungderTabellengrößeundmaximalenloadFactor(effizientbis0.75)
• HashMap<K,V>:ähnlichHashtable,erlaubtabernullalsSchlüssel
• LinkedHashMap<K,V>:verwaltetzusätzlicheinedoppeltverke5eteListezumErhaltenderEinfügereihenfolge
Datenstrukturen
Datenstruktureninjava.util
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected]) 58
• HashSet<E>:HashMap-basierteImplemenJerungeinerMengemitO(1)AufwandfürLookup.
• LinkedHashSet<E>:LinkedHashMap-basierteImplemenJerungeinerMenge.
• IdentityHashMap<K,V>:Hash-TabelleunterVerwendungderGleichheitderObjektreferenzsta5derGleichheitderObjektwerte– WeakHashMap<K,V>:Hash-Tabelle,ausderalsReferenzgelöschteElementeautomaJschgelöschtwerden.
Datenstrukturen
8.2HASHTABELLENZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen
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