Algorithmen und Datenstrukturen

Ähnliche Dokumente
Algorithmen und Datenstrukturen

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

Kapitel 9. Hashverfahren. 9.1 Einführung

Suchen in Listen und Hashtabellen

Einführung in die Informatik Hashtables

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

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

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

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

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

DLP. Adolphe Kankeu Tamghe ALZAGK SEMINAR. Bremen, den 18. Januar Fachbereich Mathematik und Informatik 1 / 27

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

Kapitel 5: Dynamisches Programmieren Gliederung

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

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

Lineare Gleichungssysteme

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

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

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

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

Programmiertechnik II

Faktorisierung ganzer Zahlen mittels Pollards ρ-methode (1975)

Computeralgebra in der Lehre am Beispiel Kryptografie

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Algorithmen und Datenstrukturen

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Kapiteltests zum Leitprogramm Binäre Suchbäume

1. Grundlagen Sortieren Vertauschen Selektion Einfügen Quicksort Suchen...

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

Kapitel 6: Graphalgorithmen Gliederung

Digitale Signaturen. Sven Tabbert

Algorithmen & Datenstrukturen 1. Klausur

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

Sortierverfahren für Felder (Listen)

Kap. 4.2: Binäre Suchbäume

Vorkurs Informatik WiSe 15/16

WS 2008/09. Diskrete Strukturen

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Authentikation und digitale Signatur

Abschnitt: Algorithmendesign und Laufzeitanalyse

Algorithmen und Datenstrukturen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

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

Serienbrief erstellen

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

5. Übung zum G8-Vorkurs Mathematik (WiSe 2011/12)

Bestimmung einer ersten

Einführung in die Informatik 1

368 4 Algorithmen und Datenstrukturen

Kryptographische Verfahren. zur Datenübertragung im Internet. Patrick Schmid, Martin Sommer, Elvis Corbo

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Primzahlzertifikat von Pratt

Theoretische Informatik

Das RSA-Verfahren. Armin Litzel. Proseminar Kryptographische Protokolle SS 2009

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

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Optimalitätskriterien

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

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

Mathematik und Logik

Datenstrukturen & Algorithmen

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

Kryptologie und Kodierungstheorie

Vortrag. Suchverfahren der Künstlichen Intelligenz. Sven Schmidt (Technische Informatik)

Raumbezogene Datenbanken (Spatial Databases)

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

Digitale Magazine ohne eigenen Speicher

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Über das Hüten von Geheimnissen

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

Übungen zur Vorlesung Computergrundlagen WS 2008/09 Fakultät Physik, Universität Stuttgart Jens Harting, Martin Hecht, Bibhu Biswal Blatt 14

Verschlüsselung. Chiffrat. Eve

Anleitung zum GEPA EXCEL Import Tool

RSA Verfahren. Kapitel 7 p. 103

Inf 12 Aufgaben

OPERATIONEN AUF EINER DATENBANK

Elemente der Analysis I Kapitel 2: Einführung II, Gleichungen

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

Einführung. Vorlesungen zur Komplexitätstheorie: Reduktion und Vollständigkeit (3) Vorlesungen zur Komplexitätstheorie. K-Vollständigkeit (1/5)

Ideen der Informatik Suchen und Sortieren [Ordnung muss sein ] Kurt Mehlhorn Adrian Neumann viele Folien von Kostas Panagiotou

Herbst. Erste Staatsprüfung für ein Lehramt an öffentlichen Schulen. Prüfungsteilnehmer prüfungstermin Einzelprüfungsnummei. - Prüfungsaufgaben -

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Lenstras Algorithmus für Faktorisierung

Institut fu r Informatik

VBA-Programmierung: Zusammenfassung

Duplikatfilterung und Sampling von Webseiten

6.3 Serienbriefe über Microsoft Excel und Word

Repräsentation von Daten Binärcodierung von rationalen Zahlen und Zeichen

Zusatztutorium,

Extrem kurzer Einstieg in die Programmierung mit Java

Technische Informatik I. Übung 3 Speicherhierarchie. v t d 0 d 1 d 2 d Technische Informatik I Übung 3. Technische Informatik I Übung 3

Algorithmen für Peer-to-Peer-Netzwerke Sommersemester Vorlesung

SIZ-Spickzettel Word 2003

Schritt für Schritt Anleitung zum Erstellen einer Android-App zum Ein- und Ausschalten einer LED

Sprechen wir über Zahlen (Karl-Heinz Wolff)

Leitfaden Lineare Algebra: Determinanten

Expander Graphen und Ihre Anwendungen

Transkript:

Algorithmen und Datenstrukturen Prof. Martin Lercher Institut für Informatik Heinrich-Heine-Universität Düsseldorf Teil Hash-Verfahren Version vom: 18. November 2016 1 / 28

Vorlesung 9 18. November 2016 2 / 28

Hash-Verfahren Beim Hashing werden die Schlüssel der Objekte für die Berechnung einer Position in einem Feld verwendet. Sei K eine Schlüsselmenge und I eine endliche Indexmenge (in der Regel I = {0, 1, 2..., m 1}). Die Hash-Funktion h : K I wird zum Suchen und zum Platzieren der Elemente eingesetzt. Sie soll die Schlüssel gleichmäßig auf die Indizes verteilen und den Indexbereich ausschöpfen. Sie soll schnell zu berechnen sein. 3 / 28

Hash-Verfahren Wenn mehrere Schlüssel auf denselben Index abgebildet werden, spricht man von einer Kollision. Bei einer Kollision muss ein Ersatzplatz gefunden werden. Welche Funktionen sind als Hash-Funktion geeignet? In der Praxis hat sich Ausblenden und Restbildung bewährt. Ausblenden: Benutze nur einen Teil des Schlüssels (nicht alle Stellen). Restbildung: Der verbleibende Schlüssel k wird ganzzahlig durch die Länge der Hashtabelle dividiert. Der Rest wird als Index verwendet. h(k) = k mod I Die besten Ergebnisse erhält man, wenn I eine Primzahl ist. Schlüssel, die nicht als Zahlen interpretiert werden können, müssen vorher geeignet umgerechnet werden. 4 / 28

Hash-Verfahren Beispiel Schlüssel sind Zeichenketten der Länge 2. Zeichen werden als Zahlen interpretiert (ASCII = American Standard Code for Information Interchange). Die entstandenen Zahlen werden zum Schlüssel addiert. Zeichenkette k 1 k 2 k = k 1 + k 2 i = k mod 7 GL 71 76 147 0 LX 76 88 164 3 SL 83 76 19 GT 71 84 1 1 RX 82 88 170 2 GX 71 88 19 / 28

Hash-Verfahren - Universelle Hash-Funktionen Universelle Hash-Funktionen Gesucht sind Hash-Funktionen, die im Mittel akzeptabel sind. Sei m = I und H eine endliche Menge von m Hash-Funktionen. H heißt universell, wenn für jedes Paar von verschiedenen Schlüsseln x, y K gilt: H {h H h(x) = h(y)} m Für jedes Schlüsselpaar x, y führt höchstens der m-te Teil der Hash-Funktionen die beiden Schlüssel x und y zu einer Kollision. 6 / 28

Hash-Verfahren - Universelle Hash-Funktionen Die Wahrscheinlichkeit, dass zwei Schlüssel mit einer Hash-Funktion aus H auf den gleichen Index abgebildet werden ist 1 m. Sei p m eine Primzahl und mit Dann ist h a,b : {0,..., p 1} {0,..., m 1} h a,b (x) = ((ax + b) mod p) mod m. {h a,b 1 a < p, 0 b < p} eine universelle Klasse von Hash-Funktionen (lineare Algebra). 7 / 28

Hash-Verfahren - Kollisionsauflösung Kollisionsauflösung: Probleme treten auf: bei der Platzierung, wenn der Eintrag auf der berechneten Hash-Adresse nicht leer ist, bei der Suche, wenn der berechnete Platz ein anderes Element enthält. Zur Kollisionsauflösung muss ein Ersatzplatz gefunden werden. 8 / 28

Hash-Verfahren - Kollisionsauflösung 1. Verkettung der Überläufer: Die Überläufer können zum Beispiel in einer linearen Liste verkettet werden, welche an den Hashtabelleneintrag angehängt wird, der sich aus der Hash-Funktion angewendet auf den Schlüssel ergibt. Bei einer erfolglosen Suche nach Schlüssel k betrachten wir alle Elemente in der Liste an h(k). Die durchschnittliche Anzahl der Einträge in h(k) ist n/m, wenn n Einträge auf m Listen verteilt sind. 9 / 28

Hash-Verfahren - Kollisionsauflösung Belegungsfaktor: α = n m Im Mittel ist die Anzahl der bei der erfolglosen Suche nach einem Schlüssel betrachteten Einträge also C n = n m = α Beim Einfügen des j-ten Schlüssels ist die durchschnittliche Listenlänge gerade (j 1)/m. Also betrachten wir bei einer späteren Suche nach dem j-ten Schlüssel gerade 1 + (j 1)/m Einträge im Durchschnitt, wenn stets am Listenende eingefügt und kein Datensatz entfernt wurde. 10 / 28

Hash-Verfahren Im Mittel ist die Anzahl der bei der erfolgreichen Suche nach einem Schlüssel betrachteten Einträge also C n = 1 n n (1 + (j 1)/m) = 1 + n 1 2m 1 + α 2 j=1 Bemerkung: n j = j=1 n(n + 1) 2 n n 1 (j 1) = j = j=1 j=0 (n 1)n 2 11 / 28

Hash-Verfahren - Offene Hash-Verfahren 2. Offene Hash-Verfahren: Speichere die Überläufer in der Hashtabelle und nicht in zusätzlichen Listen. Nur sinnvoll für α < 1. Ist die Hash-Adresse h(k) belegt, so wird eine Ausweichposition gesucht. Die Folge der zu betrachtenden Speicherplätze für einen Schlüssel nennt man Sondierungsfolge. Sei h : K {0,..., m 1} eine Hash-Funktion und s : {0,..., m 1} K N 0 eine Funktion, so dass für jedes k K, die Folge (h(k) s(j, k)) mod m für j = 0, 1,..., m 1 eine Permutation aller Hash-Adressen 0,..., m 1 ist, dann ist s eine Sondierungsfunktion für h. / 28

Hash-Verfahren - Lineares Sondieren Lineares Sondieren: Beim linearen Sondieren ist für Schlüssel k die Sondierungsfolge h(k), h(k) 1, h(k) 2,..., 0, m 1,..., h(k) + 1 Die Sondierungsfunktion ist somit s(j, k) = j 13 / 28

Hash-Verfahren - Lineares Sondieren Beispiel h(k) = k mod 7, s(j, k) = j (lineares Sondieren) Einfügen der Schlüssel, 3,, 1, 2, 19. 0 1 2 3 4 6 3 3 1 3 1 2 3 19 1 2 3 14 / 28

Hash-Verfahren - Lineares Sondieren Nachteil: Das Verfahren neigt zur primären Häufung, indem gewisse Bereiche keine Lücke mehr aufweisen. 1 / 28

Hash-Verfahren - Quadratisches Sondieren Quadratisches Sondieren: Es wird um h(k) herum mit quadratisch wachsendem Abstand nach einem freien Platz gesucht (in beide Richtungen). Sondierungsfolge: h(k), (h(k) + 1) mod m, (h(k) 1) mod m, (h(k) + 4) mod m, (h(k) 4) mod m,... Sondierungsfunktion: s(j, k) = ( j/2 ) 2 ( 1) j Wenn m ein Primzahl der Form 4i + 3, i N, ist, dann ist garantiert, dass die Sondierungsfolge Modulo m eine Permutation der Hash-Adressen 0 bis m 1 ist (ohne Beweis). 16 / 28

Hash-Verfahren - Quadratisches Sondieren Beispiel Für m = 13 ist die Sondierungsfolge keine Permutation der Hash-Adressen 0 bis m 1. k mod 13 ( 0/2 ) 2 ( 1) 0 mod 13 = k mod 13 = k + 0 mod 13 k mod 13 ( 1/2 ) 2 ( 1) 1 mod 13 = k + 1 mod 13 = k + 1 mod 13 k mod 13 ( 2/2 ) 2 ( 1) 2 mod 13 = k 1 mod 13 = k + mod 13 k mod 13 ( 3/2 ) 2 ( 1) 3 mod 13 = k + 4 mod 13 = k + 4 mod 13 k mod 13 ( 4/2 ) 2 ( 1) 4 mod 13 = k 4 mod 13 = k + 9 mod 13 k mod 13 ( /2 ) 2 ( 1) mod 13 = k + 9 mod 13 = k + 9 mod 13 k mod 13 ( 6/2 ) 2 ( 1) 6 mod 13 = k 9 mod 13 = k + 4 mod 13 k mod 13 ( 7/2 ) 2 ( 1) 7 mod 13 = k + 16 mod 13 = k + 3 mod 13 k mod 13 ( 8/2 ) 2 ( 1) 8 mod 13 = k 16 mod 13 = k + 10 mod 13 k mod 13 ( 9/2 ) 2 ( 1) 9 mod 13 = k + 2 mod 13 = k + mod 13 k mod 13 ( 10/2 ) 2 ( 1) 10 mod 13 = k 2 mod 13 = k + 1 mod 13 k mod 13 ( 11/2 ) 2 ( 1) 11 mod 13 = k + 36 mod 13 = k + 10 mod 13 k mod 13 ( /2 ) 2 ( 1) mod 13 = k 36 mod 13 = k + 3 mod 13 Es fehlen die Indices ((k + j) mod 13) mit j {2,, 6, 7, 8, 11}. 17 / 28

Hash-Verfahren - Quadratisches Sondieren Beispiel h(k) = k mod 7, s(j, k) = ( j/2 ) 2 ( 1) j (quadratisches Sondieren) Einfügen der Schlüssel, 3,, 1, 2, 19. 0 1 2 3 4 6 3 3 1 3 1 2 3 19 1 2 3 (Fehler: 19 3) 18 / 28

Hash-Verfahren - Quadratisches Sondieren Nachteil: Zwei Schlüssel k und k mit h(k) = h(k ) durchlaufen stets dieselbe Sondierungsfolge. Sie behindern sich also auf Ausweichplätzen (sekundäre Häufung). 19 / 28

Hash-Verfahren - Quadratisches Sondieren Eine Analyse der Effizienz des linearen und quadratischen Sondierens zeigt, dass für die durchschnittliche Anzahl der bei erfolgloser bzw. erfolgreicher Suche betrachteten Einträge C n bzw. C n gilt: 1 Lineares Sondieren: C n 1 ( ) 1 1 + 2 (1 α) 2 2 Quadratisches Sondieren: ( ) 1 C n 1 + ln α 1 α 2 C n 1 2 ( ) 1 1 + (1 α) C n 1 ( ) 1 1 α α + ln 1 α Bemerkung: Offene Hash-Verfahren sind immer ineffizienter als eine Verkettung der Überläufer. 20 / 28

Hash-Verfahren Vergleich der Effizienz zwischen linearem und quadratischem Sondieren: linear quadratisch α erfolgreich erfolglos erfolgreich erfolglos 0. 1. 2. 1.44 2.19 0.9. 0. 2.8 11.40 0.9 10. 200. 3.2 22.0 0.99 0. 000..11 103.60 21 / 28

Hash-Verfahren - Double Hashing Verbesserte Kollisionsauflösung: Schlüsselabhängige Sondierung (double Hashing): Verwende für die Sondierungsfolge eine zweite Hash-Funktion h. Sondierungsfolge: h(k), (h(k) h (k)) mod m, (h(k) 2 h (k)) mod m,......, (h(k) (m 1) h (k)) mod m 22 / 28

Hash-Verfahren - Double Hashing Sondierungsfunktion: s(j, k) = j h (k) Die Funktion h muss so gewählt werden, dass die Sondierungsfolge eine Permutation der Hash-Adressen ist. Das bedeutet, dass h (k) 0 sein muss und m nicht teilen darf. Ist m eine Primzahl und h(k) = k mod m, so erfüllt h (k) = 1 + (k mod (m 2)) die erwarteten Anforderungen. Anmerkung: h (k) = 1 + (k mod (m 1)) würde die Anforderungen auch erfüllen, wird aber ungern verwendet, da m 1 eine grade Zahl ist. Unterschiedliche Schlüssel, die auf denselben Index abgebildet werden, erhalten unterschiedliche Inkremente. 23 / 28

Hash-Verfahren - Double Hashing Beispiel m = 7, h(k) = k mod 7, h (k) = 1 + (k mod ) Einfügen der Schlüssel, 3,, 1, 2, 19. 0 1 2 3 4 6 3 3 1 3 1 2 3 19 1 2 3 24 / 28

Hash-Verfahren Verbesserung der erfolgreichen Suche: Die durchschnittliche Suchzeit bei der erfolgreichen Suche variiert bei Hash-Verfahren ohne Häufung mit unterschiedlicher Reihenfolge des Einfügens der Schlüssel. In Fällen, in denen wesentlich häufiger gesucht wird als eingefügt, kann es lohnend sein, die Schlüssel beim Einfügen eines neuen Schlüssels so zu reorganisieren, dass die Suchzeit verkürzt wird. 2 / 28

Hash-Verfahren - Brents Algorithmus Beim selben Double Hashing wie zuvor: 0 1 2 3 4 6 3 3 3 Wird Schlüssel nach Inspektion der Plätze, 4, 3 bei Hash-Adresse 3 eingetragen, so ist die durchschnittliche Suchzeit der drei eingetragenen Elemente (1 + 1 + 3)/3 = /3 = 1.66 (mittlere Zeile). Man hätte aber auch Schlüssel auf Platz setzen können und Schlüssel weiter sondieren lassen können. Dann wäre die durchschnittliche Suchzeit (1 + 1 + 2)/3 = 4/3 = 1.33 (untere Zeile). 26 / 28

Hash-Verfahren - Brents Algorithmus Brents Algorithmus: Methode: Einfügen eines Schlüssels k: Beginne mit Hash-Adresse i = h(k). Falls Position i belegt ist, betrachte die beiden Hash-Adressen b = (i h (k)) mod m und b = (i h (k )) mod m, wobei k der Schlüssel auf Hash-Adresse i ist. Ist b eine freie Hash-Adresse, dann positioniere Schlüssel k auf Position b, ansonsten, ist b eine freie Hash-Adresse, dann positioniere Schlüssel k auf Position i und k auf Position b, ansonsten fahre rekursiv fort mit dem Versuch Schlüssel k auf Position i = b zu positionieren. 27 / 28

Hash-Verfahren - Brents Algorithmus Beispiel m = 7, h(k) = k mod 7, h (k) = 1 + (k mod ) Einfügen der Schlüssel, 3,, 1, 2, 19. 0 1 2 3 4 6 3 3 1 3 1 3 2 19 1 3 2 28 / 28