8.2 Methodik: Accelerated Cascading 65
9.2.3 Optimaler Algorithmus
9 Aufbrechen von Symmetrien
9.2 Färbealgorithmen 73
74 9 Aufbrechen von Symmetrien Übungen zu diesem Kapitel
Zusammenfassung dieses Kapitels
9-22
I
Symmetriebrechung 9-22Symmetriebrechungbedeutet in der Parallelverarbeitung, eine Datenstruktur so vorzuverar- beiten, dassparallel verarbeitbare Teileentstehen. BeiArraysist dies in der Regel trivial (man nehme jedes zweite Element). Beiverketteten Listenerrechnet man3-Färbungen. Bei allgemeinen Graphenist Färben hingegensehr schwierig.
I
SatzMan kann einen Ring mitlog lognFarben inZeitO(1)undArbeitO(n)färben.
I
SatzMan kann einen Ring mit3Farben in ZeitO(log∗n)undArbeitO(nlog∗n)färben.
I
SatzMan kann einen Ring mit3Farben inZeitO(logn)undArbeitO(n)färben.
Übungen zu diesem Kapitel
Übung 9.1 Beweis der Korrektheit von ReduceColors, mittel Geben Sie einen detaillierten Beweis des Lemmas von Folie 9-12 an.
Tipps:Man führe einen Widerspruchsbeweis: Wären am Ende des Algorithmusc[i]undc[S[i]]gleich, so müssten sie auch schon vorher gleich gewesen sein.
Übung 9.2 Algorithmenanalyse, leicht
Professor Schlauhmayer hat sich eine Beschleunigung des schnellen optimalen 3-Färbealgorithmus von Seite 9.19 ausgedacht. Sein neuer Algorithmus lautet wie folgt:
1 ReduceColors()
2 ReduceColors()
3 Sortiere alle Knoten nach ihrer Farbe
4 fori←3to2dlog logne+4seq do
5 KnockOutColor(i)
Der Professor behauptet, dass dieser Algorithmus eine 3-Färbung in ZeitO(log logn)und ArbeitO(n) berechnet. Was stimmt hieran nicht? Begründen Sie Ihre Antwort.
Übung 9.3 Einen Kompaktifizierungsalgorithmus entwerfen, schwer
Ein Programm benutzt einen Memory-Heap zur Speicherung einer Datenstruktur. Der Memory-Heap besteht aus einem ArrayMvon Zellen, die von1bisnnummeriert sind. Jede Zelleienthält entweder den Wertleeroder sie enthält ein Tripel bestehend aus einer reellen ZahlRisowie zwei Zeigernpi
undqi. Die Zeigerpiundqienthalten die Nummer einer nichtleeren Memory-Zelle oder den Wert0. Sie sollen einen in ZeitO(logn)und ArbeitO(n)arbeitenden Algorithmus entwerfen, der den Me- mory-Heap kompaktifiziert. Dies bedeutet, dass nach Ablauf Ihres Algorithmus die nichtleeren Zellen am Anfang des Memory-Heaps stehen und die Werte und Pointer korrekt angepasst wurden. Dazu soll für jeden Indexieiner nichtleeren Zelle im alten Memory-Heap der Inhalt dieser Zelle an eine neue Stellei0kopiert werden und die Zeigerpiundqisollen zup0iundq0iverändert werden.
Hier ein Beispiel: Der Memory-Heap habe anfangs den Inhalt
Zellenummeri: 1 2 3 4 5 6
Ri: 5 π leer −3,2 leer 100
pi: 0 1 – 0 – 4
qi: 6 6 – 0 – 1
Dann könnte er nach der Kompaktifizierung folgenden Inhalt haben:
Zellenummeri: 1 2 3 4 5 6
Ri: 5 π −3,2 100 leer leer
pi: 0 1 0 3
qi: 4 4 0 1
Tipp:Sie dürfen Hilfsarrays verwenden. Führen Sie eine Präfixsumme über ein Array durch, der eine 1für jede nichtleere Zelle hat.
9 Aufbrechen von Symmetrien
Übungen zu diesem Kapitel 75
Übung 9.4 Färbungsalgorithmus implementieren, mittel
Implementieren Sie den schnellen parallelen Färbungsalgorithmus mit OpenMP. Zur Erinnerung: Bei Eingabe einer Liste mitnElementen produziert der Algorithmus zuerst eine Färbung mitnFarben.
Danach wird die Anzahl der Farben durch(log∗n)-faches Anwenden der MethodeReduceColorsauf eine konstante Anzahl von Farben verringert. Zum Abschluss wird mithilfe desKnockOutColorAl- gorithmus eine 3-Färbung berechnet.
76 10 List-Ranking-Algorithmen
10-1 10-1
Kapitel 10
List-Ranking-Algorithmen
1, 2, 3, . . .
10-2 10-2
Lernziele dieses Kapitels
1. Problematik des List-Rankings kennen und anwenden können
2. Einfachen optimalen List-Ranking Algorithmus kennen
Inhalte dieses Kapitels
10.1 Motivation 77
10.1.1 Ein Anwendungsbeispiel . . . 77 10.1.2 Das Ranking-Problem . . . 77
10.2 Einfaches Ranking 77
10.3 Optimales Ranking 78
10.3.1 Idee . . . 78 10.3.2 Ausklinken eines Elementes . . . 78 10.3.3 Unabhängige Mengen . . . 79 10.3.4 Algorithmus . . . 80
10.4 Accelerated-Cascading 81
10.4.1 Idee . . . 81 10.4.2 Algorithmus . . . 81
Übungen zu diesem Kapitel 82
Worum es heute geht
Worum es heute geht
Die verkettete Liste gehört unzweifelhaft zu den grundlegendsten Datenstrukturen der In- formatik. Man begegnet ihr in solidem, äußerst bodenständigem Code einer industriellen Oberflächenprogrammierung, in den tiefsten Eingeweiden des Betriebssystem innerhalb des guru-gehacktem Assemblercodes des Scheduler, aber auch in der hohen Theorie der reinen Lehre der funktionalen Typtheorie.
Eines der Wesensmerkmale einer Liste ist, dass ihre Elemente in einerReihenfolgestehen. Es gibt eben ein erstes Element, ein zweites, ein drittes und so weiter; und diese Reihenfolge ist im Allgmeinen äußerst wichtig. Nun die »einfache« Problemstellung: Gegeben eine Liste im Speicher, bestimme für jedes Element der Liste, das wievielte es ist (dies nennt man auch denRangdes Listenelements). Dieses Problem ist sequentiell sehr einfach mit einem Einzeiler zu lösen (etwa while(c){c.rank=i++; c=c.next;}). Jedoch ist diese Schleife
»sehr« sequentiell und man wird sich zum Parallelisieren etwas Neues ausdenken müssen.
Wenn man im Parallelen nicht mehr weiter weiß, dann helfen bekanntlich immer Präfixsum- me oder Pointer-Jumping. So auch hier: Eine Liste ist ja ein entarteter Baum und folglich kann man auf sie Pointer-Jumping anwenden. Damit lässt sich List-Ranking in ZeitO(logn) bewerkstelligen, jedoch mit einer Arbeit vonO(nlogn). Dies ist alles andere als optimal. In der heutigen Vorlesung soll es darum gehen, diese Arbeit zu »drücken«. Dazu kombinieren wir Pointer-Jumping und die Färbealgorithmen aus dem letzten Kapitel mittels Accelerated- Cascading.
Diese Kombination von Algorithmen ist schon eher komplex, obwohl es sich um »einfa- che« List-Ranking-Algorithmen handelt. Die Algorithmen sind auch schon ziemlich gut und schnell, aber eben nicht perfekt. Um auch noch das letzte Quäntchen Geschwindigkeit herauszupressen, müssen wir in nächsten Kapitel nochwesentlich tiefer in die Trickkiste greifen.
10 List-Ranking-Algorithmen
10.3 Motivation 77
10.1 Motivation
10.1.1 Ein Anwendungsbeispiel
10-4 Wiederholung: Das Produkt vieler Matrizen. 10-4
Problemstellung
Eingabe Verkette Liste der Längenvon(4×4)-Matrizen.
Ausgabe Produkt der Matrizen in der durch die Verkettung gegebenen Reihenfolge.
Lösungsidee 1
Berechne das Produkt durch Pointer-Jumping. Die Rechenzeit ist dabeiO(logn), die Arbeit istO(nlogn).
Lösungsidee 2
– Bestimmen für jede Matrix ihren Rang in der Liste.
– Schreibe jede Matrix in einen Array an die Stelle ihres Rangs.
– Bilde das Produkt der Elemente im Array (oder sogar Präfixsumme).
Falls wir den ersten Schritt in ZeitO(logn)und ArbeitO(n)hinbekommen, so auch die restlichen Schritte.