Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Randomisierte Algorithmen Präfix Suche und Konsistentes Hashing
Anzahl der ausgefüllten und eingesandten Fragebögen: 211
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)
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Telefonnummer.
Kapitel 6: Klassifizierung von Sortiertechniken
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) 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 (17 – Fibonacci-Heaps – Analyse) Tobias Lauer.
WS Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer.
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Internet facts 2008-II Graphiken zu dem Berichtsband AGOF e.V. September 2008.
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUTE University of Paderborn Algorithms and Complexity Algorithmen und Komplexität Teil 1: Grundlegende.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Differentielles Paar UIN rds gm UIN
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
AWA 2007 Natur und Umwelt Natürlich Leben
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
20:00.
Zusatzfolien zu B-Bäumen
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Eine Einführung in die CD-ROM
Einführung in die Programmierung
Dokumentation der Umfrage
Effiziente Algorithmen
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Syntaxanalyse Bottom-Up und LR(0)
Effiziente Algorithmen
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.
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
Symmetrische Blockchiffren DES – der Data Encryption Standard
Retuschen.ppt Die folgende Schau zeigt die Möglichkeiten, mit PhotoDraw Digitalbilder zu retuschieren. Vergleichen Sie jeweils zwei Bildpaare durch fleissiges.
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
1 Arbeitsgemeinschaft Biologische Psychiatrie Verordnungsgewohnheiten von Psychopharmaka Statuserhebung 2005 W.Günther G.Laux T.Messer N.Müller M.Schmauss.
Unternehmensbewertung Thomas Hering ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List of Figures Tabellenübersicht.
Folie Einzelauswertung der Gemeindedaten
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
Sehen, Hören, Schmecken: wenn uns unsere Sinne täuschen
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
 Präsentation transkript:

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Organisatorisches Test Sie dürfen wieder einen handbeschriebenen DIN A4 Zettel mitnehmen

Datenstrukturen Problem Operationen Gegeben sind n Objekte O ,.., O mit zugehörigen Schlüsseln s(O ) Operationen Suche(x); Ausgabe O mit Schlüssel s(O) =x; nil, falls kein Objekt mit Schlüssel x in Datenbank Einfügen(O); Einfügen von Objekt O in Datenbank Löschen(O); Löschen von Objekt O mit aus der Datenbank 1 n i

Datenstrukturen AVL-Bäume Balanzierte Binärbäume Suchen, Einfügen, Löschen, Min, Max, Nachfolger in O(log n) Zeit

Datenstrukturen Frage Gibt es effizientere Datenstruktur für das Datenbank Problem als AVL-Bäume?

Datenstrukturen Felder mit direkter Addressierung nil Schlüsselmenge aus Universum U={0,…,m-1} Keine zwei Elemente haben denselben Schlüssel Feld T[0,..,m-1] Position i in T ist für Schlüssel i reserviert Das zum Schlüssel gehörige Objekt Feld T nil 1 Universum U 2 7 1 3 2 5 4 6 Genutzte Schlüsselmenge 7

Datenstrukturen Operationen DirectAddressSearch(k) return T[k] DirectAddressInsert(x) T[key[x]]  x DirectAddressDelete(k) T[k]  nil

Datenstrukturen Operationen Laufzeiten: O(1) DirectAddressSearch(k) return T[k] DirectAddressInsert(x) T[key[x]]  x DirectAddressDelete(k) T[k]  nil

Datenstrukturen Zusammenfassung (direkte Addressierung) Einfügen, Löschen, Suchen in O(1) Min, Max O(|U|) Speicherbedarf O(|U|) Schlecht, wenn Universum groß ist (normaler Fall)

Datenstrukturen Hashing Eingabe Aufgabe Ziel: Speicherbedarf soll unabhängig von Universumsgröße sein Wollen nur die Suchzeit optimieren (Insert und Delete werden auch unter bestimmten Annahmen effizient sein) Eingabe n Schlüssel aus Universum U={0,..,m-1} Aufgabe Finde Datenstruktur mit O(n) Speicherbedarf, die Suche in O(1) Zeit erlaubt

Datenstrukturen Erste Idee Fasse Blöcke von r Elementen zusammen und bilde sie auf dieselbe Addresse ab Feld T 0-9 10-19 20-29 30-39 40-49 50-59 60-69

Datenstrukturen Erste Idee Beispiel Fasse Blöcke von r Elementen zusammen und bilde sie auf dieselbe Addresse ab Beispiel Schlüsselmenge aus Universum {0,..,69} 8, 13, 15, 30, 41, 56, 58 Feld T 0-9 10-19 20-29 30-39 40-49 50-59 60-69

Datenstrukturen Erste Idee Beispiel Problem Fasse Blöcke von r Elementen zusammen und bilde sie auf dieselbe Addresse ab Beispiel Schlüsselmenge aus Universum {0,..,69} 8, 13, 15, 30, 41, 56, 58 Problem 13, 15 und 56, 58 liegen im selben Bereich Feld T 0-9 10-19 20-29 30-39 40-49 50-59 60-69

Datenstrukturen Erste Idee Beispiel Problem Fasse Blöcke von r Elementen zusammen und bilde sie auf dieselbe Addresse ab Beispiel Schlüsselmenge aus Universum {0,..,69} 8, 13, 15, 30, 41, 56, 58 Problem 13, 15 und 56, 58 liegen im selben Bereich Auflösen durch Listen Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Laufzeit Insert(x) p  key[x]/r ListInsert(T[p],x) O(1) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

y ist Referenz auf das zu löschende Datenstrukturen y ist Referenz auf das zu löschende Listenelemente Delete(y) ListDelete(y) Laufzeit O(1) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Beispiel Blocksuche(k) p  k/r ListItem  head[T[p]] while ListItem nil and key[ListItem]k do ListItem  next[ListItem] return ListItem Beispiel Blocksuche(15) Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Worst-Case Wollen Suchzeit für festen Schlüssel k analysieren Worst-Case Alle Schlüssel aus demselben Block sind in Schlüsselmenge Suchzeit: O(min{r,n}) Ist r>n, so ist dies O(n) 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Worst-Case Diskussion Wollen Suchzeit für festen Schlüssel k analysieren Worst-Case Alle Schlüssel aus demselben Block sind in Schlüsselmenge Suchzeit: O(min{r,n}) Ist r>n, so ist dies O(n) Diskussion Ist das wirklich, was wir erwarten? Nein! Das eine sehr spezielle Eingabe Normalerweise, sollte das besser funktionieren 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m Durchschnittliche Suchzeit O(1+b) 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m Durchschnittliche Suchzeit O(1+b) Speicherplatz O(m/r) 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m Durchschnittliche Suchzeit O(1+b) Speicherplatz O(m/r) Setze r=m/n 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m Durchschnittliche Suchzeit O(1+b) Speicherplatz O(m/r) Setze r=m/n  O(1) Suchzeit und O(n) Speicher 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Analyse Average-Case Wollen Suchzeit für festen Schlüssel k analysieren Average-Case Durchschnittliche Laufzeit über alle möglichen Schlüsselmengen Durchschnittliche Länge b jeder Liste ist b = r∙n/m Durchschnittliche Suchzeit O(1+b) Speicherplatz O(m/r) Setze r=m/n  O(1) Suchzeit und O(n) Speicher 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Satz 40 Sei U={0,..,m-1} eine Grundmenge von Schlüsseln (Universum). Sei T ein Feld mit m/r Einträgen und jeder Eintrag von T entspreche einem Block von r Werten aus U. Dann gilt, dass die durchschnittliche Suchzeit nach einem beliebigen, aber festen Schlüssel k durch O(1+b) beschränkt ist, wobei b= r∙n/m und der Durchschnitt über alle n-elementigen Teilmengen von U gebildet wird.

Datenstrukturen Diskussion Beispiel Ist Durchschnitt das richtige Maß für eine Laufzeitanalyse? Durchschnitt  Durchschnitt (unsere Durchschnittsbildung nimmt an, dass jede Teilmenge gleichwahrscheinlich auftritt; dies ist vermutlich nicht realistisch) Beispiel Universum ist die Menge der long ints Schlüssel sind Kundennummern Häufig starten Kundennummern bei einem bestimmten Wert und steigen von dort an (z.B. 1 bis 5323) „Durchschnittsannahme“ nicht richtig

Datenstrukturen Problem Abhilfe Wir kennen die „typische“ Datenverteilung nicht Diese kann insbesondere von der Anwendung abhängen Um eine gute Vorhersage der Laufzeit zu machen, müssten wir bei der Durchschnittsbildung aber die typische Datenverteilung berücksichtigen Abhilfe Wir werden die Aufteilung zufällig machen

Datenstrukturen Hashing nil Universum U={0,..,m-1} Hash Tabelle T[0,..,t-1] Hash Funktion h: U  {0,..,t-1} Speichere Element mit Schlüssel k in h(k) Feld T nil 1 Universum U 2 h(k )=2 k 6 k k 9 10 7 k 1 k 5 k h(k )=5 2 k k k 3 6 3 4 k h(k )=h(k )=6 8 4 8 Genutzte Schlüsselmenge 7

Datenstrukturen Hashing nil Universum U={0,..,m-1} Hash Tabelle T[0,..,t-1] Hash Funktion h: U  {0,..,t-1} Speichere Element mit Schlüssel k in h(k) Feld T nil 1 Universum U 2 h(k )=2 k 6 k k 9 10 7 k 1 k 5 k h(k )=5 2 k k k 3 6 3 4 k h(k )=h(k )=6 Kollision! 8 4 8 Genutzte Schlüsselmenge 7

Datenstrukturen Hashing mit Verkettung nil k Universum U={0,..,m-1} Hash Tabelle T[0,..,t-1] Hash Funktion h: U  {0,..,t-1} Speichere Element mit Schlüssel k in h(k) Löse Kollisionen durch Listen auf (wie vorhin) Feld T nil 1 Universum U 2 k k 6 k k 9 10 7 k 1 k 5 k 2 k k k k 3 6 3 4 k k k 8 4 8 Genutzte Schlüsselmenge 7

Datenstrukturen Beispiel Wenn wir h: U{0,..,t-1} durch h(x) = x∙t/m definieren, so haben wir die auf Blockbildung basierende Datenstruktur (mit Blockgröße r=m/t) Dieses ist also ein Spezialfall des Hashing-Szenarios Die Hauptschwierigkeit beim Hashing ist die Frage, wie man h geschickt wählt Feld T 0-9 nil 8 10-19 13 15 20-29 30-39 30 40-49 41 50-59 56 58 60-69

Datenstrukturen Operationen Einfügen(k) Füge neuen Schlüssel k am Ende der Liste T[h(k)] ein Löschen(x) Lösche Element x aus Liste T[h(key[x])] Suche(k) Suche nach k in Liste T[h(k)]

Datenstrukturen Wie sieht eine gute Hashfunktion aus? Last Faktor a Benutzte Schlüssel sollten möglichst gleichmäßig auf Tabelle verteilt werden Guter Kandidat wäre eine zufällige Funktion (die natürlich nur einmal zu Beginn zufällig gewählt wird und dann fest ist) Sobald h festliegt, gibt es immer eine schlechte Eingabe für h mit Worst-Case Suchzeit O(n) bei n Elementen in der Datenstruktur Wir suchen aber für gegebene Schlüsselmenge eine gute Funktion h Last Faktor a Durchschnittliche Länge einer Kollisionsliste, d.h. a=n/t

Datenstrukturen Idee Wähle h zufällig (aus einer Menge von geeigneten Kandidaten H)

Datenstrukturen Idee Annahme(einfaches gleichverteiltes Hashing) Wähle h zufällig (aus einer Menge von geeigneten Kandidaten H) Annahme(einfaches gleichverteiltes Hashing) Jedes k aus U wird mit Wahrscheinlichkeit 1/t auf i{0,..,t-1} abgebildet Diese Wahrscheinlichkeit ist komplett unabhängig vom Bild aller anderen Elemente

Datenstrukturen Idee Annahme(einfaches gleichverteiltes Hashing) Wähle h zufällig (aus einer Menge von geeigneten Kandidaten H) Annahme(einfaches gleichverteiltes Hashing) Jedes k aus U wird mit Wahrscheinlichkeit 1/t auf i{0,..,t-1} abgebildet Diese Wahrscheinlichkeit ist komplett unabhängig vom Bild aller anderen Elemente Auswahlprozess für h Für jede kU würfele einen Wert w zwischen 0 und t-1 und setze h[k]=w H: Menge aller Funktionen von U nach {0,…,t-1}

Datenstrukturen Idee Annahme(einfaches gleichverteiltes Hashing) Wähle h zufällig (aus einer Menge von geeigneten Kandidaten H) Annahme(einfaches gleichverteiltes Hashing) Jedes k aus U wird mit Wahrscheinlichkeit 1/t auf i{0,..,t-1} abgebildet Diese Wahrscheinlichkeit ist komplett unabhängig vom Bild aller anderen Elemente Weitere Annahme h(k) kann in O(1) Zeit berechnet werden

Datenstrukturen Satz 41 Sei MU eine beliebige Teilmenge von n Schlüsseln und sei h eine Hashfunktion, die zufällig unter der Annahme des einfachen gleichverteilten Hashings ausgewählt wurde. Werden die Kollisionen die unter h auftreten durch Verkettung aufgelöst, so benötigt eine Suche nach Schlüssel kM eine durchschnittliche Laufzeit von O(1+a).

Datenstrukturen Satz 41 Beweis Sei MU eine beliebige Teilmenge von n Schlüsseln und sei h eine Hashfunktion, die zufällig unter der Annahme des einfachen gleichverteilten Hashings ausgewählt wurde. Werden die Kollisionen die unter h auftreten durch Verkettung aufgelöst, so benötigt eine Suche nach Schlüssel kM eine durchschnittliche Laufzeit von O(1+a). Beweis Jeder Schlüssel k wird unter der Annahme des einfachen gleichverteilten Hashings auf jede Position in T mit derselben Wahrscheinlichkeit abgebildet. Also ist die durchschnittliche Suchzeit nach k gerade die durchschnittliche Suchzeit bis zum Ende der t Listen. Die durchschnittliche Suchzeit bis Listenende ist aber O(1+a) (a ist durchschn. Listenlänge). Damit ergibt sich inklusive Berechnung von h(k) eine Suchzeit von O(1+a) .

Datenstrukturen Satz 42 nil k Sei MU eine beliebige Teilmenge von n Schlüsseln und sei h eine Hashfunktion, die zufällig unter der Annahme des einfachen gleichverteilten Hashings ausgewählt wurde. Werden die Kollisionen die unter h auftreten durch Verkettung aufgelöst, so benötigt eine Suche nach Schlüssel kM eine durchschnittliche Laufzeit von O(1+a). Dabei wird der Durchschnitt über die Auswahl von h und den Schlüssel kM gebildet. Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Satz 42 Schwierigkeit nil k Sei MU eine beliebige Teilmenge von n Schlüsseln und sei h eine Hashfunktion, die zufällig unter der Annahme des einfachen gleichverteilten Hashings ausgewählt wurde. Werden die Kollisionen die unter h auftreten durch Verkettung aufgelöst, so benötigt eine Suche nach Schlüssel kM eine durchschnittliche Laufzeit von O(1+a). Dabei wird der Durchschnitt über die Auswahl von h und den Schlüssel kM gebildet. Schwierigkeit Die Suchzeit hängt von Position des gesuchten Elements in Kollisionsliste ab Suchzeit hängt von Einfügereihenfolge und Implementierung ab Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen k k Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Situation vor Einfügen von i: i-1 Elemente eingefügt Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Situation vor Einfügen von i: i-1 Elemente eingefügt Durchschn. Listenlänge (i-1)/t Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Situation vor Einfügen von i: i-1 Elemente eingefügt Durchschn. Listenlänge (i-1)/t h(i) ist zufällig aus {0,..,t-1} Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Situation vor Einfügen von i: i-1 Elemente eingefügt Durchschn. Listenlänge (i-1)/t h(i) ist zufällig aus {0,..,t-1} Damit durchschn. Länge der Liste, in der i ist: 1+(i-1)/t Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Annahme: Einfügen am Ende der Listen Betrachte Elemente in Einfügereihenfolge Zunächst: Durchschn. Suchzeit für i-tes Element Situation vor Einfügen von i: i-1 Elemente eingefügt Durchschn. Listenlänge (i-1)/t h(i) ist zufällig aus {0,..,t-1} Damit durchschn. Länge der Liste, in der i ist: 1+(i-1)/t Durchschn. Suchzeit für i-tes Element: O(1+ (i-1)/t) Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Wir nehmen an, dass Einfügen immer am Ende der Listen durchgeführt wird. Betrachte nun die n Elemente in der Reihenfolge, in der sie in die Datenstruktur eingefügt wurden. Wir analysiere zunächst die durchschnittliche Laufzeit für die Suche des i-ten Elements. Betrachte dazu die Situation vor dem Einfügen dieses Elements. Dann sind bereits i-1 Elemente in der Datenstruktur und die durchschnittliche Listenlänge ist (i-1)/t. Sei nun k der Schlüssel des i-ten Elements. Es gilt, dass h(k ) zufällig aus {0,..t-1} gewählt wird nach Annahme des einfachen gleichverteilten Hashings. Damit ist die durchschnittliche Länge der Liste, die i enthält gerade 1+(i-1)/t. Somit ergibt sich eine durchschnittliche Suchzeit von O(1+ (i-1)/t). Feld T nil 1 2 k 6 i i k 3 k k 4 8 7

Datenstrukturen Beweis nil k Durchschnitt über alle n Elemente aus M: Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Durchschnitt über alle n Elemente aus M: Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Beweis nil k Wir berechnen den Durchschnitt über alle n Elemente aus M: Feld T nil 1 2 k 6 k 3 k k 4 8 7

Datenstrukturen Interpretation Frage Ist die Größe der Hash-Tabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschn. Suchzeit O(1) Frage Wie realistisch ist Annahme des einfachen gleichverteilten Hashing

Datenstrukturen Interpretation Frage Ist die Größe der Hash-Tabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschn. Suchzeit O(1) Frage Wie realistisch ist Annahme des einfachen gleichverteilten Hashing Die Menge H aller Funktionen von U nach {0,..,t-1} erfüllt Anforderung

Datenstrukturen Interpretation Frage Ist die Größe der Hash-Tabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschn. Suchzeit O(1) Frage Wie realistisch ist Annahme des einfachen gleichverteilten Hashing Die Menge H aller Funktionen von U nach {0,..,t-1} erfüllt Anforderung Kann man eine Funktion aus H effizient abspeichern?

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können Argument: - Man muss mindestens so viele unterschiedliche Bitstrings haben wie Funktionen in H - Die Anzahl unterschiedlicher Bitstrings der Länge k ist 2 k

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können Argument: - Man muss mindestens so viele unterschiedliche Bitstrings haben wie Funktionen in H - Die Anzahl unterschiedlicher Bitstrings der Länge k ist 2 Jedes Element von U kann auf t unterschiedliche Werte abgebildet werden k

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können Argument: - Man muss mindestens so viele unterschiedliche Bitstrings haben wie Funktionen in H - Die Anzahl unterschiedlicher Bitstrings der Länge k ist 2 Jedes Element von U kann auf t unterschiedliche Werte abgebildet werden Es gibt als t unterschiedliche Funktionen in H k |U|

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können Argument: - Man muss mindestens so viele unterschiedliche Bitstrings haben wie Funktionen in H - Die Anzahl unterschiedlicher Bitstrings der Länge k ist 2 Jedes Element von U kann auf t unterschiedliche Werte abgebildet werden Es gibt als t unterschiedliche Funktionen in H Wir benötigen also mindestens |U| log t Bits, um Funktionen aus H abspeichern zu können k |U|

Datenstrukturen Kann man eine Funktion aus H effizient abspeichern? Wenn es |H| unterschiedliche Funktionen gibt, dann benötigen wir mindestens log |H| viele Bits, um jede Funktion aus H beschreiben zu können Argument: - Man muss mindestens so viele unterschiedliche Bitstrings haben wie Funktionen in H - Die Anzahl unterschiedlicher Bitstrings der Länge k ist 2 Jedes Element von U kann auf t unterschiedliche Werte abgebildet werden Es gibt als t unterschiedliche Funktionen in H Wir benötigen also mindestens |U| log t Bits, um Funktionen aus H abspeichern zu können k |U|

Datenstrukturen Kurzes Fazit: Was ist eine gute Hashfunktion? Eine Funktion die eine gute Verteilung der Daten auf die Tabelle gewährleistet Problem: Wir kennen die Daten a priori nicht Oft kennen wir auch die Verteilung der Daten nicht Eine zufällige Funktion wäre gut, aber die können wir nicht speichern

Datenstrukturen Die Divisionsmethode Beispiel k wird abgebildet auf den Rest von k durch t Es gilt also h(k) = k mod t Beispiel t=12 und k=100 Dann gilt 8t+4 = 100 und somit h(100) = 4

Datenstrukturen Die Divisionsmethode k wird abgebildet auf den Rest von k durch t Es gilt also h(k) = k mod t Was sind gute Werte für m (ohne Beweis bzw. empirisch)? Ist m Zweierpotenz, dann „zählen“ nur die niedrigwertigen Bits (meistens schlecht) Gute Wert sind normalerweise Primzahlen, die nicht zu nah an Zweierpotenzen liegen