Ubungblatt 2 - Institut für Formale Methoden der Informatik

Werbung
Algorithmik
Funke/Eisner
SS 2013
Institut für Formale
Methoden der Informatik
Universität Stuttgart
http://www.fmi.informatik.uni-stuttgart.de/alg
Übungblatt 2
Abgabetermin: 14.Mai 2013; 12:00 Uhr
Problem 1 - Tschebyscheff Ungleichung (10 P.)
Sei X eine Zufallsvariable mit einem Erwartungswert µ und einer endlichen Varianz σ 2 . Dann gilt für alle reellen
Zahlen k > 0:
1
Pr(|X − µ| ≥ kσ) ≤ 2 .
k
Beweisen Sie diese Aussage.
Problem 2 - Dichtefunktion (10 P.)
In der Vorlesung wurde der Erwartungswert der Dichtefunktion des Minimalwertes von n unabhängigen Zufallsvariablen aus [0, 1] hergeleitet. Dieser beträgt
Z 1
E(X) =
xn(1 − x)n−1 ∂x.
0
Leiten Sie das unbestimmte Integral für den obigen Ausdruck her.
Geben Sie davon ausgehend den Wert für E(X) an.
Berechnen Sie außerdem die Varianz V (X).
Problem 3 - Kollisionen (10 P.)
Gegen sein eine universelle Hashfunktion h : U 7→ Zm , welche Elemente aus einem Schlüsseluniversum U gleichverteilt zufällig auf einen Tabellenindex [0, . . . , m − 1] abbildet. Für ein zufälliges u ∈ U und z ∈ Zm gilt also,
1
ist.
dass die Wahrscheinlichkeit P r(h(u) = z), dass h das Element u auf den Wert z abbildet, genau m
Hasht man nun k zufällig gewählte, paarweise verschiedene Elemente aus U in eine Hashmap, wird es selbst bei
sehr geringen Belegungsfaktoren Kollisionen geben.
Berechnen Sie die Wahrscheinlichkeit einer Kollision wenn die Hashtabellengröße m = 1000 ist und n ∈ {50, 100, 200}
Elemente eingefügt werden sollen.
Wie Groß ist die Kollisionswahrscheinlichkeit im allgemeinen Fall?
Mann kann die Wahrscheinlichkeit einer Kollision verringern, indem man mit einer zweiten universellen Hashfunktionen k : U 7→ Zm linear sondiert. D.h. sollte die erste Stelle der Hashtabelle an der Stelle h(u ∈ U) schon belegt
sein, so testet man auch noch die p Stellen (h(u) + i · k(u)) mod m für i = 1, . . . , p und gibt erst auf, wenn all
diese Positionen bereits belegt sind.
Wie hoch ist die Wahrscheinlichkeit dafür, bei m = 1000, n ∈ {50, 100, 200} und p = 3 eine Kollision zu erzeugen
(d.h. ein Element nicht einfügen zu können, weil alle seine 4 möglichen Plätze belegt sind)?
Wie Groß ist die Kollisionswahrscheinlichkeit im allgemeinen Fall?
Problem 4 - Hashing (10 P.)
Implementieren sie eine Hashtabellen Datenstruktur, welche mit offener Adressierung und zwei unabhängigen
Hashfunktionen arbeitet. Diese soll Strings hashen können und die Operationen insert(string S) und find(string
S) unterstützen. find(S) gibt dabei einen Verweis auf den Eintrag zurück, oder signalisiert das Nicht-Enthaltensein
von S in der Tabelle (z.B. mit einem Nullpointer oder dem Verweis auf ein “Ende”-Element).
Kollisionen sollen mit offener Adressierung vermieden werden. Aus den beiden Hashfunktionen h1 , h2 : String 7→ N
konstruiert man dazu eine Hashfunktionen H : String × N 7→ ZM mit M = |T | als Größe der Tabelle T und
H(S, i) = (h1 (S) + i · h2 (S)) mod M . H verwendet man dann zum Linearen Sondieren der korrekten Tabellen
Position.
Die Eingabeinstanz ist diesmal eine Datei dictionary.txt mit 125346 Wörtern und einem Wort pro Zeile. Diese
finden Sie in gepackter Form auf der Algorithmik Webseite.
Füllen Sie ihre Hashtabelle mit allen Wörtern aus dictionary.txt und suchen Sie danach alle Wörter einmal in
der Tabelle. Ihre Ausgabe soll aus folgenden Werten bestehen:
•
•
•
•
der Loadfaktor der Tabelle (125346/M )
die durchschnittliche Anzahl der Lookups, die die Tabelle benötigt um alle 125346 Wörter zu finden
der Median dieser Anzahl von Lookups
die Anzahl der Rebuilds, die Sie benötigt haben
Sowohl die Wahl von h1 , h2 als auch die Wahl eines neuen M steht Ihnen frei. Die Hashfunktionen sollten
unabhängig und universell sein. Experimentieren Sie mit der Neuwahl der M Werte beim rebuild. Eine Möglichkeit
ist z.B. in C/C++ mit der MD5 Implementierung von libopenssl zu arbeiten:
#include <openssl/md5.h>
unsigned int md5_hash1(const std::string& S) {
unsigned int result[MD5_DIGEST_LENGTH/4] = {0};
MD5((unsigned char*)&S[0], S.length(), (unsigned char*)result);
return result[0];
}
unsigned int md5_hash2(const std::string& S) {
unsigned int result[MD5_DIGEST_LENGTH/4] = {0};
MD5((unsigned char*)&S[0], S.length(), (unsigned char*)result);
return result[1];
}
Herunterladen