Universität zu Köln Institut für Informatik Dr. O. Schaudt A. van der Grinten Übung zu Parallele Algorithmen Blatt Nr. 4 Dieses Übungsblatt muss bis zum 12.04.2016, 15:30 abgegeben werden. Schreiben Sie Ihren Namen und Ihre Übungsgruppe oben auf die Abgabe! Aufgabe 1: Eulerkreise in Bäumen (25 Punkte) Sei G ein ungerichteter Baum mit n Knoten. Wir ersetzen jede Kante in G durch zwei entgegengesetzte gerichtete Kanten, um einen gerichteten Graphen G0 zu erhalten. (a) Zeigen Sie, dass G0 einen Eulerkreis besitzt. (3 Punkte) Angenommen, G0 ist folgendermaßen durch Adjanzenzlisten gegeben: Für jeden Knoten u haben wir ein Array Au (1), Au (2), . . ., das genau die Nachfolger von u enthält. Im folgenden möchten wir ein Verfahren konstruieren, dass einen Eulerkreis in G0 berechnet. Genauer konstruiert das Verfahren ein Array tournext, wobei tournext(u → v) für jede Kante u → v in G0 den Nachfolger von u → v im Eulerkreis angibt. Sei u → v eine Kante in G0 und k der Index, so dass Au (k) = v. Dann definieren wir next(u → v) als die Kante u → Au (k + 1), falls der Index k + 1 in Au existiert, bzw. ansonsten als u → Au (1). Für alle Kanten u → v in G0 setzen wir tournext(u → v) := next(v → u). (b) Wenden Sie das Verfahren auf den nachfolgenden Baum an und verifizieren Sie, dass Sie einen Eulerkreis erhalten. (6 Punkte) 2 1 4 6 5 7 3 (c) Zeigen Sie, dass das Verfahren einen Eulerkreis in einem beliebigen Baum berechnet. (8 Punkte) (d) Zeigen Sie, dass sich das Verfahren auf einer P-RAM mit O(n) Prozessoren in Zeit O(log n) implementieren lässt. (8 Punkte) Aufgabe 2: Tiefensuche in Bäumen (15 Punkte) Während es im sequentiellen Fall einfach ist, eine Tiefensuche durch einen Baum G (oder durch einen beliebigen Graphen) durchzuführen, um Informationen wie die Größe von Teilbäumen oder Preund Postorder-Nummerierungen von Knoten zu erhalten, stellt sich dieser Algorithmus als schwer parallelisierbar heraus. 1 Mithilfe eines Eulerkreises in G0 (siehe Aufgabe 1) lassen sich diese Informationen (im Fall von Bäumen) dennoch extrahieren. Sei r ein beliebiger Knoten in G. Wir wollen G in einen gewurzelten Baum mit Wurzel r transformieren. Genauer wollen wir für jeden Knoten v in G einen Knoten f ather(v) berechnen, der den Vater von v im Baum G mit Wurzel r angibt. (a) Konstruieren Sie einen Algorithmus, der die f ather-Funktion mit O(n) Prozessoren in Zeit O(log n) löst, wobei n die Anzahl der Knoten ist. (8 Punkte) (b) Entwickeln Sie ein Verfahren, dass die Anzahl der Elemente in jedem Teilbaum zählt. (7 Punkte) Hinweis: Berechnen Sie den Rang (= Distanz vom Anfang der Liste bis zu einem bestimmten Element) jeder Kante innerhalb des Eulerkreises und betrachten Sie für jede Kante u − v in G diejenige der beiden Kanten u → v bzw. v → u mit geringerem Rang. Wie sieht der durch diese Kanten erzeugte Graph aus? 2