6.1 Broadcast, Summen, Präfixsummen

Problem 6.1.1 (MPC-Summe). Die Eingabe besteht aus einer Menge (bzw. Multimenge) von N natürlichen x1,,xN. Wir wollen die Summe x:=x1++xN berechnen; genauer gesagt wollen wir, dass am Ende der Berechnung jede Maschine genau einen Item hält: die Zahl x.

Theorem 6.1.2 Wenn jede Maschine S=Nϵ Speicher hat, dann können wir MPC-Summe in O(1/ϵ) Runden berechnen.

Beweis. Wir bauen einen S-ären gewurzelten Baum mit P Blättern. Jedes Blatt entspricht einer Maschine und somit der Menge der Items (hier: Zahlen), die diese am Anfang hält. Für S=4 sieht dies so aus:

In jeder Runde bildet Maschine i nun die Summe der Items, die sie hält, und schickt sie an den Eltern-Knoten weiter. Der Baum hat Höhe h=logS(P)logS(N)=λ=1ϵ. Nach h+1=1ϵ+1 Runden hat der Wurzelknoten die Gesamtsumme berechnet.

Übungsaufgabe 6.1.1 (Lästige Details). Im obigen Baum tun wir so, als hätten wir "unten" N/S viele Maschinen, die "voll" sind, also jeweils S Items halten, und weiter oben dann <N/S viele innere Knoten, die anfangs alle leer sind. Unsere Annahme war allerdings, dass die Items beliebig auf Maschinen verteilt sind.

  1. Können wir mit einem Initialisierungsschritt erreichen, dass keine Maschine "voll" ist, sondern höchstens 34S Items enthält?
  2. Können wir in einem weiteren Initialisierungsschritt erreichen, dass eine gewisse Anzahl von Maschinen, sagen wir die P/4 Maschinen mit höchstem Index, "leer" sind, also keine Items tragen?

Im folgenden wird es einfacher sein, anzunehmen, dass anfangs jede Maschine höchstens S/2 Items (oder generell höchstens cS Items) hält.

Übungsaufgabe 6.1.2 Erweitern Sie den Baum-Algorithmus aus dem Beweis von Theorem 6.1.2 so, dass er alle Präfixsummen berechnet. Hier müssen wir die Eingabe spezifizieren: ein Item ist ein Paar (i,xi); die Zahl i heißt der Index des Items und xi heißt der Wert des Items. Wir gehen davon aus, dass alle Items unterschiedliche Indizes halten. Ergebnis der Präfixsummenberechnung soll eine Menge von Items (i,yi) sein, mit

yi:=x1+x2++xi .

Überzeugen Sie sich, dass Ihr Algorithmus nicht nur für +, sondern für beliebige assoziative Operatoren funktioniert.

Ganz allgemein: wenn wir davon sprechen, dass die Eingabe ein Array ist, dass meinen wir eine Menge aus indizierten Items, also (i,xi) wie oben beschrieben.

Übungsaufgabe 6.1.3 Gegeben ein Array der Länge N mit Werten True und False, bestimme für jeden Index 1iN den Index des nächsten True-Eintrages zur Linken, also max{j | ji und xj=True}. Ihr Algorithmus sollte O(λ) Runden haben.

Mithilfe von Übungsaufgabe 6.1.3 können wir nun in einem Array, in welchem manche Einträge "markiert" sind das somit in Teilarrays zerlegt ist, für jeden Index die ihn umgebenden Markierungen finden und somit bestimmen, zu welchem Intervall er gehört und wo dieses anfängt und endet.