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