Hashing II
Datenstrukturen und Algorithmen
Vorlesung 13: Hashing II
Joost-Pieter Katoen
Lehrstuhl für Informatik 2 Software Modeling and Verification Group
https://moves.rwth-aachen.de/teaching/ss-18/dsal/
11. Juni 2018
Hashing II
Übersicht
1 Hashing und Verkettung
2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing
Effizienz der offenen Adressierung
{
Hashing II Hashing und Verkettung
Übersicht
1 Hashing und Verkettung
2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing
Effizienz der offenen Adressierung
Hashing II Hashing und Verkettung
Hashing
Das Ziel von Hashingist:
I Einen extrem großen Schlüsselraum auf einen vernünftig kleinen Bereich von ganzen Zahlen abzubilden.
I Dass zwei Schlüssel auf die selbe Zahl abgebildet werden, soll möglichst unwahrscheinlich sein.
Hashfunktion, Hashtabelle, Hashkollision
Eine Hashfunktionbildet einen Schlüssel auf einen Index der HashtabelleT ab: h:U ≠æ{0, 1,. . .,m≠1} für Tabellengrößem und |U|=n.
Wir sagen, dass h(k) der Hashwertdes Schlüsselsk ist.
Das Auftreten von h(k) =h(kÕ) für k ”=kÕ nennt man eineKollision.
=
Hashing II Hashing und Verkettung
Hashing
Das Ziel von Hashingist:
I Einen extrem großen Schlüsselraum auf einen vernünftig kleinen Bereich von ganzen Zahlen abzubilden.
I Dass zwei Schlüssel auf die selbe Zahl abgebildet werden, soll möglichst unwahrscheinlich sein.
Hashfunktion, Hashtabelle, Hashkollision
Eine Hashfunktionbildet einen Schlüssel auf einen Index der HashtabelleT ab: h:U ≠æ{0, 1,. . .,m≠1} für Tabellengrößem und |U|=n.
Wir sagen, dass h(k) der Hashwertdes Schlüsselsk ist.
Das Auftreten von h(k) =h(kÕ) für k ”=kÕ nennt man eineKollision.
Hashing II Hashing und Verkettung
Hashing
Das Ziel von Hashingist:
I Einen extrem großen Schlüsselraum auf einen vernünftig kleinen Bereich von ganzen Zahlen abzubilden.
I Dass zwei Schlüssel auf die selbe Zahl abgebildet werden, soll möglichst unwahrscheinlich sein.
Hashfunktion, Hashtabelle, Hashkollision
Eine Hashfunktionbildet einen Schlüssel auf einen Index der HashtabelleT ab: h:U ≠æ{0, 1,. . .,m≠1} für Tabellengrößem und |U|=n.
Wir sagen, dass h(k) der Hashwertdes Schlüsselsk ist.
Das Auftreten von h(k) =h(kÕ) für k ”=kÕ nennt man eineKollision.
/
% N
q -
Univ . Schlissel m << N
der
h ( i) = r Osram Tfr ]
Hashing II Hashing und Verkettung
Hashing
Das Ziel von Hashingist:
I Einen extrem großen Schlüsselraum auf einen vernünftig kleinen Bereich von ganzen Zahlen abzubilden.
I Dass zwei Schlüssel auf die selbe Zahl abgebildet werden, soll möglichst unwahrscheinlich sein.
Hashfunktion, Hashtabelle, Hashkollision
Eine Hashfunktionbildet einen Schlüssel auf einen Index der HashtabelleT ab: h:U ≠æ{0, 1,. . .,m≠1} für Tabellengrößem und |U|=n.
Wir sagen, dass h(k) der Hashwertdes Schlüsselsk ist.
Das Auftreten von h(k) =h(kÕ) für k ”=kÕ nennt man eineKollision.
YU
{ °, ... ,m . ,}
:
a NHashing II Hashing und Verkettung
Hashing
Das Ziel von Hashingist:
I Einen extrem großen Schlüsselraum auf einen vernünftig kleinen Bereich von ganzen Zahlen abzubilden.
I Dass zwei Schlüssel auf die selbe Zahl abgebildet werden, soll möglichst unwahrscheinlich sein.
Hashfunktion, Hashtabelle, Hashkollision
Eine Hashfunktionbildet einen Schlüssel auf einen Index der HashtabelleT ab: h:U ≠æ{0, 1,. . .,m≠1} für Tabellengrößem und |U|=n.
Wir sagen, dass h(k) der Hashwertdes Schlüsselsk ist.
Das Auftreten von h(k) =h(kÕ) für k”=kÕ nennt man eineKollision.
IN
0
=Hashing II Hashing und Verkettung
Hashing
U K
0 Schlüsselmenge
benutzte Schlüssel k2
k4 k3
k5
m≠1 k1
Hashfunktion
Hashtabelle h(k1)
h(k2) =h(k3) h(k5)
h(k4)
Kollision
I Wie behandeln wir dennoch auftretende Kollisionen?
I Zwei Varianten: Verkettung und Offene Adressierung
h
= 2
=3
Hashing II Hashing und Verkettung
Hashing
U K
0 Schlüsselmenge
benutzte Schlüssel k2
k4 k3
k5
m≠1 k1
Hashfunktion
Hashtabelle h(k1)
h(k2) =h(k3) h(k5)
h(k4)
Kollision
I Wie behandeln wir dennoch auftretende Kollisionen?
I Zwei Varianten: Verkettung und Offene Adressierung
00
Hashing II Hashing und Verkettung
Kollisionsauflösung durch Verkettung (I)
Idee
Alle Schlüssel, die zum gleichen Hash führen, werden in einer
verketteten Listegespeichert. [Luhn 1953]
k1 k3
k6 k7 k5
k2
U
0k2
k4 k3
k5
K
m≠1 k1
k6
k7
k4
Hashing II Hashing und Verkettung
Kollisionsauflösung durch Verkettung (I)
Idee
Alle Schlüssel, die zum gleichen Hash führen, werden in einer
verketteten Listegespeichert. [Luhn 1953]
k1 k3
k6 k7 k5
k2
U
0k2
k4 k3
k5
K
m≠1 k1
k6
k7
k4
O
sahcks ) = hckb ) = hckz )
Hashing II Hashing und Verkettung
Average-Case-Analyse von Verkettung
Erfolgreiche Suche
Die erfolgreiche Suche benötigt im Average-Case (1+–).
Erfolglose Suche
Die erfolglose Suche benötigt im Average-Case (1+–).
@
Fullgradn = Anzahl belegtv slots in T
IH = m K N = lul
Hashing II Hashing und Verkettung
Average-Case-Analyse von Verkettung
Erfolgreiche Suche
Die erfolgreiche Suche benötigt im Average-Case (1+–).
Erfolglose Suche
Die erfolglose Suche benötigt im Average-Case
Q
(1+:
–).-
In neO_(m)
Hashing II Offene Adressierung
Übersicht
1 Hashing und Verkettung
2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing
Effizienz der offenen Adressierung
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer. Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierung ab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer. Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierung ab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer.
Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierung ab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer.
Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierung ab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
inmate
innit .net#.nn@
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer.
Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierung ab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
17
Hashing II Offene Adressierung
Kollisionsauflösung durch offene Adressierung
I Alle Elemente werden direkt in der Hashtabelle gespeichert (im Gegensatz zur Verkettung).
∆ Höchstens mSchlüssel können gespeichert werden, d. h.
–(n,m) = mn 61. [Amdahl 1954]
I Man spart aber den Platz für die Pointer.
Einfügen von Schlüssel k
I Sondiere (to probe) die Positionen der Hashtabelle, bis ein leerer Slot gefunden wurde.
I Die zu überprüfenden Positionen sind vom einzufügenden Schlüsselk abgeleitet.
I Die Hashfunktion hängt also vom Schlüsselk und derNummer der Sondierungab:
h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}
hCtt@hhhDhCi7.z1hll7.m
.D=
-
Hashing II Offene Adressierung
Einfügen bei offener Adressierung
1void hashInsert(int T[], int key) {
2 for (int i = 0; i < T.length; i++) { // Teste ganze Tabelle
3 int pos = h(key, i); // Berechne i-te Sondierung
4 if (!T[pos]) { // freier Platz
5 T[pos] = key;
6 return; // fertig
7 }
8 }
9 throw "Überlauf der Hashtabelle";
10}
O
Yang
h( 17,0)#
isHashing II Offene Adressierung
Suche bei offener Adressierung
1int hashSearch(int T[], int key) {
2 for (int i = 0; i < T.length; i++) {
3 int pos = h(key, i); // Berechne i-te Sondierung
4 if (T[pos] == key) { // Schlüssel k gefunden
5 return T[pos];
6 } else if (!T[pos]) { // freier Platz, nicht gefunden
7 break;
8 }
9 }
10 return -1; // "nicht gefunden"
11}
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Sloti besetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Sloti besetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
.
/k'/
1kt
/ hck )=isei k ' nach k
eingefigt
in Tund bein Enfige von K ' wurde malsondiert
so dap hck ', j )=i hck ;j+ ,)
suche k '
•
' hcksjtz )nachda k |k'/
#
gel "oscht wunde
TL
NULLHashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
.
DELETED h ( k', j )
1kt # = i
i hcksjts )
:
.
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
.
.
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
-
. -
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
Hashing II Offene Adressierung
Löschen bei offener Adressierung
Problem
Löschen des Schlüssels k aus Slot idurch T[i] = null istungeeignet:
I Wenn beim Einfügen von k der Slotibesetzt war, können wir k nicht mehr abrufen.
Lösung
Markiere T[i] mit demspeziellen Wert DELETED (oder: „veraltet“).
I hashInsert muss angepasst werden und solche Slots als leer betrachten.
I hashSearch bleibt unverändert, solche Slots werden einfach übergangen.
I Die Suchzeiten sind nun nicht mehr allein vom Füllgrad – abhängig.
∆ Wenn Schlüssel gelöscht werden sollen wird häufigerVerkettung verwendet.
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k: Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert. Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
h ( 17,0)
nam
}
h ( 17,2)
: :
.
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert. Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
Mm
Position- - - in T
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert. Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
- g
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert. Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
.
Positionsm ! Permutations
Pr ( Permutation × ) = 1
m !
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert.
Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert.
Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert.
Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
c-
-Hashing II Offene Adressierung
Wie wählt man die nächste Sondierung?
Wir benötigen eine Sondierungssequenzfür einen gegebenen Schlüssel k:
Èh(k, 0),h(k, 1),. . .,h(k,m≠1)Í
I Wenn es sich dabei um eine Permutation von È0,. . .m≠1Í handelt ist garantiert, dass jeder Slot letztlich geprüft wird.
I GleichverteiltesHashing wäre ideal, d. h. jede der m! Permutationen ist als Sondierungssequenz gleich wahrscheinlich.
I In der Praxis ist das aber zu aufwändig und wird approximiert.
Sondierungsverfahren
I Wir behandeln Lineares Sondieren,Quadratisches Sondierenund Doppeltes Hashing.
I Die Qualität ist durch die Anzahl der verschiedenen
Sondierungssequenzen, die jeweils erzeugt werden, bestimmt.
:
-Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I k ist der Schlüssel
I i ist der Index im Sondierungssequenz
I hÕ ist eine übliche Hashfunktion.
hi (k) + i { 0 ,. . . . ,m .,)
Tfnear
0
-Hashing II Offene Adressierung
Lineares Sondieren: Beispiel
22
154 28
3110
22
154 28
3110
22
154 2817
3110
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
ins(17) 1. Son- dierung
ins(17) 2. Son- dierung
hÕ(k) =k mod 11 h(k,i) = (hÕ(k) +i) mod 11
men
* hG7,o)=
(h 'G7)+o ) mod ^^
-
6 = 6 if
hC6)=h(
17 ,n) =O
0 ( 6in ) modn = 7Hashing II Offene Adressierung
Lineares Sondieren: Beispiel
22
154 28
3110
22
154 28
3110
22
154 2817
3110
22
154 2817
3110
22
154 2817
3110
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
ins(17) 1. Son- dierung
ins(17) 2. Son- dierung
ins(59) 1. Son- dierung
ins(59) 2. Son- dierung
ins(59) 3. Son- dierung
hÕ(k) =k mod 11 h(k,i) = (hÕ(k) +i) mod 11
/\
*° °←s
.hfsg ,o)
=( h 45g )
to) mod
mmo÷ :
=
4
g.
n)
=( ÷ 4 +1 )
mod n= 5
-
sgz )
=6
h ( b
, o)
=7
hlsg
,4)
=8 I
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
-
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
#
1g-
1 1 1 11hck ,o)
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
=
m !
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
Yt×t*× .
' 1Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
0
.
Hashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
min ÷
±+±+
- .. .tn itiikkhlersefa
1×1×1In ± - i ' ' In 'e SlotHashing II Offene Adressierung
Lineares Sondieren
Hashfunktion beim linearen Sondieren h(k,i) = (hÕ(k) +i) modm (für i <m).
I hÕ ist eine übliche Hashfunktion.
I Die Verschiebung der nachfolgende Sondierungen ist linear voni abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ m verschiedene Sequenzen können erzeugt werden.
I Clustering, also lange Folgen von belegten Slots, führt zu Problemen:
I hÕ(k)bleibt konstant, aber der Offset wird jedes Mal um eins größer.
I Ein leerer Slot, demi volle Slots vorausgehen, wird als nächstes mit Wahrscheinlichkeit i+1m gefüllt.
∆ Lange Folgen tendieren dazu länger zu werden.
.
Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I k ist der Schlüssel
I i ist der Index im Sondierungssequenz
I hÕ ist eine übliche Hashfunktion, und
I c1,c2œN\ {0} geeignete Konstanten.
HMI
0
Hashing II Offene Adressierung
Quadratisches Sondieren: Beispiel
22
4 28 1531 10
22
4 28 1531 10
22
4 28 1531 10
22
4 28 1531 10
22
174
28 1531 10
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
ins(17) 1. Son- dierung
ins(17) 2. Son- dierung
ins(17) 3. Son- dierung
ins(17) 4. Son- dierung
hÕ(k) = k mod 11 h(k,i) = (hÕ(k) +i+3i2) mod 11
*
0 0
o 0
- 9=1 Cz= 3
h## h( hick )=
k,i)= (
khkk
mod mod)tit3i2
^^ ^^)
hc
17,0)
=6
mod ^^=6
-
h(
17in ) =( 6+1+3 )
mod un= ^0h
(
17,2)
=( btztnz )
mod n =g
h ( 17,3
)
=( 6
+ 3. +3 .32 )
mod m = 3Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
-
Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
0
1 1
:
k , o)Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
O
ns ! Permutation en
Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
-
Hashing II Offene Adressierung
Quadratisches Sondieren
Hashfunktion beim quadratischen Sondieren h(k,i) = (hÕ(k) +c1·i+c2·i2) modm (für i <m).
I hÕ ist eine übliche Hashfunktion, c1,c2”=0 Konstanten.
I Die Verschiebung der nachfolgende Sondierungen ist quadratisch von i abhängig.
I Die erste Sondierung bestimmt bereits die gesamte Sequenz.
∆ Auch hier können mverschiedene Sequenzen erzeugt werden (wenn c1,c2 geeignet gewählt wurden).
I Das Clustering von linearem Sondieren wird vermieden.
I Jedoch tritt sekundäres Clustering immer noch auf:
h(k, 0) =h(kÕ, 0) verursacht h(k,i) =h(kÕ,i) für alle i.
¥nii
= -0
!Hashing II Offene Adressierung
Doppeltes Hashing
Hashfunktion beim doppelten Hashing h(k,i) = (h1(k) +i·h2(k)) mod m(für i <m).
I h1,h2 sind übliche Hashfunktionen.
÷
i + i+si2
Hashing II Offene Adressierung
Doppeltes Hashing: Beispiel
22
154
28
3110
22
154
28
3110
22
154
28
3110
22
154
28
3110
22
154
28 1731 10
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
ins(17) 1. Son- dierung
ins(17) 2. Son- dierung
ins(17) 3. Son- dierung
ins(17) 4. Son- dierung
h1(k) =k mod 11
h2(k) =1+k mod 10 h(k,i) = (h1(k) +i ·h2(k)) mod 11
*
0
0
: is
- -
h , ( k
)
=k
mod 11^
hz
( k)
= t + K mod 10hcksi )
=(
h , ( k)
+ inhzck ) )
mod 11insert ( i7
)
:h
(
17,0)
=(
17 mod- in)
mod n s6
= 6
h
Gan )
=(
6 + 1.fit
17 mod- 10) )
mod 117
14 mod 11 = 3
h(
17,2)
= . 2.( (@t @
ntttmodno-) )
modes= 22 mod m
Hashing II Offene Adressierung
Doppeltes Hashing
Hashfunktion beim doppelten Hashing h(k,i) = (h1(k) +i·h2(k)) mod m(für i <m).
I h1,h2 sind übliche Hashfunktionen.
I Die Verschiebung der nachfolgende Sondierungen ist vonh2(k) abhängig.
I Die erste Sondierung bestimmtnicht die gesamte Sequenz.
∆ Bessere Verteilung der Schlüssel in der Hashtabelle.
∆ Approximiert das gleichverteilte Hashing.
I Sindh2 und m relativ prim, wird die gesamte Hashtabelle abgesucht.
I Wähle z. B.m=2k undh2 so, dass sie nur ungerade Zahlen erzeugt.
I Jedes mögliche Paarh1(k)und h2(k)erzeugt eine andere Sequenz.
∆ Daher könnenm2 verschiedene Permutationen erzeugt werden.
Hashing II Offene Adressierung
Doppeltes Hashing
Hashfunktion beim doppelten Hashing h(k,i) = (h1(k) +i·h2(k)) mod m(für i <m).
I h1,h2 sind übliche Hashfunktionen.
I Die Verschiebung der nachfolgende Sondierungen ist vonh2(k) abhängig.
I Die erste Sondierung bestimmtnicht die gesamte Sequenz.
∆ Bessere Verteilung der Schlüssel in der Hashtabelle.
∆ Approximiert das gleichverteilte Hashing.
I Sindh2 und m relativ prim, wird die gesamte Hashtabelle abgesucht.
I Wähle z. B.m=2k undh2 so, dass sie nur ungerade Zahlen erzeugt.
I Jedes mögliche Paarh1(k)und h2(k)erzeugt eine andere Sequenz.
∆ Daher könnenm2 verschiedene Permutationen erzeugt werden.
Hashing II Offene Adressierung
Doppeltes Hashing
Hashfunktion beim doppelten Hashing h(k,i) = (h1(k) +i·h2(k)) mod m(für i <m).
I h1,h2 sind übliche Hashfunktionen.
I Die Verschiebung der nachfolgende Sondierungen ist vonh2(k) abhängig.
I Die erste Sondierung bestimmtnicht die gesamte Sequenz.
∆ Bessere Verteilung der Schlüssel in der Hashtabelle.
∆ Approximiert das gleichverteilte Hashing.
I Sindh2 und m relativ prim, wird die gesamte Hashtabelle abgesucht.
I Wähle z. B.m=2k undh2 so, dass sie nur ungerade Zahlen erzeugt.
I Jedes mögliche Paarh1(k)und h2(k)erzeugt eine andere Sequenz.
∆ Daher könnenm2 verschiedene Permutationen erzeugt werden.
h , (k) mod m k , k
'
(
h , Ck )t heck ) ) mod m h ' 4)hick= ')( h ,( k) trhzck )) nod m immehin
hzck ) =/ hzcky