Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Ähnliche Dokumente
Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 12

Satz 23 In einer Hashtabelle der Größe n mit m Objekten tritt mit Wahrscheinlichkeit

EADS 3.3 Gewichtsbalancierte Bäume 95/598 ľernst W. Mayr

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen II: Hashverfahren

Algorithmen und Datenstrukturen II: Hashverfahren

Korollar 191 In einem (a, b)-baum mit n gespeicherten Schlüsseln können die Wörterbuchoperationen in Zeit O(log a n) durchgeführt werden.

Algorithmen & Datenstrukturen Blatt 0 HS 17

Hashverfahren. (Algorithmen und Datenstrukturen II) Prof. Dr. Oliver Braun. Letzte Änderung: :33. Hashverfahren 1/29

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Beispielprüfung Datenstrukturen und Algorithmen D-INFK

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

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

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

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

Datenstrukturen & Algorithmen Lösungen zu Blatt 2 FS 16

6/23/06. Universelles Hashing. Nutzen des Universellen Hashing. Problem: h fest gewählt es gibt ein S U mit vielen Kollisionen

Amortisierte Analysen

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

Teil 1: Suchen. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Suchen 1-1

Algorithmen und Datenstrukturen Hashverfahren

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

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

Datenstrukturen und Algorithmen. Vorlesung 10

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

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

Datenstrukturen und Algorithmen D-INFK

Prüfung Datenstrukturen und Algorithmen, D-INFK. Datenstrukturen & Algorithmen

Algorithmen I. Tutorium 1-4. Sitzung. Dennis Felsing

Eine universelle Klasse von Hash-Funktionen

Algorithmen und Datenstrukturen 1 VL Übungstest WS Jänner 2009

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen Lösungen zu Blatt 11 FS 14

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017

Informatik II, SS 2016

Datenstrukturen und Algorithmen D-INFK

Hashtabellen. Hashverfahren, was ist das eigentlich?

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

Musterlösung zur Prüfung Datenstrukturen und Algorithmen D-INFK

Themen. Hashverfahren. Stefan Szalowski Programmierung II Hashverfahren

Dictionary Definition

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

ContainerDatenstrukturen. Große Übung 4

Datenstrukturen und Algorithmen D-INFK

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Datenstrukturen und Algorithmen D-INFK. Musterlösung 1

Algorithmische Intelligenz. Amortisierung. Stefan Edelkamp

4. Hashverfahren. geg.: Wertebereich D, Schlüsselmenge S = {s 1,..., s n } D. Menge A von Speicheradressen; oft: A = {0,..., m 1}

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

Amortisierte Analyse

s(x, i) = i h 2 (x), i N 0

Kapitel 4. Streuen. (h K injektiv) k 1 k 2 K = h(k 1 ) h(k 2 )

Name:... Vorname:... Matr.-Nr.:... Studiengang:...

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / 2015 Vorlesung 6, Donnerstag 27.

Teil VII. Hashverfahren

12. Dynamische Datenstrukturen

Amortisierte Laufzeitanalyse

Algorithmen und Datenstrukturen VO 3.0 Vorlesungsprüfung 19. Oktober 2007

Amortisierte Analyse. C. Komusiewicz 6.1 Amortisierte Analyse: Motivation 105

Übungsklausur Algorithmen I

Übung Datenstrukturen. Bäume

Informatik II, SS 2014

Algorithm Engineering. Amortisierung. Stefan Edelkamp

Datenstrukturen und Algorithmen D-INFK

2. Suchen mit Hashverfahren

ALP II Dynamische Datenmengen Datenabstraktion

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Beispiellösung zur Prüfung Datenstrukturen und Algorithmen D-INFK

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

Hashing. Überblick Aufgabe Realisierung

Algorithmen I - Tutorium 28 Nr. 3

Klausur Algorithmen und Datenstrukturen

1. Die rekursive Datenstruktur Liste

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

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1 VL Übungstest WS Januar 2011

Beispiellösung zur Prüfung Datenstrukturen und Algorithmen D-INFK

Hashverfahren I. Algorithmen und Datenstrukturen 251 DATABASE SYSTEMS GROUP

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

Praktische Informatik I Algorithmen und Datenstrukturen Wintersemester 2006/07

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

NAME, VORNAME: Studiennummer: Matrikel:

Musterlösung Datenstrukturen und Algorithmen

(27 - Selbstanordnende lineare Listen)

Datenstrukturen und Algorithmen D-INFK

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

Grundlagen: Algorithmen und Datenstrukturen

Informatik II, SS 2016

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

1. Übung Algorithmentechnik

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

Grundlagen: Algorithmen und Datenstrukturen

Transkript:

Eidgenössische Technische Hochschule Zürich Ecole polytechnique fédérale de Zurich Politecnico federale di Zurigo Federal Institute of Technology at Zurich Departement Informatik 24. November 2016 Markus Püschel Peter Widmayer Thomas Tschager Tobias Pröger Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16 Lösung 9.1 Offene Hashverfahren. Die im folgenden benutzten Sondierungsverfahren werden in genau der Form benutzt, in der sie in der Vorlesung vorgestellt wurden, d.h. die Sondierungsfunktion wird von der Hashfunktion subtrahiert. Auch eine Addition der Funktionen ist gültig, führt aber u.u. zu anderen Lösungen. a) h(k) = Quersumme von k. Diese Funktion ist ungeeignet für Hashing, da der Wert der Hashfunktion zwischen 0 und p 1 liegen muss, die Quersumme aber beliebig gross werden kann. Selbst wenn die Quersumme stets kleiner als p wäre, wäre sie ungeeignet, da sie schlecht streut. h(k) = k(1+p 3 ) mod p. Wegen p 3 mod p = 0 ist h(k) = k mod p, was wie in der Vorlesung erklärt eine geeignete Hashfunktion ist. Der einzige Nachteil der Formulierung wie in der Aufgabenstellung sind die überflüssigen arithmetischen Operationen. h(k) = p(rk rk ), r R + \Q. Diese Hashfunktion entspricht der in der Vorlesung vorgestellten multiplikativen Methode und ist gut, wenn r geeignet gewählt wird. Man kann zeigen, dass für r = φ 1 = 5 1 2 besonders gute Ergebnisse erzielt werden. b) (i) : h() = 6 6: h(6) = 6 h(6) 1 5 6 5: h(5) = 5 h(5) 1 4 5 6 5 6 8 11 5 6 8 28: h(28) = 6 h(28) 1 5 h(28) 2 4 h(28) 3 3 11 28 5 6 8 14: h(14) = 3 h(14) 1 2 11 14 28 5 6 8 15: h(15) = 4 h(15) 1 3 h(15) 2 2 h(15) 3 1 11 15 14 28 5 6 8 Kollisionen: 9

(ii) : h() = 6 6: h(6) = 6 h(6) 1 5 6 5: h(5) = 5 h(5) 1 4 5 6 5 6 8 11 5 6 8 28: h(28) = 6 h(28) 1 5 h(28) + 1 7 11 5 6 28 8 14: h(14) = 3 11 14 5 6 28 8 15: h(15) = 4 h(15) 1 3 h(15) + 1 5 h(15) 4 0 h(15) + 4 8 h(15) 9 6 h(15) + 9 2 11 15 14 5 6 28 8 Kollisionen: 10 (iii) : h() = 6 6: h(6) = 6 h(6) h (6) 10 6 5: h(5) = 5 5 6 5 8 6 11 5 8 6 28: h(28) = 6 h(28) h (28) 4 11 28 5 8 6 14: h(14) = 3 11 14 28 5 8 6 15: h(15) = 4 h(15) h (15) 8 h(15) 2h (15) 1 11 15 14 28 5 8 6 Kollisionen: 4 2

c) Die Löschung eines Schlüssels k ist problematisch, wenn ein weiterer Schlüssel k mit der gleichen Hashadresse später als k eingefügt wurde. Würde k einfach gelöscht (z.b. indem die Position als frei markiert wird), dann könnte der Schlüssel k nicht mehr gefunden werden, da das Sondieren endet, sobald eine freie Position gefunden wird. Im gegebenen Beispiel könnten die Schlüssel 6 und 28 nicht mehr gefunden werden. Folglich muss die Position explizit als gelöscht markiert werden, und bei der Suche nach einem Schlüssel muss die Sondierung fortgesetzt werden, sobald eine solche Position gefunden wird. Selbstverständlich darf die Markierung beim späteren Einfügen eines anderen Schlüssels überschrieben werden, sofern dies nötig ist. Werden nun viele Schlüssel gelöscht, dann kann es passieren, dass die Suche nach einem Schlüssel sehr ineffizient wird (denn die Sondierung besucht u.u. viele als gelöscht markierte Positionen). Hashing ist also besonders dann geeignet, wenn Schlüssel grösstenteils nur eingefügt und gesucht und nur selten gelöscht werden. d) h (k) = ln(k + 1) mod q. Diese Funktion ist ungeeignet als zweite Hashfunktion, denn für den Schlüssel k = 0 ist h (0) = ln(1) = 0. s(j, k) = k j mod p. Diese Funktion ist als Sondierungsfunktion ungeeignet, denn für die Schlüssel k = 0 oder k = 1 hat s(j, k) konstant den Wert 0 bzw. 1. s(j, k) = ((k j) mod q) + 1. Diese Funktion ist ebenfalls als Sondierungsfunktion ungeeignet, denn ihr Wert ist konstant 1, wenn der Schlüssel k ein Vielfaches von q ist. Zudem ist für alle anderen Schlüssel die Bildmenge von s(j, k) genau {1,..., q}, d.h. p q Adressen der Hashtabelle können überhaupt nicht erreicht werden. e) Beim quadratisches Sondieren hängt die Folge der s(j, k) nicht vom Schlüssel k ab. Gibt es nun viele Schlüssel k, die auf die gleiche Hashadresse h(k) abgebildet werden, dann ist die Sondierungsfolge für all diese Schlüssel gleich. Also treten beim Sondieren viele Kollisionen auf. Man spricht dann auch von sekundärem Clustering. Double Hashing vermeidet sekundäres Clustering, da verschiedene Schlüssel k, k mit h(k) = h(k ) oftmals unterschiedliche Sondierungsfolgen besitzen. Lösung 9.2 Kuckucks-Hashing (Cuckoo Hashing). a) Einfügen von 27: T 1 : 27 T 2 : Einfügen von 2 (verdrängt 27 in T 1 ): T 1 : 2 T 2 : 27 Einfügen von 32 (verdrängt 2 in T 1, 2 verdrängt 27 in T 2, 27 verdrängt 32 in T 1 ): b) Hier sind verschiedene Wahlen möglich. So zum Beispiel führt die Einfügung des Schlüssels 7 zu einer Endlosschleife. 1) Initial: 2) Füge 7 in T 1 ein (verdrängt 27): T 1 : 7 T 2 : 2 32 3

3) Füge 27 in T 2 ein (verdrängt 2): T 1 : 7 T 2 : 27 32 4) Füge 2 in T 1 ein (verdrängt 7): T 1 : 2 T 2 : 27 32 5) Füge 7 in T 2 ein (verdrängt 32): T 1 : 2 T 2 : 27 7 6) Füge 32 in T 1 ein (verdrängt 2): T 1 : 32 T 2 : 27 7 7) Füge 2 in T 2 ein (verdrängt 27): T 1 : 32 T 2 : 2 7 8) Füge 27 in T 1 ein (verdrängt 32): T 1 : 27 T 2 : 2 7 9) Füge 32 in T 2 ein (verdrängt 7): Die Situation jetzt ist identisch zur Ausgangssituation, in der der Schlüssel 7 in T 1 eingefügt werden soll. Lösung 9.3 Queue mit Stacks implementieren. Zur Erinnerung: In der amortisierten Analyse mittels Potentialfunktion definiert man Φ i als das Potential (d.h. dem Bankkontostand) nach der i-ten Operation. Die i-te Operation habe tatsächliche Kosten t i. Dann sind die amortisierten Kosten der i-ten Operation definiert als a i := t i + Φ i Φ i 1. Mit dieser Definition folgt für eine Folge von m Operationen a i = ( m ) (t i + Φ i Φ i 1 ) = t i + Φ m Φ 0, (1) und somit erhalten wir t i = a i + Φ 0 Φ m. (2) Wenn es also gelingt, die amortisierten Kosten jeder Operation sowie den Term Φ 0 Φ m abzuschätzen, dann erhält man so auch eine Abschätzung für die tatsächlichen Gesamtkosten. Wird die Potenzialfunktion beispielsweise so gewählt, dass Φ m Φ 0 für jedes m, dann folgt m t i m a i, d.h. die tatsächlichen Gesamtkosten können durch die Summe der amortisierten Kosten nach oben abgeschätzt werden. Wir bezeichnen die beiden Stacks als Stack L und Stack R. Diese seien initial leer. Eine Enqueue- Operation legt das gegebene Objekt x auf Stack L ab (mit der Operation Push). Bei einer Dequeue-Operation wird das oberste Objekt von Stack R ausgegeben und entfernt (mit Pop), falls Stack R nicht leer ist. Ansonsten entfernen wir jeweils das oberste Element von Stack L (mit Pop) und fügen es Stack R (mittels Push) hinzu. Dieses Vorgehen wiederholen wir, bis Stack L leer ist. Anschliessend wird das oberste Element von Stack R ausgegeben und von Stack R entfernt. 4

Wir definieren nun die Potentialfunktion Φ i als 2 Anzahl der momentan gespeicherten Objekte auf Stack L. (3) Eine Enqueue-Operation hat tatsächliche Kosten t i = 1 und amortisierte Kosten a i = t i + Φ i Φ i 1 = 1 + 2 = 3. (4) Bei einer Dequeue-Operation gehen wir zunächst davon aus, dass Stack R nicht leer ist. Dann sind die tatsächlichen und amortisierten Kosten t i = a i = 1. Nun sei Stack R leer und k die Anzahl der Elemente auf Stack L. Die tatsächlichen Kosten sind dann t i = 2k + 1. Die amortisierten Kosten sind a i = t i + Φ i Φ i 1 = 2k + 1 2k = 1. (5) Damit sind die Operationen Enqueue und Dequeue in amortisierter Zeit Θ(1) ausführbar. 5