• Keine Ergebnisse gefunden

Datenstrukturen und Algorithmen Vorlesung 13: Hashing II Joost-Pieter Katoen

N/A
N/A
Protected

Academic year: 2022

Aktie "Datenstrukturen und Algorithmen Vorlesung 13: Hashing II Joost-Pieter Katoen"

Copied!
104
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

Hashing II

Übersicht

1 Hashing und Verkettung

2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing

Effizienz der offenen Adressierung

{

(3)

Hashing II Hashing und Verkettung

Übersicht

1 Hashing und Verkettung

2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing

Effizienz der offenen Adressierung

(4)

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.

=

(5)

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.

(6)

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 ]

(7)

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 N

(8)

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.

IN

0

=

(9)

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

(10)

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

(11)

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

0

k2

k4 k3

k5

K

m≠1 k1

k6

k7

k4

(12)

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

0

k2

k4 k3

k5

K

m≠1 k1

k6

k7

k4

O

sa

hcks ) = hckb ) = hckz )

(13)

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+–).

@

Fullgrad

n = Anzahl belegtv slots in T

IH = m K N = lul

(14)

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)

(15)

Hashing II Offene Adressierung

Übersicht

1 Hashing und Verkettung

2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing

Effizienz der offenen Adressierung

(16)

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 Sondierung ab:

h :U◊{0, 1,. . .m≠1}≠æ{0, 1,. . .m≠1}

(18)

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}

(19)

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@

(20)

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

(21)

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

=

-

(22)

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)

#

is

(23)

Hashing 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}

(24)

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.

(25)

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.

(26)

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 )=i

sei k ' nach k

eingefigt

in T

und bein Enfige von K ' wurde malsondiert

so dap hck ', j )=i hck ;j+ ,)

suche k '

' hcksjtz )

nachda k |k'/

#

gel "oscht wunde

TL

NULL

(27)

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.

.

DELETED h ( k', j )

1kt # = i

i hcksjts )

:

.

(28)

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.

.

.

(29)

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.

-

. -

(30)

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.

(31)

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.

(32)

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)

: :

.

(33)

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

(34)

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

(35)

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.

.

Positions

m ! Permutations

Pr ( Permutation × ) = 1

m !

(36)

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.

(37)

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.

(38)

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-

-

(39)

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.

:

-

(40)

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

-

(41)

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 = 7

(42)

Hashing 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

.

(43)

hfsg ,o)

=

( h 45g )

to

) mod

m

mo÷ :

=

4

g.

n

)

=

( ÷ 4 +1 )

mod n

= 5

-

sgz )

=

6

h ( b

, o

)

=

7

hlsg

,

4)

=

8 I

(44)

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.

(45)

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.

-

(46)

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.

#

1

g-

1 1 1 11

hck ,o)

(47)

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 !

(48)

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*× .

' 1

(49)

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.

0

.

(50)

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 iti

ikkhlersefa

1×1×1In ± - i ' ' In 'e Slot

(51)

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.

.

(52)

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

(53)

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

(54)

h## h( hick )=

k

,i)= (

k

hkk

mod mod

)tit3i2

^^ ^^

)

hc

17,0

)

=

6

mod ^^

=6

-

h(

17in ) =

( 6+1+3 )

mod un= ^0

h

(

17,2

)

=

( btztnz )

mod n =

g

h ( 17,3

)

=

( 6

+ 3. +3 .

32 )

mod m = 3

(55)

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.

(56)

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.

-

(57)

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)

(58)

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

(59)

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.

-

(60)

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

!

(61)

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

(62)

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

- -

(63)

h , ( k

)

=

k

mod 11

^

hz

( k

)

= t + K mod 10

hcksi )

=

(

h , ( k

)

+ in

hzck ) )

mod 11

insert ( i7

)

:

h

(

17,0

)

=

(

17 mod- in

)

mod n s

6

= 6

h

Gan )

=

(

6 + 1.

fit

17 mod- 10

) )

mod 11

7

14 mod 11 = 3

h(

17,2

)

= . 2.

( (@t @

ntttmodno-

) )

modes

= 22 mod m

(64)

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.

(65)

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.

(66)

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

Referenzen

ÄHNLICHE DOKUMENTE

I Element getMin(PriorityQueue pq) gibt das Element mit dem kleinsten Schlüssel zurück; benötigt nicht-leere pq. I void delMin(PriorityQueue pq) entfernt das Element mit dem

I Die Partitionierung hat eine lineare Zeitkomplexität, d. eine Zerlegung im Verhältnis 9:1. alle Elemente im zu sortierenden Array E sind unterschiedlich 3.. Quicksort

Teile-und-Beherrsche Algorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe

I Ein AVL-Baum ist ein balancierter BST, bei dem für jeden Knoten die Höhe der beiden Teilbäume höchstens um 1 differiert. I Bei AVL-Bäumen wird die Höhe der Teilbäume der

I Die Priorität eines Randknotens muss nach jeder gefundenen Kante angepasst werden. Bei einem Graph mit n Knoten und m Kanten

Wir werden zeigen, dass ein Fluss in G genau dann maximal ist, wenn sein Restnetzwerk keine augmentierende Pfade enthält. Dazu benutzen

Die Worst-Case-Laufzeit ist abhängig vom Wert eines maximalen Flusses, da der Wert des Flusses im schlimmsten Fall sich jeweils nur um eine Einheit erhöht. Joost-Pieter

Splay Trees, Fibonacci Heaps, Google’s Pagerank Algorithm, Cocktail Sort, B-Bäume, Deutsch-Schorr-Waite Baumtraversierung, Bit-State Hashing, Binäre Entscheidungsdiagramme,