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

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Suchen in Listen und Hashtabellen

Kap. 4.2: Binäre Suchbäume

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Kapitel 9. Hashverfahren. 9.1 Einführung

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

Algorithmen & Datenstrukturen 1. Klausur

Einführung in die Informatik Hashtables

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

3. Übung Algorithmen I

13. Binäre Suchbäume

Programmiertechnik II

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 5, Donnerstag, 20.

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Datenstrukturen. Mariano Zelke. Sommersemester 2012

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Vorlesung Algorithmische Geometrie. Streckenschnitte. Martin Nöllenburg

! DBMS organisiert die Daten so, dass minimal viele Plattenzugriffe nötig sind.

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Datenstrukturen und Algorithmen

Tutorium Algorithmen & Datenstrukturen

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Ferienakademie 2001: Kryptographie und Sicherheit offener Systeme. Faktorisierung. Stefan Büttcher

Algorithmen und Datenstrukturen Suchbaum

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Programmierkurs Java

Dr. Monika Meiler. Inhalt

Sortierte Folgen 250

Einführung in Computer Microsystems

Ein Turbo-Pascal-Programm zur Umrechnung vom Dezimalsystem in andere Zahlensysteme

KV Software Engineering Übungsaufgaben SS 2005

Software RAID oder LVM auf einem Suse Linux System aufsetzen

Dr. Monika Meiler. Inhalt

4 Greedy-Algorithmen (gierige Algorithmen)

Einführung in die Programmierung

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

HOCHSCHULE KONSTANZ TECHNIK, WIRTSCHAFT UND GESTALTUNG. Das Luzifer-Rätsel. Prof. Dr. Hartmut Plesske Wintersemester 2008/09. von.

Suchen und Sortieren Sortieren. Heaps

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Kapitel 2. Zahlensysteme, Darstellung von Informationen

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Lenstras Algorithmus für Faktorisierung

Kapitel 5: Dynamisches Programmieren Gliederung

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Programmierung und Modellierung

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Software ubiquitärer Systeme

In beiden Fällen auf Datenauthentizität und -integrität extra achten.

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Sortierverfahren für Felder (Listen)

Variablen - %Hashes Was ist ein Hash? 'Assoziative Arrays'

Praktikum Diskrete Optimierung (Teil 11)

Abschnitt: Algorithmendesign und Laufzeitanalyse

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Alignment-Verfahren zum Vergleich biologischer Sequenzen

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

Einführung in die Informatik 1

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Einführung in die Informatik I

VBA-Programmierung: Zusammenfassung

Datenstrukturen in Java

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Modul 122 VBA Scribt.docx

Reaktive Sicherheit. II. Passwörter. Dr. Michael Meier. technische universität dortmund

SOI Die Schweizer Informatikolympiade

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Algorithmentheorie Maximale Flüsse

Zahlensysteme: Oktal- und Hexadezimalsystem

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Teil 2 - Softwaretechnik. Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 2. Übersicht. Softwaretechnik

Über Arrays und verkettete Listen Listen in Delphi

Was bisher geschah Kryptographische Systeme (M, C, K, e, d) Verfahren: symmetrisch klassisch: Verschiebechiffren (Spezialfall Caesar-Code)

Faktorisierung ganzer Zahlen mittels Pollards ρ-methode (1975)

Algorithmen und Programmierung

Prüfung Software Engineering II (IB)

Nachholklausur Informatik II

Definition. Gnutella. Gnutella. Kriterien für P2P-Netzwerke. Gnutella = +

Probabilistische Primzahltests

Suche in Spielbäumen Spielbäume Minimax Algorithmus Alpha-Beta Suche. Suche in Spielbäumen. KI SS2011: Suche in Spielbäumen 1/20

Dateiorganisation und Zugriffsstrukturen

Inf 12 Aufgaben

Lösungsblatt zur Vorlesung. Kryptanalyse WS 2009/2010. Blatt 6 / 23. Dezember 2009 / Abgabe bis spätestens 20. Januar 2010, 10 Uhr (vor der Übung)

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Grundlagen der Programmierung

Computerarithmetik ( )

Aufgaben des MSG-Zirkels 10b Schuljahr 2007/2008

Algorithmen mit Python

8: Zufallsorakel. Wir suchen: Einfache mathematische Abstraktion für Hashfunktionen

Transkript:

Kap. 5 Hashing nach Übungstest Professor Dr. Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 15./16. VO DAP2 SS 2009 16./18. Juni 2009 1

Linux-Kurs 2. Teil Beginn: Di 16.6. und Do 18.6. Zeiten: 14:15 Uhr oder Do 16:15 (2 SWS) Ort: GB V R. 014/015 Themen: Backup & Recovery, Partitionieren, Bootmanager,... Veranstalter: Wilfried Rupflin und Sven Jörges Informationen: http://dokserver.cs.uni-dortmund.de/linux09s/ 2

Motivation Warum soll ich heute hier bleiben? Hashing macht Spaß! Und wenn nicht? Beliebte Klausuraufgaben! 3

Überblick Wahl der Hashfunktion Hashing mit Verkettung Hashing mit offener Adressierung Lineares Sondieren Quadratisches Sondieren Double Hashing inkl. Brent Vergleich der Hash-Verfahren 4

Idee von Hashing Idee: Ermittle die Position eines Elements durch eine arithmetische Berechnung statt durch Schlüsselvergleiche. Hashverfahren unterstützen die Dictionary- Operationen Suchen, Einfügen und Entfernen auf einer Menge von Elementen. k U 1 k k 2 k3 3 k k5 k 5 4 0 1 2 3 4 5 6 7 8 9 10 11

Idee von Hashing Sei U das Universum aus dem die Schlüssel kommen können, sei m die Tabellengröße, n die Anzahl der einzufügenden Schlüssel. Wir wählen eine Hashfunktion h: U {0,,m-1}. Die Schlüssel werden in Hashtabelle T[h(i)] gespeichert. U k 3 k 1 k 4 k 2 k5 T[j]: k 1 k 3 k 2 k 4 k 5 0 1 2 3 4 m-3 m-1

Idee von Hashing Hashtabelle wird als ein Array T[0],,T[m-1] der Größe m realisiert. Sie speichert die Einträge mit Hashadressen 0,,m-1. Probleme: Was sind gute Hashfunktionen? Kollisionsbehandlung k U 1 k k 2 3 k k5 4 T[j]: k 1 k 3 k 2 k 4 k 5 0 1 2 3 4 m-3 m-1

5.1 Zur Wahl der Hashfunktion Ziel: Hashadressen sollten möglichst gleich verteilt in {0,,m-1} sein. Hashfunktionen sollten Häufungen fast gleicher Schlüssel möglichst gleichmäßig auf den Adressbereich streuen. Generalannahme: Schlüssel sind nicht-negative ganze Zahlen. Lösung für character strings: deren ASCII-Code ist Nummer in [0,,127], z.b. p 112, t 116 pt 112 128+116=14452 Allgemein: für String (s 1,,s l ): k= 128 l-i ord(s i ) 1 i l

5.1.1 Divisions-Rest Methode Die Hashfunktion der Divisions-Rest Methode ist gegeben durch: h(k) = k mod m Eigenschaften: sehr schnelle Berechnung der Hashfunktion gute Wahl von m (Tabellengröße) ist hier sehr wichtig! Vermeide z.b. m=2 i : ignoriert alle bis auf letzten Binärziffern m=10 i : analog bei Dezimalzahlen m=r i : analog zu r-adischen Zahlen m=r i j für kleines j: Problem bei Vertauschung, denn Diff=a 128+b-(b 128+a) =(a-b) (127 j)-(a-b)

5.1.1 Divisions-Rest Methode Z.B.: m=2 Die Hashfunktion 8-1=127: der Divisions-Rest Methode ist pt = (112 128+116) mod 127 = 14452 mod 127 = 101 tp gegeben = (116 128+112) durch: mod h(k) 127 = k = mod 14960 m mod 127 = 101 Eigenschaften: sehr schnelle Berechnung der Hashfunktion gute Wahl von m (Tabellengröße) ist hier sehr wichtig! Vermeide z.b. m=2 i : ignoriert alle bis auf letzten Binärziffern m=10 i : analog bei Dezimalzahlen m=r i : analog zu r-adischen Zahlen m=r i j für kleines j: Problem bei Vertauschung, denn Diff=a 128+b-(b 128+a) =(a-b) (127 j)-(a-b)

Gute Wahl von m Primzahl, die kein r i j teilt für kleines j und weit weg von einer Zweierpotenz ist. Beispiel: Hashtabelle für ca. 700 Einträge für character strings (interpretiert als 28-adische Zahlen). Gute Wahl z.b. m=701, da 2 9 =512 und 2 10 =1024. 11

5.1.2 Multiplikationsmethode Die Hashfunktion der Multiplikationsmethode ist gegeben durch: h(k) = m (k A mod 1) = m(k A - k A ) mit 0<A<1. Term (k A - k A ) heißt der gebrochene Teil von ka. Eigenschaften: Wahl von m ist hierbei unkritisch Gleichmäßige Verteilung für U={1,2,,n} bei guter Wahl von A. 12

Gute Wahl für A Irrationale Zahlen sind eine gute Wahl, denn: Sei ξ eine irrationale Zahl. Platziert man die Punkte ξ - ξ, 2 ξ - 2ξ,,n ξ - nξ in das Intervall [0,1), dann haben die n+1 Intervallteile höchstens drei verschiedene Längen. Außerdem fällt der nächste Punkt (n+1) ξ - (n+1) ξ in eines der größeren Intervallteile. Beweis: Vera Turan Sós 1957 Beste Wahl für A nach Knuth: Der Goldene Schnitt 13

Der Goldene Schnitt Sei A=Φ -1 =2/(1+ 5)=( 5-1)/2=0,6180339887 Φ -1 ist bekannt als der goldene Schnitt. Er ergibt sich durch die Zerlegung einer Strecke a in zwei positive Summanden x und a-x, so dass x geometrisches Mittel von a und a-x ist, d.h. x 2 =a(a-x). Es gilt: x/a=(a-x)/x. ½ in Euklid s Elementen & 0 x 1-x Kepler: Göttliche Teilung 0 1 in Antiker Architektur Φ -1

Multiplikationsmethode Beispiel: Dezimalrechnung, k=123456, m=10000, A=Φ -1 : h(k) = 10000 (123456 0,61803 mod 1) = = 10000 (76300,0041151 mod 1) = = 10000 0,0041151 ) = = 41,151 = 41 Diskussion: Gute Wahl für m wäre hier m=2 i. Dann kann h(k) effizient berechnet werden (eine einfache Multiplikation und ein bis zwei Shifts). Empirische Untersuchungen zeigen: Divisions- Rest-Methode ist besser.

5.2 Hashing mit Verkettung Idee: Jedes Element der Hashtabelle ist ein Zeiger auf eine einfach verkettete lineare Liste: (Hashing mit Verkettung) k 1 U k 1 k k 2 3 k k5 4 0 1 2 3 4 5 6 7 8 9 10 11 16

5.2 Hashing mit Verkettung Idee: Jedes Element der Hashtabelle ist ein Zeiger auf eine einfach verkettete lineare Liste: (Hashing mit Verkettung) U k 5 k 3 k 1 k 4 k 2 k5 0 1 2 3 4 5 6 7 8 9 10 11 k 1 k 3 k 2 k 4 17

Datenstruktur Hashtabelle als Array T[ ] mit Zeigern auf eine einfach verkettete Liste ohne Dummy-Elemente: T[i].key: Schlüssel T[i].info: Datenfeld T[i].next: Zeiger auf das nachfolgende Listenelement hash(k): berechnet Hashfunktion für Schlüssel k 18

Realisierung Hashing mit Verkettung: INIT+SEARCH INIT(T) (1) for i:=0,,m-1 do T[i]:=nil SEARCH(k,T): (1) p:=t[hash(k)] (2) while p nil AND p.key k do (3) p:=p.next (4) return p 19

Realisierung Hashing mit Verkettung: INSERT T[pos] a n a n-1 a 1 p k INSERT(p,T): (1) var int pos nil (2) pos:= hash(p.key) (3) p.next:=t[pos] (4) T[pos]:=p 20

Realisierung: DELETE DELETE(k,T): // Schlüssel k ist in T enthalten (1) var int pos (2) var SListElement p,q (3) pos:= hash(k) (4) q:=nil, p:=t[pos] (5) while p.key k do { (6) q:=p (7) p:=p.next (8) } (9) if q==nil then T[pos]:=T[pos].next // erstes El entfernt (10) else q.next:=p.next 21

Analyse der Suchzeit Def.: Sei α:=n/m der Auslastungsfaktor (Belegungsfaktor): durchschnittliche Anzahl von Elementen in den verketteten Listen. Worst Case: Alle Schlüssel erhalten den gleichen Hashwert: C worst (n)=θ(n) 22

Average-Case Analyse der Suchzeit Annahmen: (1) Ein Element wird auf jeden der m Plätze mit gleicher Wahrscheinlichkeit 1/m abgebildet, unabhängig von den anderen Elementen. (2) Jeder der n gespeicherten Schlüssel ist mit gleicher Wahrscheinlichkeit der Gesuchte. (3) INSERT fügt neue Elemente am Ende der Liste ein (in Wirklichkeit: am Anfang: aber egal für durchschnittliche Suchzeit) (4) Berechnung der Hashfunktion h(k) benötigt konstante Zeit. 23

Average-Case Analyse der Suchzeit Erfolglose Suche: offensichtlich C avg (n)=α=n/m Wenn n=o(m) konstante Suchzeit! 24

Average-Case Analyse der Suchzeit Erfolgreiche Suche: Gemäß Ann. (3) wird 1 Schritt mehr gemacht als beim Einfügen des gesuchten Elements. Durchschnittliche Listenlänge beim Einfügen des i-ten Elements ist (i-1) / m. C avg (n)=θ(1+α) Wenn also n=o(m) konstante Suchzeit

Average-Case Analyse Operation DELETE: identisch mit Suchzeit! Operation INSERT: geht immer in O(1), da wir annehmen, dass die Hashfunktion in konstanter Zeit berechnet werden kann. 26

Diskussion Belegungsfaktor von mehr als 1 ist möglich Echte Entfernungen von Einträgen sind möglich eignet sich für Externspeichereinsatz (Hashtabelle im Internspeicher, Listen extern) Zu den Nutzdaten kommt der Speicherplatzbedarf für die Zeiger Der Speicherplatz der Tabelle wird nicht genutzt; dies ist umso schlimmer, wenn in der Tabelle viele Plätze leer bleiben. 27

5.3 Hashing mit offener Adressierung Idee: Jedes Element wird in der Hashtabelle (ohne Überläufer) gespeichert. Wenn ein Platz belegt ist, werden gemäß einer Sondierungsreihenfolge weitere Plätze ausprobiert. k 1 U k 1 k k 2 3 k k5 4 0 1 2 3 4 5 6 7 8 9 10 11 28

5.3 Hashing mit offener Adressierung Idee: Jedes Element wird in der Hashtabelle (ohne Überläufer) gespeichert. Wenn ein Platz belegt ist, werden gemäß einer Sondierungsreihenfolge weitere Plätze ausprobiert. U k 5 k 3 k 1 k 4 k 2 k5 k 1 k 3 k 2 k 4 0 1 2 3 4 5 6 7 8 9 10 11 29

Hashing mit offener Adressierung Erweiterte Hashfunktion: h: U x {0,1, m-1} {0,1,,m-1} Die Sondierungsreihenfolge ergibt sich dann durch: <h(k,0), h(k,1),,h(k,m-1)> Diese sollte idealerweise eine Permutation von <0,1,,m-1> sein. Annahme: Die Hashtabelle enthält immer wenigstens einen unbelegten Platz. Problem: Entfernen von Elementen? 30

Eigenschaften (1) Stößt man bei der Suche auf einen unbelegten Platz, so kann die Suche erfolglos abgebrochen werden. (2) Wegen (1) wird nicht wirklich entfernt, sondern nur als entfernt markiert. Beim Einfügen wird ein solcher Platz als frei, beim Suchen als wieder frei betrachtet. (3) Nachteil: wegen (2) ist die Suchzeit nicht mehr proportional zu Θ(1+α), deshalb sollte man bei vielen Entfernungen die Methode der Verkettung der Überläufer vorziehen. 31

Sondierungsreihenfolgen Ideal wäre das Uniform Hashing : Jeder Schlüssel erhält mit gleicher Wahrscheinlichkeit eine bestimmte der m! Permutationen von {0,1,,m-1} als Sondierungsreihenfolge zugeordnet. In der Praxis versucht man möglichst nahe an Uniform Hashing zu kommen. 32

5.3.1 Lineares Sondieren Gegeben ist eine normale Hashfunktion h : U {0,1,,m-1} Wir definieren für i=0,1,,m-1: h(k,i)=(h (k)+i) mod m Beispiel: m=8, h (k)=k mod m k 10 19 31 22 14 16 h (k) 2 3 7 6 6 0 10 19 22 31 14 0 1 2 3 4 5 6 7

5.3.1 Lineares Sondieren h(14,1)=(h (k)+1) Gegeben ist eine mod normale 8 = 6+1 Hashfunktion mod 8 = 7 h(14,2)=(h (14)+2) h : U {0,1,,m-1} mod 8 = 6+2 mod 8 = 0 Durchschnittliche Wir definieren für Zeit i=0,1,,m-1: für erfolgreiche Suche: h(k,i)=(h (k)+i) mod m (1+1+1+1+3+2) / 6 = 9/6 = 1,5 Beispiel: m=8, h (k)=k mod m k 10 19 31 22 14 16 h (k) 2 3 7 6 6 0 14 16 10 19 22 31 0 1 2 3 4 5 6 7

Analyseergebnisse Für die Anzahl der Sondierungen im Durchschnitt gilt für 0<α=n/m<1 (ohne Beweis): Erfolglose Suche C avg (α) ½(1+1/(1-α) 2 ) Erfolgreiche Suche C avg (α) ½(1+1/(1-α)) 35

Diskussion Lange belegte Teilstücke tendieren dazu, schneller zu wachsen als kurze. Dieser unangenehme Effekt wird Primäre Häufungen genannt. Es gibt nur m verschiedene Sondierungsfolgen, da die erste Position die gesamte Sequenz festlegt: h (k), h (k)+1,,m-1,0,1,,h (k)-1 36

5.3.2 Quadratisches Sondieren Gegeben ist eine normale Hashfunktion h : U {0,1,,m-1} Wir definieren für i=0,1,,m-1: h(k,i) = (h (k)+c 1 i+c 2 i 2 ) mod m Beispiel: m=8, h (k)=k mod m, c 1 =c 2 =1/2 k 10 19 31 22 14 16 h (k) 2 3 7 6 6 0 10 19 22 31 14 0 1 2 3 4 5 6 7

5.3.2 Quadratisches Sondieren h(k,1)=6+1/2(1+1 Gegeben ist eine 2 ) mod 8 = 7 normale Hashfunktion h : U h(k,2)=6+1/2(2+2 {0,1,,m-1} 2 ) mod 8 = 9 mod 8 = 1 Wir Durchschnittliche definieren für erfolgreiche i=0,1,,m-1: Suchzeit h(k,i) = (h (k)+c 1 i+c 2 i 2 ) mod m (1+1+1+1+3+1) / 6 = 8/6 = 1,33 Beispiel: m=8, h (k)=k mod m, c 1 =c 2 =1/2 k 10 19 31 22 14 16 h (k) 2 3 7 6 6 0 16 14 10 19 22 31 0 1 2 3 4 5 6 7

Diskussion Es gibt nur m verschiedene Sondierungsfolgen, da die erste Position die gesamte Sequenz festlegt. Dieser Effekt wird Sekundäre Häufungen genannt. 39

Analyseergebnisse Für die Anzahl der Sondierungen im Durchschnitt gilt für 0<α=n/m<1 (ohne Beweis): Erfolglose Suche C avg (α) 1/(1- α) α + ln(1/(1-α)) Erfolgreiche Suche C avg (α) 1+ln(1/(1-α))- α/2 Uniform Hashing: Erfolglose Suche C avg (α) 1/(1- α) Erfolgreiche Suche C avg (α) 1/ α ln(1/(1-α)) 40

5.3.3 Double Hashing Die Sondierungsreihenfolge hängt von einer zweiten Hashfunktion ab, die unabhängig von der ersten Hashfunktion ist. Gegeben sind zwei Hashfunktionen h 1,h 2 : U {0,1,,m-1}. Wir definieren für i=0,1,,m-1: h(k,i) = (h 1 (k)+ i h 2 (k)) mod m 41

Bedingungen an h 2 Für alle Schlüssel k muss h 2 (k) relativ prim zu m sein: ggt(h 2 (k),m) = 1 Denn sonst wird die Tabelle nicht vollständig durchsucht: Für ggt(h 2 (k),m) = d > 1, so wird nur 1/d-tel durchsucht. Achtung: Natürlich muss h 2 (k) 0 sein 42

Zwei Vorschläge m=2 P, P>1, h 2 (k) immer ungerade m Primzahl, 0<h 2 (k)<m, z.b. h 1 (k)=k mod m, h 2 (k)=1+(k mod m ) mit m =m-1 oder m =m-2 43

Beispiel für Double Hashing m=7, h 1 (k)=k mod 7, h 2 (k)=1+(k mod 5) h(k,i) = (h 1 (k) + i h 2 (k)) mod m k 10 19 31 22 14 16 k h 1 (k) 10 3 19 5 31 3 22 1 14 0 16 2 h 2 (k) 1 5 2 3 5 2 31 10 19 0 1 2 3 4 5 6

Beispiel für Double Hashing Durchschnittliche m=7, h 1 (k)=k mod Suchzeit 7, h 2 (k)=1+(k hier: mod 5) (1+1+3+1+5+1)/6=12/6=2 h(k,i) = (h 1 (k) + i h 2 (k)) mod (untypisch) m h 2 (31)=1+(31 mod 5)=2; h(31,1)=3+2 mod 7=5 k 10 19 31 22 14 16 k h 1 (k) 10 3 19 5 31 3 22 1 14 0 16 2 h 2 (k) 1 5 2 3 5 2 31 22 16 10 19 14 0 1 2 3 4 5 6

Diskussion Bei Double Hashing ergeben sich Θ(m 2 ) verschiedene Sondierungsreihenfolgen Es ist eine gute Approximation an uniformes Hashing Analyse zeigt, dass erfolgreiche und erfolglose Suche ungefähr genauso hoch sind wie bei uniform Hashing Double Hashing ist sehr gut in der Praxis! und läßt sich sehr leicht implementieren 46

Verbesserung nach Brent [1973] Wenn häufiger gesucht als eingefügt wird, ist es von Vorteil, die Schlüssel beim Einfügen so zu reorganisieren, dass die Suchzeit verkürzt wird. Idee: Wenn beim Einfügen eines Schlüssels ein sondierter Platz j belegt ist mit k =T[j].key, dann setze: (1) j 1 =j+h 2 (k) mod m, j 2 =j+h 2 (k ) mod m (2) Falls Platz j 1 frei oder Platz j 2 belegt ist, dann (3) fahre fort mit Double Hashing (mit k). (4) Sonst: trage k in T[j 2 ] ein und k in T[j] 47

Beispiel mit Brent m=7, h 1 (k)=k mod 7, h 2 (k)=1+(k mod 5) h(k,i) = (h 1 (k) + i h 2 (k)) mod m k 10 19 31 22 14 16 k h 1 (k) 10 3 19 5 31 3 22 1 14 0 16 2 h 2 (k) 1 5 2 3 5 2 31 10 19 0 1 2 3 4 5 6

Beispiel mit Brent Durchschnittliche m=7, h 1 (k)=k mod Suchzeit 7, h 2 (k)=1+(k hier: mod 5) (2+1+1+1+1+1)/6=7/6=1,17 h(k,i) = (h 1 (k) + i h 2 (k)) mod m j=3: j 2 =j+h 2 (10)=4 k 10 19 31 22 14 16 k h 1 (k) 10 3 19 5 31 3 22 1 14 0 16 2 h 2 (k) 1 5 2 3 5 2 14 22 16 31 10 19 0 1 2 3 4 5 6

Analyseergebnisse Für die Anzahl der Sondierungen im Durchschnitt gilt für 0<α=n/m<1 (ohne Beweis): Erfolglose Suche C avg (α) 1/(1- α) (wie uniform) Erfolgreiche Suche C avg (α) < 2.5 (unabhängig von α für α 1) Double Hashing mit Brent ist also sehr gut! 50

5.4 Übersicht über die Güte Anzahl der Vergleiche der Kollisionsstrategien α Verkettung Hashing mit offener Adressierung erfolg reich erfolg los lineares S. quadr. Sond. uniformes S. e.reich e.los e.reich e.los e.reich e.los 0.5 1.25 0.50 1.5 2.5 1.44 2.19 1.39 2.00 0.9 1.45 0.90 5.5 50.5 2.85 11.4 2.56 10 0.95 1.47 0.95 10.5 200 3.52 22.0 3.15 20 1.0 1.50 1.00 ----- ----- ----- ----- ----- ----- Double Hashing mit Brent: e.reich: <2.5 e.los: =uniformes S.

Bemerkungen Hashing mit Verkettung hat deutlich weniger Schritte; jedoch Nachteil: hoher Speicherbedarf und evtl. Suchzeit trotzdem langsamer, wegen Zeigerverfolgung quadratisches Hashing ist nahe an uniform Hashing lineare Sondierung fällt deutlich ab nicht empfehlenswert Belegungsfaktor α sollte nicht höher als 0.9 sein, besser:0.7 oder 0.8 ENDE Hashing 52

Beispiel zum Ausschneiden und Üben: m=8, h(k)=k mod m k 10 19 31 22 14 16 h (k) 2 3 7 6 6 0 0 1 2 3 4 5 6 7 10 19 14 22 31 16 53