Algorithmen und Datenstrukturen 8. DYNAMISCHE ......Linksbündiger, balancierter Binärbaum...

Preview:

Citation preview

8.DYNAMISCHEDATENSTRUKTUREN2HEAPSUNDHASHTABELLEN

AlgorithmenundDatenstrukturen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 1

8.1.HEAPSAlgorithmenundDatenstrukturen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 2

Was ist ein “Heap”?

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 7

Datenstrukturen

Vorgehensweise

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 30

Analysen

Analyse

AndernfallswirdderWertderWurzelmitdemgrößtenWertseinerKindervertauscht,dieHeap-EigenschaaistdamitanderWurzelwiederhergestellt.AnschliessendwirditeraJvmitdemvertauschtenKindfortgefahren.NachIndukJonfolgtdann,dassf[0...i-1]amEndeeinHeapist.

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 31

Analysen

Analyse

TheoremDerAlgorithmusheapSortlöstdasProblemdesvergleichsbasiertenSorJerens.Beweis:FolgtdirektausdenvorherigenbeidenLemmataundderBeobachtung,dassinjedemSchri5derheapSort-MethodedasgrößteElementandasEndedesArraysgetauschtwirdundnurnocheinumeinsverkleinertesArraybetrachtetwird.

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 32

Analysen

Analyse

TheoremDerAlgorithmusheapSort(f)terminiertfürjedeEingabefnachendlicherZeit.BeweisDieHauptmethodeheapSortverfügtübereinekonstanteAnzahlanSchleifendurchläufen.InjedemrekursivenAufrufvonmakeHeapwirdderIndexechtverringert,beiIndex0istderRekursionsanfangerreicht.InreHeapwirddieVariablecurrentinjedemDurchgangummindestens1erhöhtundbeiErreichenvon„end“wirdabgebrochen.

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 36

Analysen

8.1HEAPSZUSAMMENFASSUNG

AlgorithmenundDatenstrukturen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 38

8.2.HASHTABELLEN

AlgorithmenundDatenstrukturen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 39

Problemstellung

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 42

•  Beispiel:Arrayvon0bis9,h(i)=imod10•  ArraynachEinfügenvon42und119

Was tun wenn „62“ eingefügt werden soll?

Datenstrukturen

Hashfunk]onen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 44

•  DieHash-Wertesollengut„streuen“

•  EventuellvonBesonderheitenderEingabewerteabhängig–  Z.B.BuchstabendesAlphabetsinNamentauchenunterschiedlichhäufigauf

•  DieHash-Wertemüsseneffizientberechenbarsein–  KonstanterZeitbedarferfordert(nichtabhängigvonderAnzahldergespeichertenWerte)

Datenstrukturen

Ungüns]geHashfunk]onen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 45

•  Beispiel– MatrikelnummerninHashtabellemit100Einträgen–  Variantea:erstebeidenStellenalsHashwert→AbbildungaufwenigeBuckets

–  Varianteb:letztebeidenStellen→gleichmäßigeVerteilung

Datenstrukturen

Kollisionsstrategien

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 46

•  Verke5ungderÜberläuferbeiKollisionen

•  Sondieren(SucheneineralternaJvenPosiJon)–  LinearesSondieren–  QuadraJschesSondieren–  DoppeltesHashen,Sondierenmit„Zufallszahlen“,…

Algorithmen

Verke^ungderÜberläufer

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 47

•  Idee:alleEinträgeeinerArray-PosiJonwerdenineinerverke5etenListeverwaltet

Algorithmen

LinearesSondieren

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 49

Wie findet man nun die Antwort auf die Frage „Enthält die Struktur die Zahl 69“?

Algorithmen

Quadra]schesSondieren

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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

Quadra]schesSondieren

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 51

Algorithmen

AufwandbeimHashen

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 53

•  Füllgrad(loadfactor)α=m/N–  mAnzahlgespeicherterElemente–  NAnzahlBuckets

•  ErfolgloseSuche(HashingmitÜberlaufliste):Θ(1+α)

•  ErfolgreicheSucheebenfallsindieserGrößenordnung

Analysen

AufwandbeimHashen:Sondieren

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 54

•  WahrscheinlichkeitenbasierenaufFüllgradα–  Bucketbelegt:Wahrscheinlichkeitα –  BucketbelegtundsondiertesBucketauchbelegt:ungefährα2,etc.

•  ErfolgreicheSuchebesser,abergleicheGrößenordnung

1 + ↵+ ↵2 + ↵3 + . . . =1

1� ↵

Analysen

HasheninJava

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 55

•  ZahlreichevordefinierteKlassenundMethodenzurUnterstützungvonHashing–  VordefinierteHashfunkJonenfürbeliebigeObjekte–  HashbasierteDatenstrukturen(Maps,Sets,etc.)

Datenstrukturen

UnterstützungdurchJava

AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 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(thimm@uni-koblenz.de) 60

Recommended