Datenstrukturen und Algorithmen Gestreute Speicherung (Hashing

Werbung
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
Herunterladen