Dictionary Definition

Ähnliche Dokumente
12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete.

13. Hashing. AVL-Bäume: Frage: Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n)

Hashing II. Übersicht. 1 Hashing und Verkettung. 2 Offene Adressierung

Hashing I. 1 Direkte Adressierung. 2 Grundlagen des Hashings. 3 Kollisionsauflösung durch Verkettung. 4 Hashfunktionen. 5 Offene Adressierung

Datenstrukturen und Algorithmen. Vorlesung 10

Teil VII. Hashverfahren

Eine universelle Klasse von Hash-Funktionen

Hashing. Überblick Aufgabe Realisierung

Informatik II, SS 2016

Hashing Hashfunktionen Kollisionen Ausblick. Hashverfahren. Dank an: Beate Bollig, TU Dortmund! 1/42. Hashverfahren

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

P ( Mindestens zwei Personen haben am gleichen Tag Geb. ) (1) = 1 P ( Alle Personen haben an verschiedenen Tagen Geb. ) (2)

U h(k 1 ) h(k 4 ) k 1 h(k 3 )

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

Algorithmen und Datenstrukturen

Implementierung von Mengen (und Wörterbücher): Alternative zu Suchbäumen

Beweis: Die obere Schranke ist klar, da ein Binärbaum der Höhe h höchstens

Algorithmen und Datenstrukturen

Themen. Hashverfahren. Stefan Szalowski Programmierung II Hashverfahren

Informatik II, SS 2014

Informatik II, SS 2014

Informatik II, SS 2018

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Hashverfahren

Hashing. Übersicht. 5 Hashing

Die mittlere Zeit zum Auffinden eines Elements in einer Hash-Tabelle beträgt, unter realistischen Annahmen, O(1).

17. Hashing. Hash Tabellen, Geburtstagsparadoxon, Hashfunktionen, Kollisionsauflösung durch Verketten, offenes Hashing, Sondieren

Datenstrukturen und Algorithmen. Vorlesung 9

Informatik I 5. Kapitel. Hashverfahren. Hashverfahren. Hashverfahren. Rainer Schrader. 3. Juni Gliederung

Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Sommersemester Dr. Tobias Lasser

Übung Algorithmen und Datenstrukturen

Übersicht. Datenstrukturen und Algorithmen. Einführung (II) Einführung (I) Vorlesung 12: Hashing I (K11) Counting Sort. Joost-Pieter Katoen

Kap. 5 Hashing. 15./16. VO DAP2 SS /18. Juni 2009

14. Hashing. Motivation. Naive Ideen. Bessere Idee? k(s) = s i b i

Kollision Hashfunktion Verkettung Offenes Hashing Perfektes Hashing Universelles Hashing Dynamisches Hashing. 4. Hashverfahren

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Grundlagen: Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Kap. 5 Hashing. Linux-Kurs 2. Teil. Überblick. Motivation. 4 Idee von Hashing. Idee von Hashing. Warum soll ich heute hier bleiben? Und wenn nicht?

4.4.1 Statisches perfektes Hashing. des Bildbereichs {0, 1,..., n 1} der Hashfunktionen und S U, S = m n, eine Menge von Schlüsseln.

Algorithmen und Datenstrukturen II: Hashverfahren

4. Übung zu Algorithmen I 17. Mai 2017

Untersuchen Sie, inwiefern sich die folgenden Funktionen für die Verwendung als Hashfunktion eignen. Begründen Sie Ihre Antwort.

3. Übung Algorithmen I

Algorithmen und Datenstrukturen II: Hashverfahren

Grundlagen: Algorithmen und Datenstrukturen

Hashing. Algorithmen und Datenstrukturen II 1

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Hashtabellen. Hashverfahren, was ist das eigentlich?

Datenstrukturen und Algorithmen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Muster. Informatik 3 (Februar 2004) Name: Matrikelnummer: Betrachten Sie den folgenden Suchbaum. A G H J K M N

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Algorithmen und Datenstrukturen

17. Hashing. Motivation. Naive Ideen. Bessere Idee? k(s) = s i b i

Algorithmen und Datenstrukturen

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Algorithmen und Datenstrukturen 1 VU 6.0 Nachtragstest SS Oktober 2014

NAME, VORNAME: Studiennummer: Matrikel:

Fibonacci-Suche. Informatik I. Fibonacci-Suche. Fibonacci-Suche. Einführung. Rainer Schrader. 24. Mai 2005

Übungsklausur Algorithmen I

Untersuchen Sie, inwiefern sich die folgenden Funktionen für die Verwendung als Hashfunktion eignen. x 9

Transkript:

Kapitel ADS:IV IV. Datenstrukturen Record Linear List Linked List Stack Queue Priority Queue Dictionary Direct-address Table Hash Function ADS:IV-60 Datenstrukturen POTTHAST 2018

Dictionary Definition Ein Datenstruktur heißt Dictionary ( Wörterbuch ), wenn eingefügte Elemente anhand ihres Schlüssels gefunden und gelöscht werden können. ADS:IV-61 Datenstrukturen POTTHAST 2018

Dictionary Definition Ein Datenstruktur heißt Dictionary ( Wörterbuch ), wenn eingefügte Elemente anhand ihres Schlüssels gefunden und gelöscht werden können. Manipulation Element einfügen (Insert) Ein Element in das Dictionary einfügen. Element suchen (Search) Ein Element anhand seines Schlüssels im Dictionary nachschlagen. Element löschen (Delete) Ein Element aus dem Dictionary löschen. ADS:IV-62 Datenstrukturen POTTHAST 2018

Dictionary Definition Ein Datenstruktur heißt Dictionary ( Wörterbuch ), wenn eingefügte Elemente anhand ihres Schlüssels gefunden und gelöscht werden können. Manipulation Element einfügen (Insert) Ein Element in das Dictionary einfügen. Element suchen (Search) Ein Element anhand seines Schlüssels im Dictionary nachschlagen. Element löschen (Delete) Ein Element aus dem Dictionary löschen. Implementierung Direct-address Table Verwendung der Schlüssel als Indexe eines Arrays. Verwendung von Hashing zur Abbildung der Schlüsselmenge auf die Indexe eines Arrays. Suchbaum Verwendung von Baum-basierten Datenstrukturen. ADS:IV-63 Datenstrukturen POTTHAST 2018

Bemerkungen: Alternativ wird das Dictionary auch Associative Array (assoziatives Array) oder Map (Abbildung) genannt. Wir nehmen an, dass Elemente paarweise verschiedene Schlüssel haben. ADS:IV-64 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. ADS:IV-65 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Beispiel: U 1 9 4 5 0 2 3 7 8 6 U = {0, 1,..., m 1} ist das Universum möglicher Schlüssel ADS:IV-66 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Beispiel: A 0 U 1 1 9 4 0 2 5 7 3 8 6 2 3 4 5 6 7 8 9 U = {0, 1,..., m 1} ist das Universum möglicher Schlüssel A ist ein 0-indiziertes Array der Länge m ADS:IV-67 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Beispiel: U A 0 1 Records Key Satellitendaten 1 9 K 4 0 2 5 7 3 8 6 2 3 4 5 6 7 2 3 5 45 58 20 8 9 8 99 U = {0, 1,..., m 1} ist das Universum möglicher Schlüssel A ist ein 0-indiziertes Array der Länge m K U ist die Teilmenge tatsächlich benutzter Schlüssel ADS:IV-68 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Beispiel: U A 0 1 Records Key Satellitendaten 1 9 K 4 0 2 5 7 3 8 6 2 3 4 5 6 7 2 3 5 45 58 20 8 9 8 99 U = {0, 1,..., m 1} ist das Universum möglicher Schlüssel A ist ein 0-indiziertes Array der Länge m K U ist die Teilmenge tatsächlich benutzter Schlüssel ADS:IV-69 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Beispiel: A 0 U 1 1 9 K 4 0 2 5 7 3 8 6 45 58 20 2 3 4 5 6 7 99 8 9 U = {0, 1,..., m 1} ist das Universum möglicher Schlüssel A ist ein 0-indiziertes Array der Länge m K U ist die Teilmenge tatsächlich benutzter Schlüssel ADS:IV-70 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Manipulation Eingabe: A. Array der Länge m. x. Einzufügendes / zu löschendes Element. k. Schlüssel des gesuchten Elements. Ausgabe: x. Gesuchtes Element. Insert(A, x) 1. A[x.key] = x Search(A, k) 1. return(a[k]) Delete(A, x) 1. A[x.key] = NIL ADS:IV-71 Datenstrukturen POTTHAST 2018

Direct-address Table Definition Eine Direct-address Table (direktadressierte Tabelle) ist ein Dictionary, das für jeden möglichen Schlüsselwert genau einen Slot (Speicherplatz) eines Arrays vorhält. Manipulation Eingabe: A. Array der Länge m. x. Einzufügendes / zu löschendes Element. k. Schlüssel des gesuchten Elements. Ausgabe: x. Gesuchtes Element. Insert(A, x) 1. A[x.key] = x Search(A, k) 1. return(a[k]) Delete(A, x) 1. A[x.key] = NIL Limitierungen Das Vorhalten von A mit m= U Slots ist für große U unpraktisch / unmöglich. Bei K U wird der meiste für A benötigte Platz verschwendet. ADS:IV-72 Datenstrukturen POTTHAST 2018

Bemerkungen: Laufzeit: Θ(1) für alle Operationen im Worst-Case. Wenn der Datentyp der Satellitendaten der Records es zulässt, können sie auch direkt im Array abgelegt werden. Das Speichern des Schlüssels als Teil des Elements ist dann redundant, da der Array-Index eindeutig anzeigt, welchen Schlüssel ein Element hat. ADS:IV-73 Datenstrukturen POTTHAST 2018

Definition Eine (Hashtabelle) ist ein Dictionary, das mit Hilfe einer Hashfunktion h : U {0, 1,..., m 1} das Universum U möglicher Schlüssel auf m Slots eines Arrays abbildet. ADS:IV-74 Datenstrukturen POTTHAST 2018

Definition Eine (Hashtabelle) ist ein Dictionary, das mit Hilfe einer Hashfunktion h : U {0, 1,..., m 1} das Universum U möglicher Schlüssel auf m Slots eines Arrays abbildet. Beispiel: U A 0 k 1 h(k 1 ) h(k 4 ) K k 4 k 5 h(k 2 ) = h(k 5 ) k 2 k 3 h(k 3 ) m 1 ADS:IV-75 Datenstrukturen POTTHAST 2018

Definition Eine (Hashtabelle) ist ein Dictionary, das mit Hilfe einer Hashfunktion h : U {0, 1,..., m 1} das Universum U möglicher Schlüssel auf m Slots eines Arrays abbildet. Sei K U die Teilmenge tatsächlich benutzter Schlüssel. Der Fall, dass h(k i ) = h(k j ) für Schlüssel k i, k j K und k i k j, heißt Hashkollision. Dynamische s implementieren eine Strategie zur Kollisionsbehandlung: Chaining (Verkettung) Verwendung von Linked Lists, um kollidierende Elemente im gleichen Slot abzulegen. Open Addressing (offene Adressierung) falls K m Bestimmung eines alternativen, noch unbelegten Slots im Falle einer Kollision. Statische s implementieren eine perfekte Hashfunktion. ADS:IV-76 Datenstrukturen POTTHAST 2018

Bemerkungen: Das Verb to hash (zerhacken) weckt die passende Assoziation zufälligen Zusammenwürfelns von Schlüsselbestandteilen durch eine Hashfunktion. Das Universum von Schlüsseln kann, anders als bei der Direct-address Table, Schlüssel aller im Computer darstellbaren Datentypen beinhalten. Typischerweise sind U > m und U K. Andernfalls sind Direct-address Tables besser geeignet. ADS:IV-77 Datenstrukturen POTTHAST 2018

Chaining: Definition Jeder Array-Slot enthält eine Variante einer Linked List, in die einzufügende Elemente eingereiht werden, um Hashkollisionen zu behandeln. Beispiel: A U k 1 k 4 k 1 K k 4 k 5 k 7 k 5 k 2 k 7 k 6 k 2 k 3 k 8 k 3 k 8 k 6 ADS:IV-78 Datenstrukturen POTTHAST 2018

Chaining: Manipulation Eingabe: Ausgabe: A. Array von m Linked Lists, in die n Elemente gemäß HashInsert und Hashfunktion h eingefügt wurden. x. Einzufügendes / zu löschendes Element. k. Schlüssel des gesuchten Elements. x. Gesuchtes Element. HashInsert(A, x) 1. L = A[h(x.key)] 2. y = SearchKey(L, x.key) 3. IF y == NIL THEN 4. InsertFront(L, x) 5. ENDIF HashSearch(A, k) 1. L = A[h(k)] 2. return(searchkey(l, k)) HashDelete(A, x) 1. L = A[h(x.key)] 2. Delete(L, x) ADS:IV-79 Datenstrukturen POTTHAST 2018

Chaining: Manipulation Eingabe: Ausgabe: A. Array von m Linked Lists, in die n Elemente gemäß HashInsert und Hashfunktion h eingefügt wurden. x. Einzufügendes / zu löschendes Element. k. Schlüssel des gesuchten Elements. x. Gesuchtes Element. HashInsert(A, x) 1. L = A[h(x.key)] 2. y = SearchKey(L, x.key) 3. IF y == NIL THEN 4. InsertFront(L, x) 5. ENDIF HashSearch(A, k) 1. L = A[h(k)] 2. return(searchkey(l, k)) HashDelete(A, x) 1. L = A[h(x.key)] 2. Delete(L, x) ADS:IV-80 Datenstrukturen POTTHAST 2018

Chaining: Laufzeit Annahme: Die Hashfunktion h lässt sich in Θ(1) Laufzeit errechnen. Best Case: HashInsert und HashSearch: T (n) = Θ(1) Entweder Liste L ist leer, oder x befindet sich am Anfang. HashDelete: T (n) = Θ(1) Falls Doubly Linked Lists verwendet werden. Worst Case: HashInsert und HashSearch: T (n) = Θ(n) Liste L enthält alle Elemente und x befindet sich gegebenenfalls am Ende. Voraussetzung: Die Hashfunktion h erzeugt ausschließlich Kollisionen. HashDelete: T (n) = Θ(1) Falls Doubly Linked Lists verwendet werden. ADS:IV-81 Datenstrukturen POTTHAST 2018

Chaining: Laufzeit Annahme: Simple Uniform Hashing (Einfaches gleichverteiltes Hashing) Die Wahrscheinlichkeit, mit der ein Schlüssel auf einen Slot gehasht wird, ist für jeden Slot 1/m. Load Factor (Beladungsfaktor): Unter der Annahme einfachen gleichverteilten Hashings, enthält eine Linked List im Durchschnitt α = n/m Elemente. Erwartete Listenlänge: Sei n j die Länge der List A[j] für j [0, m 1]. Es gilt n = n 0 + n 1 +... + n m 1. Die Erwartungswert E[n j ] = α = n/m. ADS:IV-82 Datenstrukturen POTTHAST 2018

Satz 1 (Average-Case-Laufzeit I) In einer, in der Kollisionen mit Chaining behandelt werden, ist die Average-Case-Laufzeit unter der Annahme von Simple Uniform Hashing bei erfolgloser Suche in Θ(1 + α). Beweis: Die Liste A[h(k)] muss bis zum Ende betrachtet werden. Ihre erwartete Länge E[n h(k) ] = α. Zuzüglich zur übrigen Laufzeit beträgt die Gesamtlaufzeit Θ(1 + α). ADS:IV-83 Datenstrukturen POTTHAST 2018

Satz 1 (Average-Case-Laufzeit I) In einer, in der Kollisionen mit Chaining behandelt werden, ist die Average-Case-Laufzeit unter der Annahme von Simple Uniform Hashing bei erfolgloser Suche in Θ(1 + α). Beweis: Die Liste A[h(k)] muss bis zum Ende betrachtet werden. Ihre erwartete Länge E[n h(k) ] = α. Zuzüglich zur übrigen Laufzeit beträgt die Gesamtlaufzeit Θ(1 + α). Satz 2 (Average-Case-Laufzeit II) In einer, in der Kollisionen mit Chaining behandelt werden, ist die Average-Case-Laufzeit unter der Annahme von Simple Uniform Hashing bei erfolgreicher Suche in Θ(1 + α). Beweisidee: Probabilistische Analyse der erwarteten Anzahl von Elementen, die untersucht werden müssen, um x zu finden, nämlich die Elemente, die nach x eingefügt wurden. Die sind in Θ(2 + α/2 α/2n) = Θ(1 + α). ADS:IV-84 Datenstrukturen POTTHAST 2018

Bemerkungen: Ein Load Factor von α < 1 bedeutet, dass weniger Elemente als Slots gespeichert werden, α = 1 bedeutet, dass die Zahl der Elemente und Slots gleich ist, und α > 1, dass mehr Elemente als Slots gespeichert werden, so dass Kollisionen unvermeidlich sind. Selbst bei einem Load Factor von α < 1 sind Kollisionen unter der Annahme von Simple Uniform Hashing schon bei wenigen zu speichernden Elementen wahrscheinlich. Zum Verständnis kann das sogenannte Geburtstagsparadoxon herangezogen werden: Befinden sich in einem Raum mindestens 23 Personen, dann ist die Chance, dass zwei oder mehr dieser Personen am gleichen Tag (ohne Beachtung des Jahrganges) Geburtstag haben, größer als 50%. Die Fallunterscheidung ist notwendig, da im Falle einer erfolgreichen Suche die Wahrscheinlichkeit, mit der eine Liste nach x durchsucht wird, proportional zu ihrer Länge ist, was bei erfolgloser Suche nicht der Fall ist. ADS:IV-85 Datenstrukturen POTTHAST 2018

Chaining: Laufzeit Interpretation: Wähle die Zahl der Slots m proportional zur erwarteten Zahl der Elemente n. Dann gilt n = O(m), so dass α = n m = O(m) m = O(1). Eine kann im Schnitt in O(1) Laufzeit manipuliert werden. ADS:IV-86 Datenstrukturen POTTHAST 2018

Open Addressing: Definition Jeder Array-Slot enthält maximal ein Element. Es werden mittels Hashfunktion h : U {0, 1,..., m 1} }{{} Sondierversuch {0, 1,..., m 1} }{{} Slot-Index iterativ alle Array-Slots sondiert, bis ein freier Slot gefunden wurde. ADS:IV-87 Datenstrukturen POTTHAST 2018

Open Addressing: Definition Jeder Array-Slot enthält maximal ein Element. Es werden mittels Hashfunktion h : U {0, 1,..., m 1} }{{} Sondierversuch {0, 1,..., m 1} }{{} Slot-Index iterativ alle Array-Slots sondiert, bis ein freier Slot gefunden wurde. Beispiel: U A k 7 k 1 h(k 7,3) h(k 1,0) = h(k 4,0) k 1 k 4 h(k 4,1) = h(k 7,2) K k 6 k 4 k 5 k 7 k 2 k 3 k 8 k 5 k 6 k 3 k 8 k 2 h(k 5,0) = h(k 2,0) = h(k 7,0) h(k 6,1) h(k 3,0) h(k 8,0) = h(k 6,0) h(k 2,1) = h(k 7,1) ADS:IV-88 Datenstrukturen POTTHAST 2018

Open Addressing: Definition Jeder Array-Slot enthält maximal ein Element. Es werden mittels Hashfunktion h : U {0, 1,..., m 1} }{{} Sondierversuch {0, 1,..., m 1} }{{} Slot-Index iterativ alle Array-Slots sondiert, bis ein freier Slot gefunden wurde. Beispiel: U A k 7 k 1 h(k 7,3) h(k 1,0) = h(k 4,0) k 1 k 4 h(k 4,1) = h(k 7,2) K k 6 k 4 k 5 k 7 k 2 k 3 k 8 k 5 k 6 k 3 k 8 k 2 h(k 5,0) = h(k 2,0) = h(k 7,0) h(k 6,1) h(k 3,0) h(k 8,0) = h(k 6,0) h(k 2,1) = h(k 7,1) ADS:IV-89 Datenstrukturen POTTHAST 2018

Open Addressing: Definition Jeder Array-Slot enthält maximal ein Element. Es werden mittels Hashfunktion h : U {0, 1,..., m 1} }{{} Sondierversuch {0, 1,..., m 1} }{{} Slot-Index iterativ alle Array-Slots sondiert, bis ein freier Slot gefunden wurde. Beispiel: U A k 7 k 1 h(k 7,3) h(k 1,0) = h(k 4,0) k 1 k 4 h(k 4,1) = h(k 7,2) K k 6 k 4 k 5 k 7 k 2 k 3 k 8 k 5 k 6 k 3 k 8 k 2 h(k 5,0) = h(k 2,0) = h(k 7,0) h(k 6,1) h(k 3,0) h(k 8,0) = h(k 6,0) h(k 2,1) = h(k 7,1) ADS:IV-90 Datenstrukturen POTTHAST 2018

Open Addressing: Definition Jeder Array-Slot enthält maximal ein Element. Es werden mittels Hashfunktion h : U {0, 1,..., m 1} }{{} Sondierversuch {0, 1,..., m 1} }{{} Slot-Index iterativ alle Array-Slots sondiert, bis ein freier Slot gefunden wurde. Die Folge von Slot-Indexen, die für ein gegebenes k durch h(k, i) für i = 0 bis i = m 1 berechnet wird, muss eine Permutation von {0, 1,..., m 1} sein. Heuristiken zum Probing (Sondieren): Linear Probing (Lineares Sondieren) Bestimmung des freien Slots mit dem nächstgrößten Index. Quadratic Probing (Quadratisches Sondieren) Bestimmung des freien Slots mit Hilfe einer quadratischen Funktion. Double Hashing (Doppel-Hashing) Bestimmung des freien Slots mit Hilfe zweier Hashfunktionen. ADS:IV-91 Datenstrukturen POTTHAST 2018

Bemerkungen: Heuristik (altgr. ich finde ; von auffinden, entdecken ) bezeichnet die Kunst, mit begrenztem Wissen (unvollständigen Informationen) und wenig Zeit dennoch zu wahrscheinlichen Aussagen oder praktikablen Lösungen zu kommen. [Wikipedia] ADS:IV-92 Datenstrukturen POTTHAST 2018

Open Addressing: Manipulation Eingabe: Ausgabe: A. Array von m Slots, in das n Elemente gemäß HashInsert und Hashfunktion h eingefügt wurden. k. Schlüssel des einzufügenden / gesuchten / zu löschenden Elements. i. Index des eingefügten / gesuchten Elements. HashInsert(A, k) 1. i = 0 2. DO 3. j = h(k, i) 4. IF A[j] == NIL OR A[j] == DEL THEN 5. A[j] = k 6. return(j) 7. ELSE 8. i = i + 1 9. ENDIF 10. WHILE i < m; 11. error( overflow ) HashSearch(A, k) 1. i = 0 2. DO 3. j = h(k, i) 4. IF A[j] == k THEN 5. return(j) 6. ENDIF 7. i = i + 1 8. WHILE (A[j] NIL OR A[j] == DEL) AND i < m; 9. return(nil) HashDelete(A, k) 1. j = HashSearch(A, k) 2. IF A[j] NIL THEN 3. A[j] = NIL 4. ENDIF ADS:IV-93 Datenstrukturen POTTHAST 2018

Open Addressing: Manipulation Eingabe: Ausgabe: A. Array von m Slots, in das n Elemente gemäß HashInsert und Hashfunktion h eingefügt wurden. k. Schlüssel des einzufügenden / gesuchten / zu löschenden Elements. i. Index des eingefügten / gesuchten Elements. HashInsert(A, k) 1. i = 0 2. DO 3. j = h(k, i) 4. IF A[j] == NIL OR A[j] == DEL THEN 5. A[j] = k 6. return(j) 7. ELSE 8. i = i + 1 9. ENDIF 10. WHILE i < m; 11. error( overflow ) HashSearch(A, k) 1. i = 0 2. DO 3. j = h(k, i) 4. IF A[j] == k THEN 5. return(j) 6. ENDIF 7. i = i + 1 8. WHILE (A[j] NIL OR A[j] == DEL) AND i < m; 9. return(nil) HashDelete(A, k) 1. j = HashSearch(A, k) 2. IF A[j] NIL THEN 3. A[j] = DEL 4. ENDIF ADS:IV-94 Datenstrukturen POTTHAST 2018

Bemerkungen: Beim Löschen eines Elements genügt es nicht, den entsprechenden Slot auf NIL zu setzen, sondern es wird ein spezielles Symbol DEL benötigt. Andernfalls würden Elemente unauffindbar, die mit einem vorher eingefügten und dann gelöschten Element kollidieren. Bei HashInsert und bei HashSearch muss daher das Symbol DEL zusätzlich zu NIL berücksichtigt werden: Beim Einfügen zählt ein Slot, der DEL enthält, als leerer Slot, beim Suchen als gefüllter Slot. Nachteil dieses Vorgehens ist, dass die Laufzeit für die Suche nach Elementen nun nicht mehr auf dem tatsächlichen Load Factor α der beruht, da nach einer langen Folge von Einfügungen und Löschungen mit der Zeit alle Array-Slots entweder belegt oder als gelöscht markiert sind. Eine Lösung besteht darin, den Load Factor inklusive der gelöschten Elemente zu berechnen und wenn der Load Factor sich 1 annähert, die (mit gegebenenfalls größerem Array) und ohne die gelöschten Elemente neu aufzubauen. ADS:IV-95 Datenstrukturen POTTHAST 2018

Open Addressing: Probing-Heuristiken Annahme: Uniform Hashing (Gleichverteiltes Hashing) Die Wahrscheinlichkeit, mit der ein Schlüssel eine der m! möglichen Permutationen von {0, 1,..., m 1} als Sondierungssequenz hat ist 1/m!. Hashfunktionen, die die Uniform-Hashing-Annahme erfüllen, sind schwer zu implementieren. In der Praxis werden heuristische Annäherungen eingesetzt, die weniger Sondierungssequenzen erzeugen können. ADS:IV-96 Datenstrukturen POTTHAST 2018

Open Addressing: Probing-Heuristiken Annahme: Uniform Hashing (Gleichverteiltes Hashing) Die Wahrscheinlichkeit, mit der ein Schlüssel eine der m! möglichen Permutationen von {0, 1,..., m 1} als Sondierungssequenz hat ist 1/m!. Hashfunktionen, die die Uniform-Hashing-Annahme erfüllen, sind schwer zu implementieren. In der Praxis werden heuristische Annäherungen eingesetzt, die weniger Sondierungssequenzen erzeugen können. Hilfshashfunktion h : Die Heuristiken verwenden herkömmliche Hashfunktionen h der Form h : U {0, 1,..., m 1} Für h sei Simple Uniform Hashing angenommen. ADS:IV-97 Datenstrukturen POTTHAST 2018

Open Addressing: Linear Probing Hashfunktion: h(k, i) = (h (k) + i) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,0) h(k,3) ADS:IV-98 Datenstrukturen POTTHAST 2018

Open Addressing: Linear Probing Hashfunktion: h(k, i) = (h (k) + i) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,0) h(k,3) Eigenschaften: h induziert m verschiedene Sondierungssequenzen. Für alle U {0, 1,..., m 1} sind alle m Slot-Indexe in der Bildmenge von h. ADS:IV-99 Datenstrukturen POTTHAST 2018

Open Addressing: Linear Probing Hashfunktion: h(k, i) = (h (k) + i) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,0) h(k,3) Eigenschaften: (Fortsetzung) Primary Clustering (Primäre Gruppenbildung ) Es bilden sich Ketten belegter Slots. Je länger eine Kette, desto wahrscheinlicher wird der nachfolgende Slot belegt. Ketten werden vereinigt, so dass mit steigendem Load Factor die Suchzeit in O(n) ist. Secondary Clustering (Sekundäre Gruppenbildung ) Kollidierende Schlüssel erzeugen dieselbe Sondierungssequenz. ADS:IV-100 Datenstrukturen POTTHAST 2018

Open Addressing: Quadratic Probing Hashfunktion mit Konstanten c 1 und c 2 0: h(k, i) = (h (k) + c 1 i + c 2 i 2 ) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,4) h(k,0) ADS:IV-101 Datenstrukturen POTTHAST 2018

Open Addressing: Quadratic Probing Hashfunktion mit Konstanten c 1 und c 2 0: h(k, i) = (h (k) + c 1 i + c 2 i 2 ) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,4) h(k,0) Eigenschaften: h induziert m verschiedene Sondierungssequenzen. Für m = 2 n und c 1 = c 2 = 1/2 sind alle m Slot-Indexe in der Bildmenge von h. Für Primzahl m > 2, c 1 = c 2 = 1/2, c 1 = c 2 = 1 oder c 1 = 0, c 2 = 1, und α < 0.5 wird immer ein leerer Slot gefunden und keine Slots werden doppelt geprüft. Secondary Clustering ADS:IV-102 Datenstrukturen POTTHAST 2018

Open Addressing: Double Hashing Hashfunktion mit zwei Hilfshashfunktionen h 1 und h 2: h(k, i) = (h 1(k) + i h 2(k)) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,3) h(k,0) ADS:IV-103 Datenstrukturen POTTHAST 2018

Open Addressing: Double Hashing Hashfunktion mit zwei Hilfshashfunktionen h 1 und h 2: h(k, i) = (h 1(k) + i h 2(k)) mod m Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h(k,3) h(k,0) Eigenschaften: Ist h 2(k) teilerfremd zu m sind alle m Slot-Indexe in der Bildmenge von h. Dies ist zum Beispiel gewährleistet, wenn m eine Zweierpotenz ist und h 2 ungerade Zahlen berechnet oder wenn m prim ist und h 2 eine positive Zahl kleiner m berechnet. Das Sprungintervall wird durch h 2 abhängig vom Schlüssel k erzeugt. Unter den vorigen Bedingungen werden m 2 Sondierungssequenzen von h induziert. ADS:IV-104 Datenstrukturen POTTHAST 2018

Open Addressing: Laufzeit Abhängigkeiten: Alle Manipulationsalgorithmen Suchen nach einem Schlüssel k. Die Suchzeit hängt von der Länge der Sondierungssequenz ab. Die Länge der Sondierungssequenz hängt vom Load Factor α = n/m ab. ADS:IV-105 Datenstrukturen POTTHAST 2018

Open Addressing: Laufzeit Abhängigkeiten: Alle Manipulationsalgorithmen Suchen nach einem Schlüssel k. Die Suchzeit hängt von der Länge der Sondierungssequenz ab. Die Länge der Sondierungssequenz hängt vom Load Factor α = n/m ab. Worst Case und Best Case sind analog zum Chaining. Average Case: Entspricht der erwarteten Länge der Sondierungssequenz. Idealisierte Sicht: Uniform Hashing Praktische Sicht: Heuristiken ADS:IV-106 Datenstrukturen POTTHAST 2018

Open Addressing: Laufzeit Erwartete Länge einer Sondierungssequenz: Probing Suche erfolglos Suche erfolgreich ( ) 1 1 1 Uniform Hashing 1 α α ln 1 α Linear Probing Quadratic Probing Double Hashing ( ) 1 1 1 + 2 (1 + α) 2 ( ) 1 1 1 α + ln α 1 α 1 1 α ( 1 1 + 1 ) 2 1 + α ( ) 1 1 + ln α 1 α 2 ( ) 1 1 α ln 1 α ADS:IV-107 Datenstrukturen POTTHAST 2018

Open Addressing: Laufzeit Erwartete Länge einer Sondierungssequenz: #probes 10 Linear Probing Quadratic Probing Double Hashing Erfolglos Erfolgreich 5 α 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ADS:IV-108 Datenstrukturen POTTHAST 2018

Open Addressing: Laufzeit Erwartete Länge einer Sondierungssequenz: Load Suche erfolglos Suche erfolgreich Factor Linear Quadratic Double Linear Quadratic Double α = 0.5 2.5 2.19 2 1.5 1.44 1.39 α = 0.75 8.5 4.64 4 2.5 2.01 1.84 α = 0.9 50.5 11.40 10 5.5 2.85 2.55 α = 0.95 200.5 22.05 20 10.5 3.52 3.15 ADS:IV-109 Datenstrukturen POTTHAST 2018