Gestreute Speicherung (Hashing) • Wir suchen eine Datenstruktur, die das Wörterbuchproblem effizient löst • Wörterbuchoperationen: – Einfügen – Suchen – Entfernen • Anwendungen: Telefonbuch, Wörterbuch, Symboltabelle beim Kompilieren, … • Lineares Feld: Einfügen O(1) Zeit, Suchen und Entfernen O(n) Zeit Datenstrukturen und Algorithmen VO 708.031 18.11.2010 [email protected] 1 Gestreute Speicherung (Hashing) j=0 h(w) = j 2 • Die Hashfunktion sollte möglichst wenig Kollisionen liefern • Ideale Hashfunktion: Pr[h( w) = j ] = 1 m ∀w ∈ U , j ∈ {0,..., m − 1} Hashtabelle T • Behandlung von Kollisionen: – Überläuferlisten (Chaining) – Offene Adressierung j=1 Kollision Aktuelle Schlüssel w [email protected] Gestreute Speicherung (Hashing) • Idee: Anstatt zu suchen, berechne die Adresse eines Datums aus seinem Wert in O(1) Zeit • Hashtabelle: lineares Feld T[0..m-1]; Datum mit Wert w wird in T[h(w)] gespeichert • Hashfunktion: h: U → {0, 1, …, m-1} U = Universum aller möglichen Schlüssel 18.11.2010 h (w) = h (w´) j = m-2 j = m-1 18.11.2010 [email protected] 3 18.11.2010 [email protected] 4 Überläuferlisten (Chaining) Überläuferlisten (Chaining) • Bei einer Kollision werden die Daten in einer verketteten Liste angelegt: • Bei einer Kollision werden die Daten in einer verketteten Liste angelegt: Erwartete Laufzeit Einfügen: O(1) Suchen: O(1+α) Löschen: O(1+α) Einfügen: Am Beginn der Liste T[h(w)] Suchen: Durchsuchen der Liste T[h(w)] Löschen: Suchen von w, Ausklinken aus Liste T[h(w)] α= n m O(1+α) = O(1), wenn n=O(m) Worst-case: Θ(n) für Suchen, Löschen wenn zufällig alle Werte in dieselbe Liste gestreut 18.11.2010 [email protected] 5 Belegungsfaktor der Hashtabelle 18.11.2010 Hash-Funktionen 1 prob = m [email protected] 6 Hash-Funktionen • Was ist eine gute Hashfunktion? – Jeder Index j=0,…,m-1 sollte gleichwahrscheinlich sein, um möglichst wenig Kollisionen zu liefern – h(w) soll möglichst effizient berechnet werden – Ähnliche Werte sollten möglichst gut getrennt werden – h(w) soll unabhängig von Mustern in den Daten sein • Wir kennen selten die genaue Verteilung der Werte • ⇒ Heuristische Wahl der Hashfunktion • Wir betrachten h: ℕ → {0, 1, …, m-1} • Divisionsmethode: – Dividiere den Wert durch m und nimm den Rest: 18.11.2010 18.11.2010 [email protected] n −1 7 h( w) = w mod m – z.B.: w=100, m=12, h(100) = 100 mod 12 = 4 – Vorteil: schnell berechenbar – Nachteil: nicht für alle m gut • m=2k, m=10k: hängt nur von den letzten k Bits/Ziffern ab • Gut für m Primzahl und nicht zu nahe an 2k, 10k [email protected] 8 Hash-Funktionen Offene Adressierung • Multiplikationsmethode: – Multipliziere den Wert mit einer fixen Konstante A, 0<A<1, und multipliziere den gebrochenen Teil des Resultates mit m: • Alternative Methode zur Behandlung von Kollisionen • Alle Werte werden in T[0..m-1] selbst gespeichert ⇒ α=n/m≤1 • Bei einer Kollision wird solange eine neue Adresse berechnet, bis ein freier Platz gefunden wird h( w) = m ⋅ frac( w ⋅ A) h : U × {0,1, K, m − 1} → {0,1,K, m − 1} h(w,i) = j i…0,1,2,…m-1 Versuchzahl (Probing) – Vorteil: m ist unkritisch (m=2k: durch Shift-Operationen effizient berechenbar) Guter Wert für A: 18.11.2010 A= i=1 noch frei i=2 5 −1 ≈ 0,6180... 2 [email protected] 9 18.11.2010 Offene Adressierung 18.11.2010 [email protected] 10 • Einfügen und Suchen: Problem: benachbarte Felder wahrscheinlicher belegt (primary clustering) – Quadratic Probing: h( w, i ) = h′( w) + f (i ) mod m f(i)…quadratische Funktion; bei einer Kollision immer noch dieselbe Indexfolge (secondary clustering) – Double Hashing: h( w, i ) = h1 ( w) + ih2 ( w) mod m [ [email protected] Offene Adressierung • Ideale Hashfunktion: Für jeden Wert w ist h(w,0), h(w,1), …, h(w,m-1) mit Wahrscheinlichkeit 1/m! eine der m! Permutationen von 0, 1, …, m-1. • In der Praxis verwendete Näherungen: – Linear Probing: h( w, i ) = [h′( w) + i ]mod m [ besetzt Erwartete Laufzeit O 1 ] 1 −α • Problem beim Entfernen: ] w1, w2 eingefügt, w1 entfernt w2 wird nicht mehr gefunden ⇒ entfernte Werte markieren 11 18.11.2010 [email protected] 12 Danke für Ihre Aufmerksamkeit! Bis zum nächsten Mal. (Donnerstag, 25. Nov. 2010, 11:15, i13) 18.11.2010 [email protected] 13