13.07.2015 Aufrufe

3.4 Hashing Hash- oder auch Streuspeicherverfahren sind dadurch ...

3.4 Hashing Hash- oder auch Streuspeicherverfahren sind dadurch ...

3.4 Hashing Hash- oder auch Streuspeicherverfahren sind dadurch ...

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>3.4</strong> <strong><strong>Hash</strong>ing</strong><strong>Hash</strong>- <strong>oder</strong> <strong>auch</strong> <strong>Streuspeicherverfahren</strong> <strong>sind</strong> <strong>dadurch</strong>gekennzeichnet, dass jedem Schlüssel aus einem Universum Udurch eine (effizient berechenbare) Funktion h (die <strong>Hash</strong>funktion)eine Adresse ∈ {0, . . . , m − 1} zugeordnet wird. Der Schlüssel kwird dann im Prinzip im Element A[h(k)] des m-elementigenFeldes A[0..m − 1] gespeichert.Im Idealfall <strong>sind</strong> dann die Wörterbuchoperationen effizientausführbar, bestimmt durch den Aufwand für die Berechnung vonh(k).ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 346/451ľErnst W. Mayr


Da |U| ≫ m, kann h natürlich nicht injektiv sein, und es kommtzu Kollisionen:h(x) = h(y) für gewisse x ≠ y .Normalerweise <strong>sind</strong> wir nur an einer kleineren Teilmenge S ⊂ Uvon Schlüsseln interessiert (|S| = n), und wir haben, derSpeichereffizienz halber, z.B.m ∈ {n, . . . , 2n}Selbst in diesem Fall <strong>sind</strong> Kollisionen jedoch zu erwarten, wie z.B.das so genannte Geburtstagsparadoxon zeigt:ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 347/451ľErnst W. Mayr


In einer Menge von mindestens 23 zufällig gewählten Personen gibtes mit Wahrscheinlichkeit größer als 1 2zwei Personen, die amgleichen Tag des Jahres Geburtstag haben (Schaltjahre werden hiernicht berücksichtigt).Das Geburtstagsparadoxon ist äquivalent dazu, dass in einer<strong>Hash</strong>tabelle der Größe 365, die mindestens 23 Einträge enthält,wobei die <strong>Hash</strong>adressen sogar zufällig gewählt <strong>sind</strong>, bereits miteiner Wahrscheinlichkeit von mehr als 1 2eine Kollision vorkommt.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 348/451ľErnst W. Mayr


Satz 167In einer <strong>Hash</strong>tabelle der Größe m mit n Einträgen tritt mit einerWahrscheinlichkeit von mindestens 1 − e −n(n−1)/(2m) mindestenseine Kollision auf, wenn für jeden Schlüssel die <strong>Hash</strong>adressegleichverteilt ist.Beweis:Die Wahrscheinlichkeit, dass <strong>auch</strong> der i-te eingefügte Schlüsselkeine Kollision verursacht, istm − (i − 1).mDie Wahrscheinlichkeit, dass für alle n Schlüssel keine Kollisioneintritt, ist daherPr {keine Kollision} =n∏i=1m − (i − 1)m= exp( n−1 ∑(ln 1 − i ) )mi=0ADS-EI 349/451ľErnst W. Mayr


Satz 167In einer <strong>Hash</strong>tabelle der Größe m mit n Einträgen tritt mit einerWahrscheinlichkeit von mindestens 1 − e −n(n−1)/(2m) mindestenseine Kollision auf, wenn für jeden Schlüssel die <strong>Hash</strong>adressegleichverteilt ist.Beweis:Da ln(1 + x) ≤ x für alle x ∈ R, folgt damitPr {keine Kollision} = exp≤ exp( n−1 ∑i=0(= exp −ln(1 − i ) )m( n−1 ∑(− i ) )mi=0)n(n − 1).2mADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 349/451ľErnst W. Mayr


Korollar 168Hat eine <strong>Hash</strong>tabelle der Größe m mindestens ω( √ m) Einträge,wobei für jeden Schlüssel die <strong>Hash</strong>adressen gleichverteilt <strong>sind</strong>, sotritt mit Wahrscheinlichkeit 1 − o(1) eine Kollision auf.Definition 169Eine <strong>Hash</strong>funktion h heißt ideal, wenn gilt⎡∑(∀i ∈ {0, . . . , m − 1}) ⎢⎣k∈Uh(k)=i⎤Pr {k} = 1 ⎥m⎦ ,wobei Pr {k} die Wahrscheinlichkeit ist, mit der der Schlüsselk ∈ U vorkommt.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 350/451ľErnst W. Mayr


Beispiele für gebräuchliche <strong>Hash</strong>funktionen:1 Additionsmethode:h(k) =( r∑i=0((k mod 2 α i) div 2 β i) ) mod mfür α i ≥ β i ∈ {0, . . . , l(|U|) − 1}2 Multiplikationsmethode: Sei a ∈ (0, 1) eine Konstante.Eine gute Wahl für a ist z.B.h(k) = ⌊m · (ka − ⌊ka⌋)⌋a =√5 − 12= 1 ϕ≈ 0, 618 . . . ,wobei ϕ = 1+√ 52der Goldene Schnitt ist.ADS-EI 351/451ľErnst W. Mayr


Beispiele für gebräuchliche <strong>Hash</strong>funktionen:3 Teilermethode:h(k) = k mod m ,wobei m keine Zweier- <strong>oder</strong> Zehnerpotenz und <strong>auch</strong> nicht vonder Form 2 i − 1 sein sollte. Eine gute Wahl für m ist i.A. einePrimzahl, die nicht in der Nähe einer Zweierpotenz liegt.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 351/451ľErnst W. Mayr


<strong>3.4</strong>.1 Kollisionsauflösung<strong><strong>Hash</strong>ing</strong> durch VerkettungIn jedem Feldelement der <strong>Hash</strong>tabelle wird eine lineare Liste derSchlüssel abgespeichert, die durch die <strong>Hash</strong>funktion auf diesesFeldelement abgebildet werden. Die Implementierung derOperationen is member, insert und delete ist offensichtlich.Sei α = n mder Füllgrad der <strong>Hash</strong>tabelle. Dann beträgt, beiGleichverteilung der Schlüssel, die Länge einer jeden der linearenListen im Erwartungswert α und der Zeitaufwand für die Suchenach einem Schlüssel imerfolgreichen Fall 1 + α 2erfolglosen Fall 1 + αFür die Operationen insert und delete ist darüber hinaus lediglichein Zeitaufwand von O(1) erforderlich.ADS-EI 352/451ľErnst W. Mayr


<strong><strong>Hash</strong>ing</strong> durch VerkettungIn jedem Feldelement der <strong>Hash</strong>tabelle wird eine lineare Liste derSchlüssel abgespeichert, die durch die <strong>Hash</strong>funktion auf diesesFeldelement abgebildet werden. Die Implementierung derOperationen is member, insert und delete ist offensichtlich.Sei α = n mder Füllgrad der <strong>Hash</strong>tabelle. Dann beträgt, beiGleichverteilung der Schlüssel, die Länge einer jeden der linearenListen im Erwartungswert α und der Zeitaufwand für die Suchenach einem Schlüssel imerfolgreichen Fall 1 + α 2erfolglosen Fall 1 + α<strong><strong>Hash</strong>ing</strong> durch Verkettung (engl. chaining) ist ein Beispiel für eingeschlossenes <strong>Hash</strong>verfahren.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 352/451ľErnst W. Mayr


Lineare SondierungMan führt eine erweiterte <strong>Hash</strong>funktion h(k, i) ein. Soll derSchlüssel k neu in die <strong>Hash</strong>tabelle eingefügt werden, wird die Folgeh(k, 0), h(k, 1), h(k, 2), . . . durchlaufen, bis die erste freie Positionin der Tabelle gefunden wird.Beim Verfahren des linearen Sondierens (engl. linear probing) isth(k, i) = (h(k) + i) (mod m) .Für den Zeitaufwand für die Suche nach einem Schlüssel kann manzeigen imerfolgreichen Fall: 1 (1 + 1 )2 1 − αerfolglosen Fall: 1 ()11 +2 (1 − α) 2ADS-EI 354/451ľErnst W. Mayr


Lineare SondierungMan führt eine erweiterte <strong>Hash</strong>funktion h(k, i) ein. Soll derSchlüssel k neu in die <strong>Hash</strong>tabelle eingefügt werden, wird die Folgeh(k, 0), h(k, 1), h(k, 2), . . . durchlaufen, bis die erste freie Positionin der Tabelle gefunden wird.Beim Verfahren des linearen Sondierens (engl. linear probing) isth(k, i) = (h(k) + i) (mod m) .Die Implementierung von insert ist kanonisch, bei delete ist jedochSorge zu tragen, dass keine der Sondierungsfolgenh(k, 0), h(k, 1), h(k, 2), . . . unterbrochen wird. Oft werdengelöschte Elemente daher nicht wirklich entfernt, sondern nur alsgelöscht markiert.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 354/451ľErnst W. Mayr


Ein großes Problem der linearen Sondierung ist, dass sich durchKollisionen große zusammenhängende Bereiche von belegtenPositionen der <strong>Hash</strong>tabelle ergeben können, wodurch die Suchfolgebei nachfolgenden Einfügungen sehr lang werden kann und <strong>auch</strong>solche Bereiche immer mehr zusammenwachsen können. DiesesProblem wird als primäre Häufung (engl. primary clustering)bezeichnet.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 355/451ľErnst W. Mayr


Lineares Sortieren: Idee: Wird ein Element x auf den i-ten Speicherplatabgebildet, so wird es dort gespeichert, falls der Platz noch nicht beSonst wird es im i + 1-ten Speicherplatz gespeichert, falls dieser nochBeispiel 171 (Lineare Sondierung)andernfalls . . .⎫0 12345678910⎪⎬Überläufer der 0⎪⎭⎫⎪⎬Überläufer der 5⎪⎭Faustregel: Diese Möglichkeit ist nur br<strong>auch</strong>bar, falls |M| ≫ |S|.Doppeltes <strong>Hash</strong>en: h(k, i) = h 1 (k) + i · h 2 (k) mod m, wobei h 1 und hADS-EI <strong>Hash</strong>funktionen <strong>sind</strong>. <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 356/451ľErnst W. Mayr


Quadratische SondierungBeim Verfahren des quadratischen Sondierens (engl. quadraticprobing) isth(k, i) = (h(k) − (−1) i (⌈i/2⌉ 2 )) (mod m) .Surjektivität der Folge h(k, 0), h(k, 1), h(k, 2), . . . kann garantiertwerden, wenn z.B. m prim und m ≡ 3 mod 4 ist. Für denZeitaufwand für die Suche nach einem Schlüssel kann man zeigenimerfolgreichen Fall: 1 − α ( ) 12 + ln 1 − α( )erfolglosen Fall: 1 +α2 11 − α + ln 1 − αFür die Implementierung von delete gilt die gleiche Bemerkung wiebeim linearen Sondieren.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 357/451ľErnst W. Mayr


Doppeltes <strong><strong>Hash</strong>ing</strong>Beim Verfahren des doppelten <strong><strong>Hash</strong>ing</strong>s (engl. double hashing) isth(k, i) = (h(k) + i · h ′ (k)) (mod m) .Dabei sollte h ′ (k) für alle k teilerfremd zu m sein, z.B.h ′ (k) = 1 + (k mod (m − 1)) <strong>oder</strong> h ′ (k) = 1 + (k mod (m − 2)).Surjektivität der Folge h(k, 0), h(k, 1), h(k, 2), . . . kann danngarantiert werden, wenn m prim ist. Für den Zeitaufwand für dieSuche nach einem Schlüssel kann man zeigen imerfolgreichen Fall: 1 ( ) 1α ln 1 − α1erfolglosen Fall:1 − αFür die Implementierung von delete gilt die gleiche Bemerkung wiebeim linearen Sondieren.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 358/451ľErnst W. Mayr


Bemerkung:<strong><strong>Hash</strong>ing</strong> mit Kollisionsauflösung durch lineares <strong>oder</strong> quadratischesSondieren, wie <strong>auch</strong> doppeltes <strong><strong>Hash</strong>ing</strong>, <strong>sind</strong> Beispiele für sogenannteoffene <strong>Hash</strong>verfahren,da die Schlüssel nicht unbedingt an ihrer (ersten) <strong>Hash</strong>adresseabgespeichert werden.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 359/451ľErnst W. Mayr


5040Vergleiche für erfolgreiche Suche (abh. vom Füllgrad)Lineare SondierungQuadratische SondierungDoppeltes <strong><strong>Hash</strong>ing</strong>Verkettung30201000 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1ADS-EI 360/451ľErnst W. Mayr


50Vergleiche für erfolglose Suche (abh. vom Füllgrad)Lineare SondierungQuadratische SondierungDoppeltes <strong><strong>Hash</strong>ing</strong>Verkettung4030201000 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 360/451ľErnst W. Mayr


<strong>3.4</strong>.1 Universelle <strong>Hash</strong>funktionenDefinition 172Eine Menge H von <strong>Hash</strong>funktionen heißt universell, falls gilt:∀x, y ∈ U, x ≠ y|{h ∈ H; h(x) = h(y)}||H|} {{ }Pr{h(x)=h(y)}≤ 1 mSatz 173Sei H eine universelle Familie von <strong>Hash</strong>funktionen (für eine<strong>Hash</strong>tabelle der Größe m), sei S ⊂ U eine feste Menge vonSchlüsseln mit |S| = n ≤ m, und sei h ∈ H eine zufällig gewählte<strong>Hash</strong>funktion (wobei alle <strong>Hash</strong>funktionen ∈ H gleichwahrscheinlich <strong>sind</strong>). Dann ist die erwartete Anzahl von Kollisioneneines festen Schlüssels x ∈ S mit anderen Schlüsseln in S kleinerals 1.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 361/451ľErnst W. Mayr


Beweis:Es giltE[# Kollisionen mit x] = ∑ 1m = n − 1m < 1 .y∈Sy≠xSei nun m = p eine Primzahl. Dann ist Z p = {0, 1, . . . , p − 1} einKörper.Wir betrachten im Folgenden U = {0, 1, . . . , p − 1} r+1 .ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 362/451ľErnst W. Mayr


Sei die Familie H = {h α ; α ∈ U} von <strong>Hash</strong>funktionen definiertdurch( r∑)h α (x 0 , . . . , x r ) = α i · x i mod pi=0Satz 174H ist universell.ADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 363/451ľErnst W. Mayr


Beweis:Sei x ≠ y, o.B.d.A. x 0 ≠ y 0 . Dann gilt h α (x) = h α (y) gdwα 0 (y 0 − x 0 ) =r∑α i (x i − y i ) .i=1Für jede Wahl von (α 1 , . . . , α r ) gibt es daher genau ein α 0 , das zueiner Kollision führt.Es gilt daher|{h ∈ H; h(x) = h(y)}||H|= prp r+1 = 1 p = 1 mADS-EI <strong>3.4</strong> <strong><strong>Hash</strong>ing</strong> 364/451ľErnst W. Mayr


4. Vorrangwarteschlangen (priority queues)Definition 175Eine Vorrangwarteschlange (priority queue) ist eine Datenstruktur,die die folgenden Operationen effizient unterstützt:1 Insert2 ExtractMin Extrahieren und Löschen des Elements mit demkleinsten Schlüssel3 DecreaseKey Verkleinern eines Schlüssels4 Union (meld) Vereinigung zweier (disjunkter) Priority QueuesADS-EI 4 Vorrangwarteschlangen (priority queues) 365/451ľErnst W. Mayr


Wir besprechen die Implementierung einer Vorrangwarteschlangeals Binomial Heap. Diese Implementierung ist (relativ) einfach,aber asymptotisch bei weitem nicht so gut wie m<strong>oder</strong>nereDatenstrukturen für Priority Queues, z.B. Fibonacci Heaps (die inweiterführenden Vorlesungen besprochen werden).Hier ist ein kurzer Vergleich der Zeitkomplexitäten:BinHeap FibHeapInsert O(log n) O(1)ExtractMin O(log n) O(log n)DecreaseKey O(log n) O(1)Union O(log n) O(1)worst case amortisiertADS-EI 4 Vorrangwarteschlangen (priority queues) 366/451ľErnst W. Mayr

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!