28. Bundeswettbewerb Informatik 2009/2010 Endrunde 5.–8.10.2010 Datenstrom-Algorithmen Gruppenarbeit 1. Tag In dieser Aufgabe betrachten wir Algorithmen, die auf Datenströmen operieren. Hierbei geht es darum, sehr große Mengen von Daten in nur einem Durchlauf und unter Verwendung von sehr wenig Speicherplatz zu verarbeiten. Solche Algorithmen haben vielfältige Anwendungen, zum Beispiel beim Netzwerk-Monitoring, zum frühzeitigen Erkennen von Denial-of-ServiceAttacken oder zur Online-Analyse von Telefonverbindungen, um rechtzeitig auf überlastete Leitungen reagieren zu können. Das diesem Bereich zu Grunde liegende Algorithmen-Modell ist wie folgt: Die Eingabe besteht aus einem Strom von Daten x1 , x2 , x3 , x4 , x5 , . . . , xn die nacheinander als Eingabewerte gelesen werden. Dabei stammt jeder der Werte x1 , x2 , . . . , xn aus einer Menge U = {1, . . . , m} von möglichen Werten. In der Regel ist der Datenstrom sehr lang, und m ist sehr groß. Zur Orientierung können Sie sich beispielsweise vorstellen, dass U die Menge aller möglichen IP-Adressen repräsentiert und dass der Datenstrom für jede Anfrage, die innerhalb eines Tages an eine Internet-Suchmaschine Ihrer Wahl gestellt wird, einen Eintrag mit der entsprechenden IP-Adresse enthält, von der aus die Anfrage gestartet wurde. Einem Datenstrom-Algorithmus steht nur sehr wenig Speicherplatz zur Verfügung, so dass es nicht möglich ist, die gesamte Eingabe auf einem Speichermedium abzulegen und danach wieder darauf zuzugreifen. Aufgabe 1: (a) Wir betrachten zunächst die Situation, bei der die Eingabe aus einem Datenstrom der Form x1 , x2 , . . . , xn−1 besteht, wobei n = m ist und x1 , . . . , xn−1 eine Liste von n−1 verschiedenen Zahlen aus U = {1, . . . , n} ist. Finden Sie einen Datenstrom-Algorithmus, der herausfindet, welche Zahl aus {1, . . . , n} nicht in dem Datenstrom vorkommt. Ihr Algorithmus darf dabei nur Speicherplatz der Größe O(log2 n) verwenden. Können Sie auch einen Algorithmus finden, der mit weniger als log2 n Speicherbits auskommt? 1 (b) Finden Sie einen Datenstrom-Algorithmus, der die Variante des obigen Problems löst, bei der die Eingabe ein Datenstrom der Länge n−2 ist, in dem x1 , . . . , xn−2 aus n−2 verschiedenen Zahlen aus U besteht, und bei dem die beiden fehlenden Zahlen aus U ermittelt werden sollen, die nicht im Datenstrom vorkommen. Ihr Algorithmus sollte mit O(2 log2 n) Speicherbits auskommen. Können Sie auch eine Lösung für das allgemeinere Problem finden, bei dem für eine beliebige Zahl k der Datenstrom aus n − k verschiedenen Elementen x1 , . . . , xn−k besteht, und bei dem die k fehlenden Zahlen aus U ermittelt werden sollen? In den folgenden Aufgaben ist m wieder beliebig vorgegeben, und die Eingabe besteht aus einem Datenstrom x1 , x2 , . . . , xn dessen einzelne Elemente alle zur Menge U = {1, . . . , m} gehören. Aufgabe 2: Ziel ist jetzt, zu einem gegebenen Schwellwert s mit 0 < s < 1 eine Menge M von Eingabeelementen zu ermitteln, die diejenigen Elemente aus U enthält, die mindestens s·n mal im Datenstrom vorkommen. (Die Menge M darf aber durchaus auch einige Elemente enthalten, die weniger häufig im Datenstrom vorkommen.) Finden Sie einen Datenstrom-Algorithmus, der dieses Problem löst und dabei nur Speicherplatz der Größe O( 1s · log2 m · log2 n) Bits benötigt. Können Sie auch eine untere Schranke angeben, d.h. einen Wert w (der von s, m, n abhängt), so dass es keinen Datenstrom-Algorithmus gibt, der dieses Problem löst und dabei höchstens Speicherplatz der Größe w Bits benutzt? Aufgabe 3: Als nächstes sollen randomisierte Algorithmen1 entwickelt werden, die zufällige Stichproben von Elementen des Eingabe-Datenstroms erstellen. (a) Zunächst ist ein Datenstrom-Algorithmus gesucht, der eine Variable z enthält, so dass für jeden Zeitpunkt t gilt: Nach Verarbeiten des t-ten Elements des Datenstroms (d.h. nach Verarbeiten von xt ) enthält die Variable z genau ein Tupel (x j , j) aus der Menge {(x1 , 1), (x2 , 2), . . . , (xt ,t)} , und jedes j ∈ {1, . . . ,t} wird dabei mit der gleichen Wahrscheinlichkeit gewählt (nämlich mit der Wahrscheinlichkeit 1/t). D.h.: Ihr Algorithmus soll zufällig ein Element aus der Menge {(x1 , 1), (x2 , 2), . . . , (xt ,t)} auswählen. Mit “zufällig” ist gemeint: Wenn Sie Ihren Algorithmus sehr oft – sagen wir, K mal, wobei K eine sehr große Zahl ist – mit derselben Eingabe starten, dann ist für jedes einzelne (x j , j) aus {(x1 , 1), (x2 , 2), . . . , (xt ,t)} die Variable z zum Zeitpunkt t bei etwa K/t Läufen Ihres Algorithmus mit dem Wert (x j , j) belegt. Ihr Algorithmus sollte mit Speicherplatz der Größe O(log2 m + log2 n) Bits auskommen. 1 D.h., Ihre Algorithmen dürfen einen Zufallsgenerator benutzen. 2 (b) Sei nun s eine beliebige natürliche Zahl > 1. Verallgemeinern Sie Ihren Algorithmus aus (a) zu einem Algorithmus, bei dem für jeden Zeitpunkt t > s gilt: Nach Verarbeiten des t-ten Elements des Datenstroms enthält die Variable z eine s-elementige Menge X ⊆ {(x1 , 1), (x2 , 2), . . . , (xt ,t)} , und jede s-elementige Teilmenge von {(x1 , 1), (x2 , 2), . . . , (xt ,t)} kommt dabei mit der gleit 2 chen Wahrscheinlichkeit vor (nämlich der Wahrscheinlichkeit 1/ s ). Ihr Algorithmus sollte dabei mit Speicherplatz der Größe O(s · (log2 m + log2 n)) Bits auskommen. Weisen Sie jeweils nach, dass Ihre Algorithmen die gewünschten Eigenschaften besitzen. In der folgenden Aufgabe betrachten wir eine Anwendung des Algorithmus aus Aufgabe 3, in der es darum geht, eine Approximation an den Median der Eingabewerte x1 , x2 , . . . , xn zu bestimmen. Der Median ist hierbei ein Wert x j (für 1 6 j 6 n), so dass gilt: Werden die Werte x1 , x2 , . . . , xn aufsteigend sortiert, so ist x j der Wert, der in dieser Sortierung in der Mitte steht (d.h. an Posin tion n+1 2 , falls n ungerade ist, bzw. an Position 2 , falls n gerade ist). Allgemein wird die Position, an der ein Element x j in der sortierten Liste steht, als der Rang von x j bezeichnet. Aufgabe 4: Nutzen Sie den Algorithmus aus Aufgabe 3, um einen Datenstrom-Algorithmus zu entwickeln, der eine Approximation an den Median berechnet. Genauer gesagt: Es werden Zahlen ε und δ mit 0 6 ε 6 1 und 0 6 δ 6 1 vorgegeben. Gesucht ist ein Datenstrom-Algorithmus, der nach Verarbeiten des Datenstroms x1 , x2 , . . . , xn ein Element x j ausgibt, dessen Rang mit Wahrscheinlichkeit > 1−δ zwischen 2n − ε·n und 2n + ε·n liegt. Hinweis: Es gibt einen Datenstrom-Algorithmus, der mit einem Speicher der Größe O((log2 m+ log2 n) · ε12 · log2 δ1 ) Bits auskommt. Aufgabe 5: Betrachten Sie die auf Seite 1 dieses Aufgabenblatts erwähnten sowie weitere interessante Anwendungsszenarien. Identifizieren Sie für jedes der Szenarien einige wichtige algorithmische Fragestellungen, diskutieren Sie, inwieweit Datenstrom-Algorithmen zur deren Lösung von Nutzen sein können, und geben Sie ggf. geeignete Datenstrom-Algorithmen an. t! Zahl st ist definiert als s!(t−s)! und gibt u. a. an, wie viele Teilmengen mit s Elementen es in einer Gesamtmenge mit t Elementen gibt. 2 Die 3