Datenstrukturen und Algorithmen Christian Sohler FG Algorithmen & Komplexität 1 Ein Datenbank-Problem Problem: • Gegeben sind n Objekte O1,.., O n mit zugehörigen Schlüsseln s(O i ) 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 2 Ein Datenbank-Problem AVL-Bäume: • Ausgabe aller Elemente in O(n) • Suche, Minimum, Maximum, Nachfolger in O(log n) • Einfügen, Löschen in O(log n) Frage: • Kann man Einfügen, Löschen und Suchen in O(1) Zeit? 3 Hashing Felder mit direkter Adressierung • • • • Dynamische Menge aus Universum U={0,…,m-1} Keine zwei Elemente haben denselben Schlüssel Weitere Daten Feld T[0,…,m-1] Position in T entspricht Schlüssel aus U 0 nil Schlüssel 1 nil 2 2 nil Universum U 0 1 4 5 3 6 2 nil 5 7 6 7 nil Genutzte Schlüsselmenge 4 Hashing Operationen: DirectAddressSeach(T,k) 1. return T[k] DirectAddressInsert(T,x) 1. T[key[x]] ← x DirektAddressDelete(T,x) 1. T[key[x]] ← nil 5 Hashing Operationen: DirectAddressSeach(T,k) 1. return T[k] Laufzeit: O(1) DirectAddressInsert(T,x) 1. T[key[x]] ← x DirektAddressDelete(T,x) 1. T[key[x]] ← nil 6 Hashing Zusammenfassung (direkte Adressierung): • Einfügen, Löschen, Suche in O(1) Zeit • Speicherbedarf O(|U|) • Schlecht, wenn Universum groß ist (normal) Hashing • Reduktion des Speicherbedarfs auf O(n), wobei n die aktuell gespeicherte Anzahl Schlüssel ist • Gute durchschnittliche Laufzeit 7 Hashing Hashing • Hash Tabelle T[0,…,m-1] • Hash Funktion h: U → {0,1,…,m-1} • Speichere Element mit Schlüssel k in Adresse h(k) 0 nil 1 nil h(k 3 ) 2 nil h(k 6 ) Universum U k5 k3 k4 k2 k6 k1 nil h(k 2 )=h(k4 ) 7 nil 8 Genutzte Schlüsselmenge Hashing Hashing • Hash Tabelle T[0,…,m-1] • Hash Funktion h: U → {0,1,…,m-1} • Speichere Element mit Schlüssel k in Adresse h(k) 0 nil 1 nil h(k 3 ) 2 nil h(k 6 ) Universum U k5 k3 k4 k2 k6 k1 nil h(k 2 )=h(k4 ) 7 nil Genutzte Schlüsselmenge Kollision! 9 Hashing Hashing mit Verkettung • • • • Hash Tabelle T[0,…,m-1] Hash Funktion h: U → {0,1,…,m-1} Speichere Element mit Schlüssel k in Adresse h(k) 0 nil Löse Kollisionen mit Liste auf 1 nil k3 2 nil k6 Universum U k5 k3 k4 k2 k6 k1 nil k4 k2 7 nil 10 Genutzte Schlüsselmenge Hashing Operationen: ChainedHashInsert(T,x) 1. Füge x am Ende der Liste T[h(key[x])] ein ChainedHashSearch(T,k) 1. Suche nach Element mit Schlüssel k in Liste T[h(k)] ChainedHashDelete(T,x) 1. Lösche x aus der Liste T[h(key[x])] 11 Hashing Wie sieht eine gute Hash Funktion aus? • Elemente sollten „gleichmäßig“ verteilt werden • Guter Kandidat wäre z.B. eine zufällige Funktion (die natürlich nur einmal zufällig ausgewählt wird und dann fest ist) • Sobald h festliegt, gibt es immer schlechte Eingabe • Worst-Case Laufzeit O(n) Last Faktor α: • Durchschnittliche Länge einer Kollisionsliste, d.h. α=n/m 12 Hashing Idee: • Wähle h zufällig 13 Hashing Idee: Was bedeutet das? • Wähle h zufällig 14 Hashing Idee: • Wähle h zufällig Annahme (einfaches uniformes Hashing): • Jedes Element wird von h gleichhäufig (mit gleicher Wahrscheinlichkeit) auf jeden Eintrag 0,…,m-1 der Hash Tabelle abgebildet. Dies geschieht unabhängig davon, wohin die anderen Elemente abgebildet werden. Weitere Annahme: • h(k) kann in konstanter Zeit berechnet werden 15 Hashing Satz 24 In einer Hash Tabelle, deren Kollisionen mit Verkettung aufgelöst werden, benötigt eine nicht erfolgreiche Suche Θ(1+α) durchschnittliche Laufzeit unter der Annahme des einfachen uniformen Hashing. Satz 25 In einer Hash Tabelle, deren Kollisionen mit Verkettung aufgelöst werden, benötigt eine erfolgreiche Suche Θ(1+α) durchschnittliche Laufzeit unter der Annahme des einfachen uniformen Hashing. 16 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). Fragen: • Gibt es Hash Funktionen, die die Annahme einfaches uniformes Hashing erfüllen? 17 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). Fragen: Ja, z.B. eine zufällige Funktion von U nach {0,…,m-1} • Gibt es Hash Funktionen, die die Annahme einfaches uniformes Hashing erfüllen? 18 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). Fragen: • Gibt es Hash Funktionen, die die Annahme einfaches uniformes Hashing erfüllen? • Kann man diese effizient konstruieren und abspeichern? 19 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). |U| Fragen: Nein. Es gibt m Funktionen und somit benötigen wir mindestens |U|⋅log m Bits, um eine solche (zufällige)einfaches Funktion eindeutig Annahme zu kodieren. • Gibt es Hash Funktionen, die die uniformes Hashing erfüllen? • Kann man diese effizient konstruieren und abspeichern? 20 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). Fragen: • Gibt es Hash Funktionen, die die Annahme einfaches uniformes Hashing erfüllen? • Kann man diese effizient konstruieren und abspeichern? • Wie konstruiert man gute Hash Funktionen? 21 Hashing Interpretation: • Ist die Größe der Hashtabelle proportional zur Anzahl gespeicherter Elemente, dann ist die durchschnittliche Laufzeit O(1). Fragen: Man nimmt sich eine kleinere Klasse von Funktionen mit der Eigenschaft, dass eine zufällige Funktion aus dieser Annahme Klasseeinfaches sich ähnlich verhält wie eine zufällige Funktion von U nach {0,..,m-1}. • Gibt es Hash Funktionen, die die uniformes Hashing erfüllen? • Kann man diese effizient konstruieren und abspeichern? • Wie konstruiert man gute Hash Funktionen? 22 Wahrscheinlichkeiten Definition (Wahrscheinlichkeitsraum): Ein Wahrscheinlichkeitsraum S ist Menge von Elementarereignissen. Ein Elementarereignis kann als der Ausgang eines (Zufalls)experiments betrachtet werden. Beispiel: • • • • Münzwurf mit zwei unterscheidbaren Münzen Ergebnis eines Münzwurfs können wir als Zeichenkette der Länge 2 über {K,Z} (Kopf, Zahl) darstellen Wahrscheinlichkeitsraum ist S={KK,KZ,ZK,ZZ} Elementarereignisse sind also die möglichen Ausgänge des Münzwurfs 23 Wahrscheinlichkeiten Definition (Ereignis): Ein Ereignis ist eine Untermenge eines Wahrscheinlichkeitsraums. (Diese Definition ist etwas vereinfacht, aber für unsere Zwecke asureichend) Beispiel: • {KK, KZ, ZK} ist das Ereignis, dass bei unserem Münzwurf mindestens eine Münze Kopf zeigt 24 Wahrscheinlichkeiten Definition(Wahrscheinlichkeitsverteilung) Eine Wahrscheinlichkeitsverteilung Pr{} auf einem Wahrscheinlichkeitsraum S ist eine Abbildung der Ereignisse von S in die reellen Zahlen, die folgende Axiome erfüllt: 1. Pr{A} ≥ 0 für jedes Ereignis A 2. Pr{S}=1 3. Pr{A∪B} = Pr{A}+Pr{B} für alle Ereignisse A,B mit A∩B=∅ Pr{A} bezeichnet die Wahrscheinlichkeit von Ereignis A 25 Wahrscheinlichkeiten Beispiel: • Bei einem fairen Münzwurf haben wir Pr{A} = 1/4 für jedes Elementarereignis A∈{KK,KZ,ZK,ZZ} • Die Wahrscheinlichkeit für das Ereignis {KK,KZ,ZK} („mindestens eine Münze zeigt Kopf“) ist Pr{{KK,KZ,ZK}} = Pr{KK} + Pr{KZ} + Pr{ZK} = ¾ Bemerkung: Eine Verteilung, bei der jedes Elementarereignis aus S dieselbe Wahrscheinlichkeit hat, nennen wir auch Gleichverteilung über S. 26 Wahrscheinlichkeiten Das Quizmaster Problem: • • • • • 3 Türen Hinter einer Tür ist Hauptgewinn Hinter den anderen beiden Türen sind Nieten Kandidat wählt eine von 3 Türen Der Quizmaster hilft und öffnet eine der Türen, hinter denen eine Niete ist • Der Kandidat darf nun die Tür wechseln oder bei seiner bisherigen Auswahl bleiben • Was soll der Kandidat tun? 27 Wahrscheinlichkeiten Wahrscheinlichkeitsraum: • S={HNN,NHN, NNH} (H: Hauptgewinn, N Niete) Wahrscheinlichkeitsverteilung: • Pr{HNN}=Pr{NHN}= Pr{NNH} = 1/3 Kandidat wählt Tür 1: • Gewinnwahrscheinlichkeit: Pr{HNN}=1/3 • Andere Türen identisch 28 Wahrscheinlichkeiten Der Quizmaster öffnet eine Tür: • Bei Ereignis HNN ist es schlecht zu wechseln • Bei Ereignis NHN findet man nach dem Wechseln den Hauptgewinn, denn dann hat der Quizmaster Tür 3 geöffnet • Bei Ereignis NNH findet man nach dem Wechseln den Hauptgewinn, denn dann hat der Quizmaster Tür 2 geöffnet 29 Wahrscheinlichkeiten Der Quizmaster öffnet eine Tür: • Bei Ereignis HNN ist es schlecht zu wechseln • Bei Ereignis NHN findet man nach dem Wechseln den Hauptgewinn, denn dann hat der Quizmaster Tür 3 geöffnet • Bei Ereignis NNH findet man nach dem Wechseln den Hauptgewinn, denn dann hat der Quizmaster Tür 2 geöffnet Wechseln ist gute Strategie: • Der Kandidat gewinnt mit Wahrscheinlichkeit Pr{{NHN,NNH}}=2/3, wenn er die Tür wechselt 30 Wahrscheinlichkeiten Abhängigkeiten: • Was passiert, wenn man schon etwas über den Ausgang eines Zufallsexperiments weiß? Frage: • Jemand hat beobachtet, dass der Ausgang des Münzwurfs mit zwei Münzen mindestens einmal Kopf zeigt. Wie groß ist die Wahrscheinlichkeit für zweimal Kopf? 31 Wahrscheinlichkeiten Definition (bedingte Wahrscheinlichkeit): Die bedingte Wahrscheinlichkeit eines Ereignisses A unter der Voraussetzung, dass Ereignis B auftritt ist Pr{A | B} = Pr{A∩B} / Pr{B}, wenn Pr{B}≠0 ist. 32 Wahrscheinlichkeiten Beispiel: • Jemand beobachtet den Ausgang unseres Münzwurfexperiments und sagt uns, dass es mindestens einmal Zahl gibt • Was ist die Wahrscheinlichkeit für zweimal Zahl (Ereignis A) unter dieser Beobachtung (Ereignis B)? • Pr{A|B} = (1/4) /(3/4) =1/3 33 Wahrscheinlichkeiten Definition (Zufallsvariable) Eine Zufallsvariable X ist eine Funktion von einem Wahrscheinlichkeitsraum in die reellen Zahlen. Bemerkung: • Eine Zufallsvariable liefert uns zu jedem Ausgang eines Zufallsexperiments einen Wert 34 Wahrscheinlichkeiten Beispiel: • Wurf zweier Münzen • Sei X Zufallsvariable für die Anzahl Münzen, die Zahl zeigen • X(KK)=0, X(KZ)=1, X(ZK)=1, X(ZZ)=2 35 Wahrscheinlichkeiten Für Zufallsvariable X und reelle Zahl x können wir das Ereignis X=x definieren als {s∈S:X(s)=x}. Damit gilt: Pr{X=x} =Σ Pr{s} {s∈S:X(s)=x} Beispiel: • Was ist die Wahrscheinlichkeit, dass wir bei zwei Münzwürfen genau einen Kopf erhalten? • Pr{X=1} = Pr{KZ}+Pr{ZK} = ½ (bei derselben Definition von X wie auf der letzten Folie) 36 Wahrscheinlichkeiten Definition (Erwartungswert): • Der Erwartungwert einer Zufallsvariable ist definiert als E[X] = Σ x ⋅ Pr{X=x} x Interpretation: • Der Erwartungswert gibt den „durchschnittlichen“ Wert der Zufallsvariable an, wobei die Wahrscheinlichkeiten der Ereignisse berücksichtigt werden 37 Wahrscheinlichkeit Beispiel: • Erwartete Anzahl „Kopf“ bei 2 Münzwürfen • E[X] = 0 ⋅ Pr{X=0} + 1 ⋅ Pr{X=1} + 2 ⋅ Pr{X=2} =0+½+2⋅¼ =1 38 Wahrscheinlichkeiten Linearität des Erwartungswerts: • E[X + Y] = E[X] + E[Y] Bemerkung: • Eine der wichtigsten Formeln im Bereich randomisierte Algorithmen Anwendung: • Man kann komplizierte Zufallsvariable als Summe einfacher Zufallsvariablen schreiben und dann den Erwartungswert der einfachen Zufallsvariablen bestimmen 39 Wahrscheinlichkeiten Zusammenfassung: • Wahrscheinlichkeitsraum S aus Elementarereignissen • Ereignisse sind Untermengen von S • Wahrscheinlichkeitsverteilung gibt Wahrscheinlichkeiten von Ereignissen vor • Zufallsvariable ordnet Elementarereignissen einen Wert zu • Erwartungswert gibt „durchschnittlichen“ Wert einer Zufallsvariable an 40 Hashing Ausblick: • Entwurf spezieller Klassen von Funktionen, so dass eine zufällige Funktion aus einer solchen Klasse im Erwartungswert gut für beliebige Eingabe ist 41