Kapitel 4 Streuen Wir behandeln nun Ipleentationen ungeordneter Wörterbücher, in denen die Schlüssel ohne Beachtung ihrer Sortierreihenfolge gespeichert werden dürfen, verlangen aber, dass es sich bei den Schlüsseln u Zahlen handelt. Dies ist keine starke Voraussetzung, weil sich die Eleente anderer Schlüsseluniversen als Zahlen codieren lassen. Bezeichnungen: (Schlüssel-) Universu U N 0 Schlüsselenge K U, K = n Hashtabelle H[0,..., ] (Array von Zeigern auf Dateneleente) Durch eine Hashfunktion h : U {0,..., } wird jede zulässigen Schlüssel k U seine Speicherstelle H[h(k)] in der Hashtabelle H zugewiesen. I Idealfall gilt für die Menge K U der vorkoenden Schlüssel typisch in JAVA: Speicheradresse Object.hashCode hash (engl.): streuen k k 2 K = h(k ) h(k 2 ) (h K injektiv) weil Einfügen, Suchen und Löschen dann jeweils in Θ() realisiert werden können. 4. Beispiel (Hashfunktionen). h(k) = k od für Prizahl (Divisions- oder Kongruenzethode) 60
Algorithen und Datenstrukturen (WS 2008/09) 6 2. h(k) = (kα kα ) z.b. für α = φ = 5 0, 6803 goldener 2 Schnitt (Multiplikationsethode) Die n+ Intervalle nach Einfügen von,..., n haben nur 3 verschiedene Gröÿen; bei α = φ a ähnlichsten. 4. Kollisionen 4. I Allgeeinen ist allerdings h(k ) = h(k 2 ) für einige h, h 2 bezeichnen wir it Kollisionen, k, k 2 heiÿen Synonye. K. Dies p,n := P (keine Kollisionen) = 2... n+, falls Schlüssel durch h gleichäÿig gestreut werden, d.h. alle Positionen gleichwahrscheinlich sind. 4.2 Beispiel (Geburtstagsparadoxon) p 365,22 > 0.5 > p 365,23 Anschauliche Deutung: bei 23 oder ehr Personen ist die Wahrscheinlichkeit, dass zwei a gleichen Tag Geburtstag haben, gröÿer als die Wahrscheinlichkeit, dass alle an verschiedenen Tagen Geburtstag haben. Herleitung: p,n = n i=0 i Für welches n ist p,n /2? = n i= ( i ) n i= e i/ = e P n i= i = e (n 2)/ e (n 2)/ = 2 ( ) n 2 / = ln 2 ( ) n = ln 2 2 n(n ) 2 n 2(ln 2) ( 22.49 für = 365)
Algorithen und Datenstrukturen (WS 2008/09) 62 Erwartete Anzahl Kollisionen Sei { falls h(ki ) = h(k X ij = j ) (Kollision von k i, k j ) 0 sonst Bei gleichäÿiger Streuung ist E(X ij ) = / für i j. ( ) E(X) = E X ij = E(X ij ) = / = i<j i<j i<j I Beispiel war = 365, soit gilt hier { < für n < 27 E(X) = für n 27 I Allgeeinen gilt also etwa bei n 2. E(X) n(n ) 2, 4.3 Def inition (Belegungsfaktor) Wir denieren den Belegungsfaktor (load factor) als β = n. ( ) n / 2 entscheidend für Nutzen? Erwartete Anzahl leerer Felder? Eleent k K steht nicht an Position i {0,..., } it Wahrscheinlichkeit =. Die Wahrscheinlichkeit, dass Position i nicht belegt ist, ist dait [ ] β P (i / {h(k ),..., h(k n )}) = ( )n = ( ) e β }{{} e / { 0 H[i] belegt = E(X i ) für X i = H[i] frei E(X) = E( X i ) = E(X i ) = e β = e β. Die erwartete Anzahl belegter Einträge ist e β = ( e β ). β = /2 : e /2 0.39 Belegung 39% β = : e 0.63 Belegung 63%
Algorithen und Datenstrukturen (WS 2008/09) 63 4.2 Kollisionsbehandlung 4.2. Verkettung Idee Die Hashtabelle wird als Array von Zeigern auf Listen ipleentiert, wobei die Listen alle Schlüssel it gleiche Hashfunktionswert enthalten. 4.4 Beispiel (h(k) = k od p) 0 p H : 4.5 Def inition (Sondieren) Wenn die Hashtabelle über Verkettung realisiert wird, nden bei find eventuell ehrere Zugrie auf Zeiger statt (Sondieren). U die Anzahl der Sondierschritte zu analysieren, denieren wir A(, n) := ittlere Anzahl bei erfolgreicher Suche. A (, n) := ittlere Anzahl, falls Schlüssel nicht in der Hashtabelle ist. Wir gehen wieder davon aus, dass für das verwendete Modell P (h(k) = i) = k U, i {0,..., } gilt.
Algorithen und Datenstrukturen (WS 2008/09) 64 Die ittlere Länge der Listen ist gerade der Belegungsfaktor β = n [0, ). Also ist A (, n) = + β = + n. Zu A(, n): Die Suche nach k i ergibt genau die Sondierungen wie bei Einfügen von k i, wenn vorher k,..., k i eingefügt wurden. I Mittel ist dait A(, n) = n n i=0 A (, i) = n n i=0 ( + i ) = + n n i=0 i = + (n ) n = + β + β 2n 2 2 2 Statistische Eigenschaften Sei β = (n = ). Dann sind 63% der Hashtabelle T besetzt, 37% sind frei (s.o.). Wie groÿ uss n i Mittel sein, dait alle Plätze in T belegt sind? Coupon Collector Proble Sei (k i ) i=,2,3,..., k i U die Folge in T einzufügender Schlüssel. Sei (i) die Anzahl belegter Plätze nach Einfügen von k,..., k i und sei i k := in{i (i) = k}, d.h. Einfügen von k ik belegt erstals den k-ten Platz in T. Index k Wir betrachten eine Zufallsvariable X it X k = X = i k i k k= X k Dann ist die gesuchte Zahl für n gerade E[X]. i : 2 3 4 5 k k 2 k 3 k 4 k 5 k k (i) 2 3 4 i i 2 i 3 i 4 i 5 i i X X 2 X 3 X 4 X 5 X X etwas unglücklich bei k für key Sei i k i < i k. Dann ist p k := E[X k ] = p k E[X] = P (i + = i k ) = k+ E[ X k] = = k= E[X k] = = H k ln k+
Algorithen und Datenstrukturen (WS 2008/09) 65 I Mittel sind also n = ln Einfügeoperationen notwendig, u alle Positionen in der Hashtabelle zu füllen. Dann ist β = ln = ln >. 4.2.2 Open Hashing Idee In jede Feld der Hashtabelle H wird nur ein Eleent gespeichert (daher β ). Füge Schlüssel k ein: h(k ) = i, H[i] = k. Füge Schlüssel k 2 ein (Kollision): h(k 2 ) = i, H[i] besetzt. Finde freien Platz in H. Wähle eine Folge (d i ) i=,2,..., d i Z und teste H[(h(k) + d i ) od ], i =, 2, 3,... Für die Folge (d i ) i gibt es verschiedene Wahlen: lineares Sondieren: d i = i quadratisches Sondieren: d i = i 2 double Hashing: d i = i h (k), wobei h : U {,..., } eine zweite Hashfunktion ist it h (k) 0 k U. Hier sollte pri sein! Waru? 4.6 Proble Einfügen und Suchen ist dait klar, Löschen ist aber ein Proble. Index h? bei 4.7 Beispiel Sei h(k) = h(k ) = i und füge k, k ein: H : k k i i + Lösche dann k. Anschlieÿend versagt die Suche nach k! Lösung: arkiere gelöschte Schlüssel als gelöscht
Algorithen und Datenstrukturen (WS 2008/09) 66 bei Suche werden sie behandelt wie belegte Felder bei Einfügen wie freie Felder ungünstig, wenn oft Eleente gelöscht werden, da die Suche verteuert. 4.8 Proble Clusterbildung 4.9 Beispiel (lineares Sondieren) H : i i + Nächster einzufügender Schlüssel: k U P (h(k) = i + ) = P (h(k) = i) = 5 } Cluster wachsen tendentiell Analyse lineares Sondieren double Hashing A ( + ) A ln( 2 β β A ( + ) A 2 ( β) 2 β β ) Beweis. lineares Sondieren: schwer, s. Schöning S.40-4. Referenz double Hashing: (idealisierende) Annahe: Sondierungen h (k), h 2 (k),... zur erfolglosen Suche von k it P (H[h i (k)] ist frei) = n = β E[Anzahl Sondierungen bis freies Feld gefunden] = β
Algorithen und Datenstrukturen (WS 2008/09) 67 Also A (n, ) = β. A(n, ) = n n i=0 A (, i) = n n i=0 = i n = β ( n+ + + ) = β (H H n ) β (ln ln( n)) = β ln n = β ln β n i=0 i 4.3 Kollisionsvereidung 4.3. Streufunktionen Ziel gleichäÿige Streuung durch Hashfunktion, wie in der Berechnung der Kollisionswahrscheinlichkeiten unterstellt. Proble Wir wissen nicht, welche Schlüssel K U gespeichert werden. Schlistenfalls ist h(k ) = H(k 2 ) k, k 2 K Sondieren bei Suche entspricht linearer Suche O(n). Schlüsselengen K U führen zu sehr verschiedenen Laufzeiten. Versuche daher, die Wahrscheinlichkeit für schlechtes Laufzeitverhalten besser auf diese zu verteilen. Idee Wähle aus einer Menge von Hashfunktionen zufällig eine aus. H {h : U {0,..., }} 4.3.2 Universelles Streuen 4.0 Def inition (universelles Streuen) Eine Failie von Streufunktionen H {h : U {0,..., }} heiÿt universell, falls H {h H : h(k ) = h(k 2 )} k, k 2 U.
Algorithen und Datenstrukturen (WS 2008/09) 68 Bei zufälliger Wahl h H sind wir dann berechtigt, P (h(k ) = h(k 2 )) = anzunehen. 4. Satz Ist H universell, dann ist für k {k,..., k n } = K U bei zufällig gewählte h H die erwartete Anzahl Kollisionen gerade n = β. Beweis. Sei C ij eine Zufallsvariable it { h(ki ) = h(k C ij = j ) 0 sonst Da H universell ist, ist P (C ij = ) = E k j K\{k i } C ij = k j K\{k i }, und es folgt für k = k i E(C ij ) K = β. Die erwartete Anzahl Kollisionen entspricht dann also wie erhot de Belegungsfaktor β. 4.2 Satz Die Failie von Streufunktionen H p = {(ak + b od p) od : 0 < a < p, 0 b < p}, p pri, p > ist universell. Beweis. Sei h a,b H p it h a,b (k) = (ak + b od p) od. Betrachte zunächst für k, k {0,..., p } r = (ak + b) s = (ak + b) od p od p Dann ist r s }{{} a (k k ) od p, also r s falls k k, weil p pri ist. 0 Es gibt also zunächst keine Kollisionen der Zahlen {0,..., p }, sondern diese werden nur perutiert.
Algorithen und Datenstrukturen (WS 2008/09) 69 Auÿerde liefert jede der (p ) p Wahlen für (a, b) ein anderes Paar r s, denn gegeben r s können wir nach a = (r s) (k k ) }{{} Inverses bzgl. Z p b = (r ak) od p od p auösen. Weil es aber auch nur p(p ) Paare (r, s) it r s gibt, liegt eine Bijektion vor. Werden a, b zufällig gewählt, dann erhalten wir also auch jedes Paar r s {0,..., p } it gleicher Wahrscheinlichkeit. Die Kollisionswahrscheinlichkeit von k k U entspricht dait der Wahrscheinlichkeit, dass r s od für zufällig gewählte r s {0,..., p }. Für festes r ist die Anzahl der s it r s und r s od höchstens p p + = p und wegen der zufälligen Wahl aus den p öglichen s r ist die Kollisionswahrscheinlichkeit für k k U höchstens. Also ist H p universell. Wir wollen nun noch eine andere universelle Failie von Streufunktionen betrachten. Annahe U besteht aus Bitstrings fester Länge, ist pri. Zerlege K U in Blöcke der Länge log k : k r k k 0 0 k i <, i = 0,..., r Wir denieren die Menge von Hashfunktionen H B = {h a : U {0,..., }} durch ( r ) h a (k) = a i k i od i=0 wobei a = (a r,..., a 0 ) {0,..., } r+. Dait gilt H B = r+.
Algorithen und Datenstrukturen (WS 2008/09) 70 4.3 Satz H B ist universell. Beweis. Seien k k U, dann k i k i für ein i {0,..., r}. OBdA. sei i = 0. Für ein h a H B gilt dann h a (k) = h a (k ) r a i k i i=0 r a i k i i=0 a 0 (k 0 k 0) od r a i (k i k i ) i= a 0 (k 0 k 0) }{{} ult. Inv. in (Z,+, ) od r a i (k i k i ) i= od Für alle Wahlen von (a r,..., a ) {0,..., } r a 0 {0,..., } it h a (k) = h a (k ). Also gilt existiert genau ein P (Kollision k k ) = {a : h a(k) = h a (k )} H B = r r+ =. 4.4 Ausblick viele andere Techniken zur Kollisionsbehandlung, z.b. Cuckoo-Hashing. viele andere Techniken zur Konstruktion von Hashfunktionen, z.b. perfektes Hashing (für statische Schlüsselengen). viele andere Anwendungen, z.b. Bloo-Filter.. s. Übung