Informatik II, SS 2016

Ähnliche Dokumente
Informatik II, SS 2014

Informatik II, SS 2018

Informatik II, SS 2016

Informatik II, SS 2014

Informatik II, SS 2016

Informatik II, SS 2018

Informatik II, SS 2014

Informatik II, SS 2014

Teil VII. Hashverfahren

Datenstrukturen und Algorithmen. Vorlesung 10

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

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

Übersicht. Einfache Suche Binäre Suchbäume Hashing Skip-Lists Mengen Sortieren Order-Statistics. 2 Suchen und Sortieren

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

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Übungsklausur Algorithmen I

Grundlagen: Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

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

Informatik II, SS 2014

Grundlagen: Algorithmen und Datenstrukturen

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

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

Grundlagen der Algorithmen und Datenstrukturen Kapitel 4

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

Dictionary Definition

Vorlesung Datenstrukturen

Informatik II, SS 2016

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Einführung. B6.2 Symboltabellen. B6.3 Einfache Implementationen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

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

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

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

B6.1 Introduction. Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Introduction. B6.3 Analyse. B6.4 Ordnungsbasierte Methoden

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

Übung Algorithmen I

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

Informatik II: Algorithmen und Datenstrukturen SS 2015

NAME, VORNAME: Studiennummer: Matrikel:

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

Übungsklausur Algorithmen I

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

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

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.

Datenstrukturen und Algorithmen. Vorlesung 5

3. Übung Algorithmen I

Informatik II Hashing

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

Informatik II Prüfungsvorbereitungskurs

Eine universelle Klasse von Hash-Funktionen

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

Algorithmen 1 Tutorium

Informatik II, SS 2018

Informatik II, SS 2016

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen

Programmiertechnik II

Mengen und Multimengen

STL-Container und Laufzeit

Hashing. Überblick Aufgabe Realisierung

Programmiertechnik II

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

Erinnerung VL vom

Grundlagen: Algorithmen und Datenstrukturen

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Such-Algorithmen für Wörterbücher. Wörterbuch. Sommersemester Dr.

Algorithmen I - Tutorium 28 Nr. 3

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

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

Algorithmen und Datenstrukturen

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

9. Natürliche Suchbäume

Algorithmen und Datenstrukturen 1 VU 6.0 Nachtragstest SS Oktober 2014

Komplexität eines Algorithmus, Grössenordnung, Landau-Symbole, Beispiel einer Komplexitätsberechnung (Mergesort) 7. KOMPLEXITÄT

elementare Datenstrukturen

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 12

Informatik II Hashing

Informatik II Hashing

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2017/18. Pro f. Dr. Sán do r Fe k e te

Kapitel 6 HASHING. Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm

Informatik II Prüfungsvorbereitungskurs

Algorithmen und Datenstrukturen

18. Natürliche Suchbäume

Algorithmen und Datenstrukturen

Themen. Hashverfahren. Stefan Szalowski Programmierung II Hashverfahren

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Dynamische Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

5.8.2 Erweiterungen Dynamische Hash-Funktionen (mit variabler Tabellengröße)?

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

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Karlsruher Institut für Technologie Institut für Theoretische Informatik. Übungsklausur Algorithmen I

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

Anwendungsbeispiel MinHeap

Amortisierte Analyse

Transkript:

Informatik II - SS 2016 (Algorithmen & Datenstrukturen) Vorlesung 9 (25.5.2016) Hashtabellen II, Binäre Suchbäume I Algorithmen und Komplexität

Hashtabellen mit Chaining Jede Stelle in der Hashtabelle zeigt auf eine verkette Liste Hashtabelle 0 None 1 None 2 None 3 4 None 5 None 6 None 7 8 None m 1 None v 1 v 2 v 3 Platzverbrauch: O(m + n) Tabellengrösse m, Anz. Elemente n 2

Hashing mit offener Adressierung Ziel: Speichere alles direkt in der Hashtabelle (im Array) offene Adressierung = geschlossenes Hashing keine Listen Grundidee: Bei Kollisionen müssen alternative Einträge zur Verfügung stehen Erweitere Hashfunktion zu h: S 0,, m 1 {0,, m 1} Für jedes x S sollte h(x, i) durch alle m Werte gehen (für versch. i) Zugriff (schreiben/lesen) zu Element mit Schlüssel x: Versuche der Reihe nach an den Positionen h x, 0, h x, 1, h x, 2,, h(x, m 1) 3

Doppel-Hashing Ziel: Verwende mehr als m verschiedene Abfolgen von Positionen Idee: Benutze zwei Hashfunktionen h x, i = h 1 x + i h 2 x mod m Vorteile: Sondierungsfunktion hängt in zwei Arten von x ab Vermeidet die Nachteile von linearem und quadr. Sondieren Wahrscheinlichkeit, dass zwei Schlüssel x und x die gleiche Positionsfolge erzeugen: h 1 x = h 1 x h 2 x = h 2 x WSK = 1 m 2 Funktioniert in der Praxis sehr gut! 4

Offene Adressierung : Zusammenfassung Offene Adressierung: Alle Schlüssel/Werte werden direkt im Array gespeichert Keine Listen nötig spart den dazugehörigen Overhead Nur schnell, solange der Load α = n m nicht zu gross wird dann ist s dafür besser als Chaining α > 1 ist nicht möglich! da nur m Positionen zur Verfügung stehen 5

Rehash Was tun, wenn die Hashtabelle zu voll wird? Offene Adressierung: α > 1 nicht möglich, bei α 1 sehr ineff. Chaining: Komplexität wächst linear mit α Was tun, wenn die gewählte Hashfunktion schlecht ist? Rehash: Erstelle neue, grössere Hashtabelle, wähle neue Hashfunktion h Füge alle Schlüssel/Werte neu ein Beispiel: X = {5, 10, 11, 22}, h x = x mod 4, h x = 3x 1 mod 8 6

Kosten Rehash Ein Rehash ist teuer! Kosten (Zeit): Θ(m + n) : linear in der Anzahl eingefügten Elemente und der Länge der alten Hashtabelle typischerweise ist das einfach Θ(n) Wenn man es richtig macht, ist ein Rehash selten nötig. richtig heisst: gute Hashfunktion (z.b. aus einer universellen Klasse) gute Wahl der Tabellengrössen: bei jedem Rehash sollte die Tabellengrösse etwa verdoppelt werden alte Grösse m neue Grösse 2m Verdoppeln ergibt immer noch durchschnittlich konstante Zeit pro Hashtabellen-Operation amortisierte Analyse (werden wir gleich anschauen ) 7

Kosten Rehash Analyse Verdoppelungsstrategie Wir machen ein paar vereinfachende Annahmen: Bis zu Load α 0 (z.b. α 0 = 1 Τ2) kosten alle Hashtabellen-Operationen c Bei Load α 0 wird die Tabellengrösse verdoppelt: Alte Grösse m, neue Grösse 2m, Kosten c m Am Anfang hat die Tabelle Grösse m 0 O(1) Die Tabelle wird nie verkleinert Wie gross sind die Kosten für das Rehashing, verglichen mit den Gesamtkosten für alle anderen Operationen? 8

Kosten Rehash Gesamtkosten Wir nehmen an, dass die Tabellengrösse m = m 0 2 k für k 1 ist d.h., bis jetzt haben wir k 1 Rehash-Schritte gemacht Bemerkung: Bei k = 0 sind die Rehash-Kosten 0. Die Gesamt-Rehash-Kosten sind dann k 1 c m 0 2 i = c m 0 2 k 1 c m i=0 Gesamt-Kosten für die übrigen Operationen Beim Rehash von Grösse mτ 2 auf m waren α 0 Anzahl Hashtabellen-Operationen (ohne Rehash) α 0 2 m mτ 2 Einträge in der Tabelle 9

Kosten Rehash Die Gesamt-Rehash-Kosten sind dann k 1 c m 0 2 i = c m 0 2 k 1 c m i=0 Anzahl Hashtabellen-Operationen #OP α 0 2 m Durchschnittskosten pro Operation #OP c + Rehash_Kosten #OP c + 2c α 0 O(1) Im Durschnitt sind die Kosten pro Operation konstant auch für worst-case Eingaben (solange die Annahmen zutreffen) Durschnittskosten pro Operation = amortisierte Kosten der Operation 10

Amortisierte Analyse Algorithmenanalyse bisher: worst case, best case, average case Jetzt zusätzlich amortized worst case: n Operationen o 1,, o n auf einer Datenstruktur, t i : Kosten von o i Kosten können sehr unterschiedlich sein (z.b. t i [1, c i]) Amortisierte Kosten pro Operation T n, wobei T = t i i=1 Amortisierte Kosten: Durchschnittskosten pro Operation bei einer worst-case Ausführung amortized worst case average case!! Mehr dazu in der Algorithmentheorie-Vorlesung (und evtl. später) n 11

Amortisierte Analyse Rehash Falls man immer nur vergrössert und davon ausgeht, dass bei kleinem Load, Hashtabellenop. O 1 Kosten haben, sind die amortisierten Kosten pro Operation O(1). Analyse funktioniert auch bei zufälliger Hashfunktion aus universeller Familie (mit hoher Wahrscheinlichkeit) dann haben Hashtabellen-Op. bei kleinem Load mit hoher Wahrscheinlichkeit amortisierte Kosten O(1) Die Analyse lässt sich auch auf Rehashs zum Verkleinern erweitern In einer ähnlichen Art kann man aus fixed-size Arrays dynamische Arrays bauen Alle Arrayoperationen haben dann O(1) amortisierte Laufzeit Vergrössern/verkleinern erlaubt der ADT nur in 1-Elem.-Schritten am Ende! Werden wir vielleicht noch genauer anschauen... 12

Cuckoo Hashing Idee Hashing Zusammenfassung: effiziente Dictionary-Datenstruktur Operationen brauchen im Erwartungswert (meistens) O 1 Zeit Bei Hashing mit Chaining hat insert immer O 1 Laufzeit Können wir auch bei find O(1) Laufzeit garantieren? wenn gleichzeitig insert nur noch im Erwartungswert O 1 ist Cuckoo Hashing Idee: Offene Adressierung an jeder Position der Tabelle hat es nur für ein Element Platz Zwei Hashfunktionen h 1 und h 2 Ein Schlüssel x wird immer bei h 1 (x) oder h 2 (x) gespeichert Falls beim Einfügen beide Stellen schon besetzt sind, müssen wir umorganisieren 13

Cuckoo Hashing Enfügen eines Schlüssels x: x wird immer an der Stelle h 1 x eingefügt Falls schon ein anderer Schlüssel y an der Stelle h 1 (x) ist: Werfe y da raus (daher der Name: Cuckoo Hashing) y muss an seiner alternativen Stelle eingefügt werden (falls es bei h 1 (y) war, an Stelle h 2 (y), sonst an Stelle h 1 (y)) falls da auch schon ein Element z ist, werfe z raus und platziere es an seiner Alternativposition und so weiter Find / Delete: Falls x in der Tabelle ist, ist s an Stelle h 1 (x) oder h 2 (x) bei Delete: Markiere Zelle als leer! beide Operationen immer O(1) Zeit! 14

Cuckoo Hashing Beispiel Tabellengrösse m = 5 Hashfunktionen h 1 x = x mod 5, h 2 x = 2x 1 mod 5 Füge Schlüssel 17, 28, 7, 10, 20 ein: 15

Cuckoo Hashing : Zyklen Beim Einfügen kann es zu einem Zyklus kommen x wirft y 1 raus y 1 wirft y 2 raus y 2 wirft y 3 raus y l 1 wirft y l raus y l wirft x raus Dann wird noch der alternative Platz für x ausprobiert, aber da kann das Gleiche auch wieder passieren Tritt insbesondere auf, falls h 1 y i = h 2 (y i ) In dem Fall wählt man neue Hash-Funktionen und macht einen Rehash (normalerweise mit grösserer Tabelle) 16

Cuckoo Hashing : Hashfunktionen Wie wählt man die zwei Hashfunktionen? Sie sollten möglichst unabhängig sein Wenige Schlüssel x, für welche h 1 x = h 2 (x) Eine gute Möglichkeit: Zwei unabhängige, zufällige Funktionen einer universellen Menge Dann kann man zeigen, dass Zyklen nur sehr selten vorkommen, solange n m/2 Sobald die Tabelle halbvoll ist (n m/2) sollte man daher einen Rehash machen und zu einer doppelt so grossen Tabelle wechseln 17

Cuckoo Hashing : Laufzeit Find / Delete: Hat immer Laufzeit O 1 Man muss nur die zwei Stellen h 1 (x) und h 2 (x) anschauen Das ist der grosse Vorteil von Cuckoo Hashing Insert: Man kann zeigen, dass das im Durchschnitt auch Zeit O 1 braucht Falls man die Tabelle nicht mehr als zur Hälfte füllt Verdoppeln der Tabellengrösse bei Rehash ergibt konstante durchschnittliche Laufzeit für alle Operationen! 18

Hashing in Python Hashtabellen (Dictionary): https://docs.python.org/2/library/stdtypes.html#mapping-types-dict neue Tabelle generieren: table = {} (key,value)-paar einfügen: table.update({key : value}) Suchen nach key: key in table table.get(key) table.get(key, default_value) Löschen von key: del table[key] table.pop(key, default_value) 19

Hashing in Java Java-Klasse HashMap: Neue Hashtab. erzeugen (Schlüssel vom Typ K, Werte vom Typ V) HashMap<K,V> table = new HashMap<K,V>(); Einfügen von (key,value)-paar (key vom Typ K, value vom Typ V) table.put(key, value) Suchen nach key table.get(key) table.containskey(key) Löschen von key table.remove(key) Ähnliche Klasse HashSet: verwaltet nur Menge von Schlüsseln 20

Hashing in C++ Es gibt nicht eine Standard-Klasse hash_map: Sollte bei fast allen C++-Compilern vorhanden sein http://www.sgi.com/tech/stl/hash_map.html unordered_map: Seit C++11 in Standard STL http://www.cplusplus.com/reference/unordered_map/unordered_map/ 21

Hashing in C++ C++-Klassen hash_map / unordered_ map: Neue Hashtab. erzeugen (Schlüssel vom Typ K, Werte vom Typ V) unordered_map<k,v> table; Einfügen von (key,value)-paar (key vom Typ K, value vom Typ V) table.insert(key, value) Suchen nach key table[key] oder table.at(key) table.count(key) > 0 Löschen von key table.erase(key) 22

Hashing in C++ Achtung Man kann eine hash_map / unordered_map in C++ wie ein Array benutzen die Array-Elemente sind die Schlüssel Aber: T[key] fügt den Schlüssel key ein, falls er noch nicht drin ist T.at(key) wirft eine Exception falls key nicht in der Map ist 23

Verteilte Hashtabellen Ziel: Ein verteilter Dictionary Verwalte (key, value)-paare in einem Netzwerk z.b. auf vielen Rechnern im Internet Jeder Rechner soll einen Teil der Daten speichern Daten sollen schnell zugreifbar sein (übl. Dictionary-Operationen) Da die Anzahl Rechner gross sein kann, soll jeder Rechner im Netzwerk nur wenige andere kennen müssen Eine Tabelle mit allen Rechnern ist nicht machbar Einen zentralen Server mit allen Informationen wollen wir auch nicht Typische Anwendung: Peer-to-Peer Netzwerke Wir schauen uns eine von vielen ähnlichen Lösungen an im Wesentlichen Chord 24

Verteilte Speicherung der Daten Hashfunktion: h: S [0, 1] verstehe Intervall 0,1 als Einheitskreis Jeder Schlüssel wird auf den Einheitskreis gemappt 1 0 Jeder Knoten u wählt einen zufälligen Wert l u 0, 1 (einen zufälligen Pkt. auf dem Einheitskreis) Ein Knoten u speichert die Daten zu den Schlüsseln zwischen u und seinem Nachfolger v auf dem Kreis 25

Suchen nach einem Schlüssel Idee: Suche ist einfach, falls u eine Tabelle mit den Adressen und Bereichen von allen Knoten zur Verfügung hat suche nach x mit h x = 0. 62 u l u = 0.89 1 0 u will aber nur wenige Adressen von anderen Knoten verwalten x 26

Suchen nach einem Schlüssel Idee: benutze binäre Suche! suche nach x mit h x = 0. 62 u l u = 0.89 1 0 x 27

Topologie Jeder Knoten u hat eine direkte Verbindung zu den direkten Nachfolgern 1 0 Und zu den Nachfolger- Knoten der Werte l u + 2 i (i = 1,, log n) n: Anz. Knoten Jeder Knoten hat direkte Verbindungen zu O log n anderen Knoten 28

Suchzeit Man kann in dem Netzwerk in O(log n) Zeit suchen: 1 0 Zeit = #besuchte Knoten Man kann in jedem Schritt im Wesentlichen in die Mitte zwischen der aktuellen Position und dem Schlüssel x springen! 29

Zusammenfassung: Verteilte Hashtabelle Man geht davon aus, dass prinzipiell jeder mit jedem kommunizieren kann Ist im Internet der Fall, IP-Adresse genügt, um Nachricht zu schicken Der durch die direkten Verbindungen induzierte Graph heisst auch Overlay Netzwerk Im Overlay Netzwerk hat jeder O(log n) Nachbarn Man kann den Algorithmus so implementieren, dass alle wichtigen Operationen O log n Laufzeit haben Einfügen / löschen / suchen eines Schlüssels (Operation wird jeweils von irgend einem Knoten ausgeführt) Einfügen / löschen eines Knotens 30

Zusätzliche Dictionary Operationen Dictionary: Zusätzliche mögliche Operationen: D.minimum() : gibt kleinsten key in der Datenstruktur zurück D.maximum() : gibt grössten key in der Datenstruktur zurück D.successor(key) : gibt nächstgrösseren key zurück D.predecessor(key) : gibt nächstkleineren key zurück D.getRange(k1, k2) : gibt alle Einträge mit Schlüsseln im Intervall [k1,k2] zurück 31

Binäre Suche Revisited Binäre Suche nach x in einem sortierten Array 2 3 4 6 9 12 15 16 17 18 19 20 24 27 29 16 6 20 3 12 18 27 2 4 9 15 17 19 24 29 32

Binäre Suchbäume Benutze den Suchbaum der binären Suche als Datenstruktur root 16 6 20 3 12 18 27 2 4 9 15 17 19 24 29 33

Binärer Suchbaum : Elemente TreeElement: parent key, data left right Implementierung: gleich wie bei den Listen-Elementen 34

Binäre Suchbäume Binäre Suchbäume müssen nicht immer so schön symmetrisch sein Quelle: [CLRS] 35