Algorithmen und Datenstrukturen

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Hash-Tabellen und -Funktionen Hash-Tabellen in Java
Eine dynamische Menge, die diese Operationen unterstützt,
Eine dynamische Menge, die diese Operationen unterstützt,
Vorlesung Programmieren II
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Algorithmen und Datenstrukturen
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
Kapitel 6: Klassifizierung von Sortiertechniken
Kapitel 6. Suchverfahren
<d,a,s, ,i,s,t, ,e,i,n,e, ,L,i,s,t,e>
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Sortieren mit Binären Bäumen
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Funktionenklassen zur Messung der Komplexität
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Prof. Dr. S. Albers Prof. Dr. Th. Ottmann
Algorithmen und Datenstrukturen
Halbzeit: Kurze Wiederholung
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Sortieren vorsortierter Daten
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 Hashverfahren: Allgemeiner Rahmen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 9 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Anwendungen von Stapeln und Schlangen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (11-1 –Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27-Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (15 Hashverfahren: Verkettung der Überläufer) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 – Dynamische Tabellen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 13 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 12 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 16 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUTE University of Paderborn Algorithms and Complexity Algorithmen und Komplexität Teil 1: Grundlegende.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Kapitel 2: Datenstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Einführung in die Programmierung
Effiziente Algorithmen
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Algorithmen und Datenstrukturen Übungsmodul 11
Programmiersprachen II Fortsetzung Datenstrukturen Hashing Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
 Präsentation transkript:

Algorithmen und Datenstrukturen Hashing Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 14 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät für Angewandte Wissenschaften Albert-Ludwigs-Universität Freiburg

Das Wörterbuch-Problem (1) Das Wörterbuch-Problem (WBP) kann wie folgt beschrieben werden: Gegeben: Menge von Objekten (Daten) die über einen eindeutigen Schlüssel (ganze Zahl, String, . . . ) identifizierbar sind. Gesucht: Struktur zu Speicherung der Objektmenge, so dass mindestens die folgenden Operationen (Methoden) effizient ausführbar sind: • Suchen (Wiederfinden, Zugreifen) • Einfügen • Entfernen Bedingungen, die die Wahl einer Lösung des WBP beeinflussen: Ort, wo die Daten gespeichert sind (Hauptspeicher, Platte, Band, CD,…) Art- und Häufigkeit der auszuführenden Operationen Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Das Wörterbuch-Problem (2) Häufigkeit der Operationen: – überwiegend Einfügen & Löschen (dynamisches Verhalten) – überwiegend Suchen (statisches Verhalten) – annähernd Gleichverteilung – nichts bekannt Weitere zu implementierende Operationen: – Durchlaufen der Menge in bestimmter Reihenfolge (etwa nach Schlüsselwert aufsteigend) – Mengen-Operationen: Vereinigung, Durchschnitt, Differenz, . . . – Aufspalten – Konstruieren Kostenmaße zur Beurteilung der Lösung: average, worst, amortisierter worst case Ausführungsreihenfolge der Operationen: – sequentiell – nebenläufig Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Das Wörterbuch-Problem (3) Verschiedene Ansätze zur Lösung des WBP: Aufteilung des gesamten Schlüssel-Universums: Hashing Strukturierung der aktuellen Schlüsselmange: Listen, Bäume, Graphen, . . . Hashing (engl.: to hash=zerhacken) beschreibt eine spezielle Art der Speicherung der Elemente einer Menge durch Zerlegung des Schlüssel-Universums. Die Position des Daten-Elements im Speicher ergibt sich (zunächst) durch Berechnung direkt aus dem Schlüssel. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashverfahren Annahme: Daten sind über einen ganzzahligen Schlüssel eindeutig identifizierbar. Suchen, Einfügen, Entfernen von Datensätzen (Schlüsseln) soll unterstützt werden. Ort des Datensatzes d: Berechnung aus dem Schlüssel s von d  keine Vergleiche  konstante Zeit Datenstruktur: lineares Feld (Array) der Größe m Hashtabelle Schlüssel s 0 1 2 i m-2 m-1 …………. …………. Der Speicher wird zerlegt in m gleich große Behälter (Buckets). Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Implementierung in Java class TableEntry { private Object key,value; } abstract class HashTable { private TableEntry[] tableEntry; private int capacity; //Konstruktor HashTable (int capacity) { this.capacity = capacity; tableEntry = new TableEntry [capacity]; for (int i = 0; i <= capacity-1; i++) tableEntry[i] = null; } // die Hashfunktion protected abstract int h (Object key); /* fuege Element mit Schluessel key und Wert value ein (falls nicht vorhanden) */ public abstract void insert (Object key Object value); // entferne Element mit Schluessel key (falls vorhanden) public abstract void delete (Object key); // suche Element mit Schluessel key public abstract Object search (Object key); } // class hashTable Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashverfahren - Probleme Größe der Hashtabelle Nur eine kleine Teilmenge S aller möglichen Schlüssel (des Universums) U kommt vor Berechnung der Adresse eines Datensätzen - Schlüssel sind keine ganzen Zahlen - Index hängt von der Größe der Hashtabelle ab In Java: public class Object { ... public int hashCode() {…} ... } Das Universum U sollte möglichst gleichmäßig auf die Zahlen -231,…,231-1 verteilt werden Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashfunktion (1) Schlüsselmenge S Hashfunktion h Univer- sum U aller mög- lichen Schlüs- sel 0,…,m-1 Hashtabelle T h(s) = Hashadresse h(s) = h(s´)  s und s´ sind Synonyme bzgl. h Adresskollision Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashfunktion (2) Definition: Sei U ein Universum möglicher Schlüssel und {B0, . . . ,Bm-1} eine Menge von m Behältern zum Speichern von Elementen aus U: Dann ist eine Hash-Funktion eine totale Abbildung h : U  {0, . . . ,m - 1} , die jedem Schlüssel s aus U eine Nummer h(s) (und dem entsprechenden Element den Behälter Bh(s) ) zuordnet. Die Behälter-Nummern nennt man auch Hash-Adressen, die Gesamtmenge der Behälter Hash-Tabelle. B0 B1 … … Bm-1 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Adresskollisionen Eine Hashfunktion h berechnet für jeden Schlüssel s die Nummer des Buckets. Ideal wäre eine eindeutige Speicher-Zuordnung eines Datums mit Schlüssel s zum Bucket mit Nummer h(s): Einfügen und Suchen könnten dann in konstanter Zeit (O(1)) erfolgen. Tatsächlich treten natürlich Kollisionen auf: Mehrere Elemente können auf die gleiche Hash-Adresse abgebildet werden. Kollisionen müssen (auf eine von verschiedenen Arten) behandelt werden. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashverfahren Beispiel für U: alle Namen in Java mit Länge ≤ 40  |U | = 6240 Falls |U | > m : Adresskollisionen unvermeidlich Hashverfahren: 1. Wahl einer möglichst „guten“ Hash-Funktion 2. Strategie zur Auflösung von Adresskollisionen Belegungsfaktor  : Annahme: Tabellengröße m ist fest Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Anforderungen an gute Hashfunktionen Eine Kollision tritt dann auf, wenn bei Einfügen eines Elementes mit Schlüssel s der Bucket Bh(s) schon belegt ist. Eine Hash-Funktion h heißt perfekt für eine Menge von Schlüsseln S, falls keine Kollisionen für S auftreten. Ist h perfekt und |S| = n, dann gilt: n ≤ m. Der Belegungsfaktor (BF) der Hash-Tabelle ist n/m ≤ 1. Eine Hash-Funktion ist gut gewählt, wenn – der Belegungsfaktor möglichst hoch ist, – für viele Schlüssel-Mengen die # der Kollisionen möglichst klein ist, – sie effizient zu berechnen ist. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Beispiel einer Hashfunktion Beispiel: Hash-Funktion für Strings public static int h (String s){ int k = 0, m = 13; for (int i=0; i < s.length(); i++) k += (int)s.charAt (i); return ( k%m ); } Folgende Hash-Adressen werden generiert für m = 13. Schlüssel s h(s) Test 0 Hallo 2 SE 9 Algo 10 h wird perfekter, je größer m gewählt wird. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Kollisionswahrscheinlichkeit (1) Zur Wahl der Hash-Funktion Die Anforderungen hoher Belegungsfaktor und Kollisionsfreiheit stehen in Konflikt zueinander. Es ist ein geeigneter Kompromiss zu finden. Für die Schlüssel-Menge S mit |S| = n und Behälter B0, . . . , Bm-1 gilt: – für n > m sind Konflikte unausweichlich – für n < m gibt es eine (Rest-) Wahrscheinlichkeit PK(n,m) für das Auftreten mindestens einer Kollision. Wie findet man Abschätzung für PK(n,m)? Für beliebigen Schlüssel s ist die W’keit dafür, dass h(s) = j mit j  {0, . . . ,m - 1}: PK [h(s) = j ] = 1/m, falls Gleichverteilung gilt. Es ist PK(n,m) = 1 - P¬K(n,m), wenn P¬K(n,m) die W’keit dafür ist, dass es beim Speichern von n Elementen in m Behälter zu keinen Kollisionen kommt. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Kollisionswahrscheinlichkeit (2) Zur Wahrscheinlichkeit von Kollisionen Werden n Schlüssel nacheinander auf die Behälter B0, . . . , Bm-1 verteilt (bei Gleichverteilung), gilt jedes mal P [h(s) = j ] = 1/m. Die W’keit P(i) für keine Kollision im Schritt i ist P(i) = (m - (i - 1))/m Damit ist Für m = 365 etwa ist P(23) > 50% und P(50)  97% (Geburtstagsparadoxon) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Gebräuchliche Hashfunktionen In der Praxis verwendete Hash-Funktionen: Siehe: D.E. Knuth: The Art of Computer Programming Für U = integer wird die Divisions-Rest-Methode verwandt: h(s) = (a × s) mod m (a  0, a  m, m Primzahl) Für Zeichenreihen der Form s = s0s1 . . . sk-1 nimmt man etwa: etwa mit B = 131 und w = Wortbreite des Rechners (w = 32 oder w = 64 ist üblich). Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Einfache Hashfunktion Wahl der Hash-Funktion - leichte und schnelle Berechenbarkeit - gleichmäßige Verteilung der Daten (Beispiel: Compiler) (Einfache) Divisions-Rest-Methode h(k) = k mod m Wahl von m? Beispiele: a) m gerade  h(k) gerade  k gerade Problematisch, wenn letztes Bit Sachverhalt ausdrückt (z.B. 0 = weiblich, 1 = männlich) b) m = 2p liefert p niedrigsten Dualziffern von k Regel: Wähle m prim, wobei m keine Zahl ri +- j teilt, wobei i und j kleine, nichtnegative Zahlen und r Radix der Darstellung sind. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Multiplikative Methode Wähle eine irrationale Zahl  Berechne h(k) = [m (k mod 1) ] Berechnung von h(k) : Wahl von m unkritisch, wähle m = 2p k 0, r0 r1 p Bits = h(k) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Universelles Hashing Idee : Wähle Hashfunktion h zufällig aus einer sorgfältig definierten endlichen Menge H von Hashfunktionen, und zwar so dass für eine zufällig gewählte Funktion h  H gilt: Die Wahrscheinlichkeit dafür, dass h für zwei beliebige Elemente x und y aus dem Universum U eine Adresskollision verursacht, ist 1/m, m = Größe der Hashtabelle. Beispiel für eine universelle Klasse von Hashfunktionen: |U| = p mit Primzahl p und |U| = {0,…,p-1} Seien a  {1,…,p-1} und b  {0,…,p-1} und ha,b : U  {0,…,m-1} wie folgt definiert ha,b = ((ax+b)mod p) mod m Folgerung: Die Menge H = {ha,b | 1 ≤ a ≤ p,0 ≤ b ≤ p} ist eine universelle Klasse von Hashfunktionen. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Möglichkeiten der Kollisionsbehandlung Die Behandlung von Kollisionen erfolgt bei verschiedenen Verfahren unterschiedlich. Ein Datensatz mit Schlüssel s ist ein Überläufer, wenn der Behälter h(s) schon durch einen anderen Satz belegt ist. Wie kann mit Überläufern verfahren werden? 1. Behälter werden durch verkettete Listen realisiert. Überläufer werden in diesen Listen abgespeichert. Chaining (Hashing mit Verkettung der Überläufer) 2. Überläufer werden in noch freien anderen Behältern abgespeichert. Diese werden beim Speichern und Suchen durch sogenanntes Sondieren gefunden. Open Addressing (Offene Hashverfahren) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verkettung der Überläufer (1) Die Hash-Tabelle ist ein Array (Länge m) von Listen. Jeder Behälter wird durch eine Liste realisiert. class hashTable { Liste [] ht; // ein Listen-Array hashTable (int m){ // Konstruktor ht = new Liste[m]; for (int i = 0; i < m; i++) ht[i] = new Liste(); // Listen-Erzeugung } ... } Zwei verschiedene Möglichkeiten der Listen-Anlage: 1. Hash-Tabelle enthält nur Listen-Köpfe, Datensätze sind in Listen: Direkte Verkettung 2. Hash-Tabelle enthält pro Behälter maximal einen Datensatz sowie einen Listen-Kopf. Überläufer kommen in die Liste: Separate Verkettung Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Hashing mit Verkettung der Überläufer Schlüssel werden in Überlauflisten gespeichert h(k) = k mod 7 0 1 2 3 4 5 6 Haschtabelle T Zeiger 53 12 15 2 43 5 Überläufer 19 Diese Art der Verkettung wird auch als direkte Verkettung bezeichnet. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verkettung der Überläufer Suchen nach Schlüssel k - Berechne h(k) und Überlaufliste T[h(k)] - Suche nach k in der Überlaufliste Einfügen eines Schlüssels k - Suchen nach k (erfolglos) - Einfügen in die Überlaufliste Entfernen eines Schlüssels k - Suchen nach k (erfolgreich) - Entfernen aus Überlaufliste  Reine Listenoperationen Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Analyse der direkten Verkettung Uniform-Hashing Annahme: alle Hashadressen werden mit gleicher Wahrscheinlichkeit gewählt, d.h.: Pr(h(ki) = j) = 1/m unabhängig von Operation zu Operation Mittlere Kettenlänge bei n Einträgen: n/m =  Definition C´n = Erwartungswert für die Anzahl betrachteter Einträge bei erfolgloser Suche Cn = Erwartungswert für die Anzahl betrachteter Einträge bei erfolgreicher Suche Analyse Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verkettung der Überläufer Vorteile: + Cn und C´n niedrig +  > 1 möglich + echte Entfernungen + für Sekundärspeicher geeignet Effizienz der Suche Cn (erfolgreich) C´n (erfolglos) 0.50 1.250 0.50 0.90 1.450 0.90 0.95 1.457 0.95 1.00 1.500 1.00 2.00 2.000 2.00 3.00 2.500 3.00 Nachteile - Zusätzlicher Speicherplatz für Zeiger - Überläufer außerhalb der Hashtabelle Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Analyse Hashing mit Verkettung worst case: h(s) liefert immer den gleichen Wert, alle Datensätze sind in einer Liste. Verhalten wie bei Linearer Liste. average case: – Erfolgreiche Suche & Entfernen: Aufwand in Datenzugriffen  1 + 0.5 × BF – Erfolglose Suche & Einfügen: Aufwand  BF Das gilt für direkte Verkettung, bei separater Verkettung ist der Aufwand jeweils etwas höher. best case: Die Suche hat sofort Erfolg. Aufwand  O(1). Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Offene Hashverfahren Idee: Unterbringung der Überläufer an freien (“offenen”) Plätzen in Hashtabelle Falls T[h(k)] belegt, suche anderen Platz für k nach fester Regel Beispiel: Betrachte Eintrag mit nächst kleinerem Index: (h(k) - 1) mod m Allgemeiner: Betrachte die Folge (h(k) - j) mod m j = 0,…,m-1 0 1 h(k) m-2 m-1 … ..... .…. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Sondierungsfolgen Noch allgemeiner: Betrachte Sondierungsfolge (h(k) – s(j,k)) mod m j = 0,...,m-1, für eine gegebene Funktion s(j,k) Beispiele für die Funktion s(j,k) = j (lineares Sondieren) s(j,k) = (-1)j * j/22 (quadratisches Sondieren) s(j,k) = j * h´(k) (Double Hashing) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Sondierungsfolgen Eigenschaften von s(j,k) Folge (h(k) – s(0,k)) mod m, (h(k) – s(1,k)) mod m, (h(k) – s(m-2,k)) mod m, (h(k) – s(m-1,k)) mod m sollte eine Permutation von 0,...,m-1 liefern. Beispiel: Quadratisches Sondieren Kritisch: Entfernen von Sätzen  als entfernt markieren (Einfügen von 4, 18, 25, Löschen 4, Suche 18, 25) 0 1 2 3 4 5 6 h(11) = 4 s(j,k) = -1,1,-4,4,-9,9 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Offene Hashverfahren class OpenHashTable extends HashTable { // in HashTable: TableEntry [] T; private int [] tag; static final int EMPTY = 0; // Frei static final int OCCUPIED = 1; // Belegt static final int DELETED = 2; // Entfernt // Konstruktor OpenHashTable (int capacity) { super(capacity); tag = new int [capacity]; for (int i = 0; i < capacity; i++) { tag[i] = EMPTY; } } // Die Hashfunktion protected int h (Object key) {...} // Funktion s für Sondierungsfolge protected int s (int j, Object key) { // quadratisches Sondieren if (j % 2 == 0) return ((j + 1) / 2) * ((j + 1) / 2); else return -((j + 1) / 2) * ((j + 1) / 2); } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Offene Hashverfahren - Suchen public int searchIndex (Object key) { /* sucht in der Hashtabelle nach Eintrag mit Schluessel key und liefert den zugehoerigen Index oder -1 zurueck */ int i = h(key); int j = 1; // naechster Index der Sondierungsfolge while (tag[i] != EMPTY &&!key.equals(T[i].key)){ // Naechster Eintr. in Sondierungsfolge i = (h(key) - s(j++, key)) % capacity; if (i < 0) i = i + capacity; } if (key.equals(T[i].key) && tag[i] == OCCUPIED) return i; else return -1; } public Object search (Object key) { /* sucht in der Hashtabelle nach Eintrag mit Schluessel key und liefert den zugehoerigen Wert oder null zurueck */ int i = searchIndex (key); if (i >= 0) return T[i].value; else return null; } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Offene Hashverfahren - Einfügen public void insert (Object key, Object value) { // fuegt einen Eintrag mit Schluessel key und Wert value ein int j = 1; // naechster Index der Sondierungsfolge int i = h(key); while (tag[i] == OCCUPIED) { i = (h(key) - s(j++, key)) % capacity; if (i < 0) i = i + capacity; } T[i] = new TableEntry(key, value); tag[i] = OCCUPIED; } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Offene Hashverfahren - Entfernen public void delete (Object key) { // entfernt Eintrag mit Schluessel key aus der Hashtabelle int i = searchIndex(key); if (i >= 0) { // Suche erfolgreich tag[i] = DELETED; } } Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Test-Programm public class OpenHashingTest { public static void main(String args[]) { Integer[] t= new Integer[args.length]; for (int i = 0; i < args.length; i++) t[i] = Integer.valueOf(args[i]); OpenHashTable h = new OpenHashTable (7); for (int i = 0; i <= t.length - 1; i++) { h.insert(t[i], null);# h.printTable (); } h.delete(t[0]); h.delete(t[1]); h.delete(t[6]); h.printTable(); } } Aufruf: java OpenHashingTest 12 53 5 15 2 19 43 Ausgabe (Quadratisches Sondieren): [ ] [ ] [ ] [ ] [ ] (12) [ ] [ ] [ ] [ ] [ ] (53) (12) [ ] [ ] [ ] [ ] [ ] (53) (12) (5) [ ] (15) [ ] [ ] (53) (12) (5) [ ] (15) (2) [ ] (53) (12) (5) (19) (15) (2) [ ] (53) (12) (5) (19) (15) (2) (43) (53) (12) (5) (19) (15) (2) {43} {53} {12} (5) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Sondierungsfolgen - Lineares Sondieren s(j,k) = j Sondierungsfolge für k: h(k), h(k)-1,...,0,m-1,..., h(k)+1, Problem: primäre Häufung (“primary clustering”) Pr (nächstes Objekt landet an Position 2) = 4/7 Pr (nächstes Objekt landet an Position 1) = 1/7 Lange Ketten werden mit größerer Wahrscheinlichkeit verlängert als kurze. 0 1 2 3 4 5 6 5 53 12 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Effizienz des linearen Sondierens erfolgreiche Suche: erfolglose Suche: Cn (erfolgreich) C´n(erfolglos) 0.50 1.5 2.5 0.90 5.5 50.5 0.95 10.5 200.5 1.00 - - Effizienz des linearen Sondierens verschlechtert sich drastisch, sobald sich der Belegungsfaktor  dem Wert 1 nähert. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Quadratisches Sondieren s(j,k) = (-1)j * j/22 Sondierungsfolge für k: h(k), h(k)+1, h(k)-1, h(k)+4, ... Permutation, falls m = 4l + 3 eine Primzahl ist. Problem: sekundäre Häufung, d.h. zwei Synonyme k und k´ durchlaufen stets dieselbe Sondierungsfolge. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Effizienz des quadratischen Sondierens erfolgreiche Suche: erfolglose Suche: Cn (erfolgreich) C´n(erfolglos) 0.50 1.44 2.19 0.90 2.85 11.40 0.95 3.52 22.05 1.00 - - Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Uniformes Sondieren s(j,k) = πk(j) πk eine der m! Permutationen von {0,...,m-1} - hängt nur von k ab - gleichwahrscheinlich für jede Permutation Cn (erfolgreich) C´n(erfolglos) 0.50 1.39 2 0.90 2.56 10 0.95 3.15 20 1.00 - - Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Zufälliges Sondieren Realisierung von uniformem Sondieren sehr aufwendig. Alternative: Zufälliges Sondieren s(j,k) = von k abhängige Zufallszahl s(j,k) = s(j´,k) möglich, aber unwahrscheinlich Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Double Hashing Idee: Wähle zweite Hashfunktion h´ s(j,k) = j*h´(k) Sondierungsfolge für k: h(k), h(k)-h´(k), h(k)-2h´(k),... Forderung: Sondierungsfolge muss Permutation der Hashadressen entsprechen. Folgerung: h´(k) ≠ 0 und h´(k) kein Teiler von m, d.h. h´(k) teilt m nicht. Beispiel: h´(k) = 1 + (k mod (m-2)) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Beispiel Hashfunktionen: h(k) = k mod 7 h´(k) = 1 + k mod 5 Schlüsselfolge: 15, 22, 1, 29, 26 In diesem Beispiel genügt fast immer einfaches Sondieren. Double Hashing ist genauso effizient wie uniformes Sondieren. Double Hashing ist leichter zu implementieren. 0 1 2 3 4 5 6 15 h´(22) = 3 0 1 2 3 4 5 6 15 22 h´(1) = 2 0 1 2 3 4 5 6 15 22 1 h´(29) = 5 0 1 2 3 4 5 6 15 29 22 1 h´(26) = 2 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verbesserung der erfolgreichen Suche - Motivation Hashtabelle der Größe 11, Double Hashing mit h(k) = k mod 11 und h´(k) = 1 + (k mod (11 – 2)) = 1 + (k mod 9) Bereits eingefügt: 22, 10, 37, 47, 17 Noch einzufügen: 6 und 30 h(6) = 6, h´(6) = 1 + 6 = 7 h(30) = 8, h´(30) = 1 + 3 = 4 0 1 2 3 4 5 6 7 8 9 10 22 47 37 17 10 0 1 2 3 4 5 6 7 8 9 10 22 47 37 6 17 10 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verbesserung der erfolgreichen Suche: Allgemein Einfügen: - k trifft in T[i] auf kalt, d.h. i = h(k) - s(j,k) = h(kalt) - s(j´,kalt) - kalt bereits in T[i] gespeichert Idee: Suche freien Platz für k oder kalt Zwei Möglichkeiten: (M1) kalt bleibt in T[i] betrachte neue Position h(k) - s(j+1,k) für k (M2) k verdrängt kalt betrachte neue Position h(kalt) - s(j´+1, kalt) für kalt if (M1) or (M2) trifft auf einen freien Platz then trage entsprechenden Schlüssel ein fertig else verfolge (M1) oder (M2) weiter Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verbesserung der erfolgreichen Suche Brent’s Verfahren: verfolge nur (M1) k trifft auf k´ k´ weicht aus k weicht aus k trifft auf k´´ fertig k´´ weicht aus k weicht aus k trifft auf k´´´ fertig k´´´ weicht aus k trifft auf k´´´´ fertig Binärbaum Sondieren: verfolge (M1) und (M2) Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verbesserung der erfolgreichen Suche Problem: kalt von k verdrängt:  nächster Platz in Sondierungsfolge für kalt? Ausweichen von kalt einfach, wenn gilt: s(j, kalt) - s(j -1, kalt) = s(1,kalt) für alle 1 ≤ j ≤ m -1. Das gilt beispielsweise für lineares Sondieren und double Hashing. Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Beispiel Hashfunktionen: h(k) = k mod 7 h´(k) = 1 + k mod 5 Schlüsselfolge: 12, 53, 5, 15, 2, 19 h(5) = 5 belegt k´= 12 Betrachte: h´(k) = 1  h(5) -1 * h´(5)  5 verdrängt 12 von seinem Platz 0 1 2 3 4 5 6 53 12 Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Verbesserung der erfolglosen Suche Suche nach k: k´>k in Sondierungsfolge:  Suche erfolglos Einfügen: kleinere Schlüssel verdrängen größere Schlüssel Invariante: Alle Schlüssel in der Sondierungsfolge vor k sind kleiner als k (aber nicht notwendigerweise aufsteigend sortiert) Probleme: Verdrängungsprozess kann “Kettenreaktion” auslösen k´ von k verdrängt: Position von k´ in Sondierungsfolge? Es muss gelten: s(j,k) - s(j -1,k) = s(1,k), 1 ≤ j ≤ m Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Ordered Hashing Suchen Input: Schlüssel k Output: Information zu Datensatz mit Schlüssel k oder null Beginne bei i  h(k) while T[i] nicht frei and T[i] .k < k do i  (i – s(1,k)) mod m end while; if T[i] belegt and T[i] .k = k then Suche erfolgreich else Suche erfolglos Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann

Ordered Hashing Einfügen Input: Schlüssel k  Beginne bei i  h(k) while T[i] nicht frei and T[i] .k ≠ k do if k < T[i].k then if T[i] ist entfernt then exit while-loop else // k verdrängt T[i].k vertausche T[i].k mit k i = (i – s(1,k)) mod m end while; if T[i] ist nicht belegt then trage k bei T[i] ein Informatik II: Algorithmen und Datenstrukturen, SS 2008 Prof. Dr. Thomas Ottmann