Datenstrukturen und Algorithmen
Christian Sohler
FG Algorithmen & Komplexität
2
Ein Datenbank-Problem
Problem:
• 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
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?
Hashing
Felder mit direkter Adressierung
• Dynamische Menge aus Universum U={0,…,m-1}
• Keine zwei Elemente haben denselben Schlüssel
• Feld T[0,…,m-1]
• Position in T entspricht Schlüssel aus U
Weitere Daten
4
Universum U 0
3 4
7 1
6 2 5
Genutzte Schlüsselmenge
nil nil
nil nil
nil
Schlüssel 0
1 2
7
2
5 6
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
6
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
Laufzeit:
O(1)
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
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)
8
Universum U
Genutzte Schlüsselmenge nil nil
nil
nil
nil 0 1 2
7
k k
k k
k
k3 1
2 6 4 5
h(k )
h(k )=h(k ) h(k )
3 6
2 4
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)
Universum U
nil nil
nil
nil 0 1 2
k
k k
k3 1
4 5
h(k )
h(k )=h(k h(k )
3 6
2 4)
10
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)
• Löse Kollisionen mit Liste auf
Universum U
Genutzte Schlüsselmenge nil nil
nil
nil
nil 0 1
k 2
7
k k
k k
k
k3 1
2 6 4 5
3 k 6
k 4 k2
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])]
12
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
Hashing
Idee:
• Wähle h zufällig
14
Hashing
Was bedeutet das?
Idee:
• Wähle h zufällig
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
16
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.
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?
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?
Ja, z.B. eine zufällige Funktion von U nach
{0,…,m-1}
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?
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?
Nein. Es gibt m Funktionen und somit benötigen wir mindestens
|U|⋅log m Bits, um eine solche (zufällige) Funktion eindeutig
zu kodieren.
|U|
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?
22
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?
Man nimmt sich eine kleinere Klasse von Funktionen mit der Eigenschaft, dass eine zufällige Funktion aus dieser
Klasse sich ähnlich verhält wie eine zufällige Funktion
von U nach {0,..,m-1}.
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
24
Wahrscheinlichkeiten
Definition (Ereignis):
Ein Ereignis ist eine Untermenge eines Wahrscheinlichkeits- raums. (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
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
26
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.
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?
28
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
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
30
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
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?
32
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.
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
34
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
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
36
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}
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)
{s∈S:X(s)=x}
Wahrscheinlichkeiten
Definition (Erwartungswert):
• Der Erwartungwert einer Zufallsvariable ist definiert als E[X] =
Σ
x ⋅ Pr{X=x}Interpretation:
• Der Erwartungswert gibt den „durchschnittlichen“ Wert der Zufallsvariable an, wobei die Wahrscheinlichkeiten der Ereignisse berücksichtigt werden
x
38
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
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
40
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
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