Wahrscheinlichkeitstheorie für Hashtables

Etwas Wahrscheinlichkeitstheorie
für den Hausgebrauch
1
Hash-Beispiel
Elementarereignisse
Ω
Ereignisse: Teilmengen von
{0..m − 1}Key
E42 = {h ∈ Ω : h(4) = h(2)}
Hash-Funktionen
Ω
px =Wahrscheinlichkeit von x ∈ Ω. ∑x px = 1 !
1
ph = m−|Key|
px = |Ω|
P [E ] = ∑x ∈E px
P [E42 ] = m1
Zufallsvariable (ZV) X0 : Ω → R
X = | {e ∈ M : h (e ) = 0 } |
0-1-Zufallsvariable (Indikator-ZV) I : Ω → {0, 1}
|
Erwartungswert E[X ] = ∑y ∈Ω py X (y )
E[X ] = |M
m
Linearität des Erwartungswerts: E[X + Y ] = E[X ] + E[Y ]
Gleichverteilung:
145
Beispiel: Variante des Geburtstagsparadoxon
Wieviele Gäste muss eine Geburtstagsparty im Mittel haben, damit
mindestens zwei Gäste den gleichen Geburtstag haben?
n
Gäste (Keys) 1.. .
h ∈ Ω = {0..364}{1..n} .
Deniere Indikator-ZV Iij = 1 gdw h (i ) = h (j ).
n
n
Anzahl Paare mit gleichem Geburtstag: X = ∑i =1 ∑j =i +1 Iij .
Elementarereignisse:
n n
n n
E[X ] =E[ ∑ ∑ Iij ] = ∑ ∑ E[Iij ]
i =1 j =i +1
i =1 j =i +1
n n
n(n − 1) 1
= ∑ ∑ P [Iij = 1] =
·
2
365
i =1 j =i +1
r
!
=1 ⇔ n =
1
2
+
1
22
+ 730≈ 27.52
146
Mehr zum Geburtstagsparadoxon
Standardfomulierung:
Ab wann lohnt es sich zu wetten, dass es zwei Gäste mit gleichem
Geburtstag gibt? Etwas komplizierter. Antwort:
n ≥ 23
m = Hashtabelle der Gröÿe m:
h : 1..n → 0..m − 1 ist nur dann mit
2
Wahrscheinlichkeit perfekt wenn m = Ω(n ).
Verallgemeinerung: Jahreslänge
eine zufällige Hashfunktion
vernünftiger
Riesige Platzverschwendung.
147
Analyse für zufällige Hash-Funktionen
Theorem 1
h
∀k : die erwartete Anzahl kollidierender Elemente ist O(1) falls |M | ∈ O(m).
M
Beweis.
k deniere Kollisionslänge X
X := |t [h(k )]| = | {e ∈ M 0 : h(e ) = h(k )} | mit
M 0 = {e ∈ M : key(e ) 6= k }.
0
Betrachte die 0-1 ZV Xe = 1 für h (e ) = h (k ), e ∈ M
< >
< >
<>
<>
<>
<
>t[h(k)]
<>
<>
< >
<>
<>
t <>
Für festen Schlüssel
und
Xe = 0
sonst.
|M 0 |
E[X ] = E[ ∑ Xe ] = ∑ E[Xe ] = ∑ P [Xe = 1] =
m
e ∈M 0
e ∈M 0
e ∈M 0
∈ O(1)
Das gilt unabhängig von der Eingabe
M.
148
Zufällige Hash-Funktionen?
Naive Implementierung: ein Tabelleneintrag pro Schlüssel.
meist zu teuer
Weniger naive Lösungen: kompliziert, immer noch viel Platz.
meist unsinnig
unrealistisch
149
Universelles Hashing
Idee: nutze nur bestimmte einfache Hash-Funktionen
Denition 2
H ⊆ {0..m − 1}Key
falls für alle
x, y
ist
universell
x 6= y
in Key mit
und zufälligem
P [h(x ) = h(y )] =
1
m
h∈H ,
.
Theorem 3
Theorem 1 gilt auch für universelle Familien von Hash-Funktionen.
Beweis.
Für
Ω=H
haben wir immer noch
Der Rest geht wie vorher.
P [Xe = 1] = m1 .
H
Ω
150
Eine einfache universelle Familie
m
sei eine Primzahl, Key
⊆ {0, . . . , m − 1}k
Theorem 4
Für a = (a1 , . . . , ak ) ∈ {0, . .n. , m − 1}k deniere o
ha (x) = a·x mod m, H · = ha : a ∈ {0..m − 1}k .
H · ist eine universelle Familie von Hash-Funktionen
x1
*
a1
+
x2
*
a2
+
x3
*
a3
mod m
= ha(x)
151
Beispiel für
Für
H·
a = (a1 , . . . , ak ) ∈ {0, . .n. , m − 1}
ha (x) =
k = 3, m = 11
a·x mod m, H ·
wähle
k
deniere
= ha : a ∈ {0..m − 1}k
o
.
a = (8, 1, 5).
ha ((1, 1, 2)) = (8, 1, 5) · (1, 1, 2) = 8 · 1 + 1 · 1 + 5 · 2 = 19 ≡ 8 mod
11
152
Beweis.
Betrachte
zähle
a
x = (x1 , . . . , xk ), y = (y1 , . . . , yk )
h (x) = h (y).
mit
a
Für jede Wahl der
∑
1≤i ≤k
a
ai , i 6= j , ∃
ai xi ≡
∑
1≤i ≤k
genau ein
mit
xj 6= yj
mit
ha (x) = ha (y):
aj
ai yi ( mod m)
⇔ aj (xj − yj ) ≡
∑ ai (yi − xi )( mod m)
i 6=j ,1≤i ≤k
⇔ aj ≡ (xj − yj )−1 ∑ ai (yi − xi )( mod m)
i 6=j ,1≤i ≤k
mk −1 Möglichkeiten die ai (mit i 6= j )
mk ist die Gesamtzahl der a, d. h.,
auszuwählen.
P [ha (x ) = ha (y)] =
1
mk −1
= .
m
mk
153
Bit-basierte Universelle Familien
Sei
m = 2w ,
Key
= {0, 1}k
Bit-Matrix Multiplikation: H ⊕ = hM : M ∈ {0, 1}w ×k
wobei hM (x) = Mx (Arithmetik mod 2, d. h., xor, and)
n
Tabellenzugri:H ⊕[] =
wobei
{0..2
h(⊕[]
t1 ,...,tb ) : ti ∈ {0..m − 1}
Lb
h(⊕[]
t1 ,...,tb ) ((x0 , x1 , . . . , xb )) = x0 ⊕ i =1 ti [xi ]
n
o
a −1}
o
k
x
x2 x1
a
a
x0
w
154