Seminar und Proseminar - WS 2007/ Perlen der Theoretischen Informatik. Friedhelm Meyer auf der Heide

Größe: px
Ab Seite anzeigen:

Download "Seminar und Proseminar - WS 2007/ Perlen der Theoretischen Informatik. Friedhelm Meyer auf der Heide"

Transkript

1 Seminar und Proseminar - WS 2007/ Perlen der Theoretischen Informatik Friedhelm Meyer auf der Heide

2 Kontakt Friedhelm Meyer auf der Heide Universität Paderborn Institut für Informatik und Heinz Nixdorf Institut Fürstenallee Paderborn

3 Vorwort In diesem Seminar/Proseminar soll anhand einer Reihe ausgewählter Aufsätze und Lehrbuch- Abschnitte die Schönheit von Problemlösungen aus dem Bereich der Theoretischen Informatik demonstriert werden und gezeigt werden, dass die Beschäftigung mit raffinierten Beweistechniken, eleganten Argumenten und überraschenden Konstruktionen höchst vergnüglich ist. Inspiriert wird dieses Seminar durch das Buch "Perlen der Theoretischen Informatik", BI Wissenschaftsverlag 1995, von Uwe Schöning (Unibibliothek 41TVA2403, 60TVA2411), in dem er eine Sammlung von Ergebnissen vorstellt, die seiner Meinung nach Highlights der Theoretischen Informatik darstellen. Natürlich wird die Themenauswahl unseres Seminars durch den Geschmack der Themensteller und ihrer Arbeitsgebiete geprägt sein. Aufbau des Seminars/Proseminars Ziel des Seminars ist die Aufbereitung aktueller Forschungsarbeiten. Zur Auswahl stehen die unten aufgeführten Arbeiten. Die Veranstaltung besteht aus einem Seminar und einem Proseminar, d.h. entweder erwirbt man einen Seminarschein oder einen Proseminarschein. Jedes Thema wird als Pärchen vergeben, das aus einem Proseminarvortrag und einem Seminarvortrag besteht. Der Proseminarvortrag stellt die Grundlagen für den dazugehörigen Seminarvortrag bereit.

4

5 Teilnehmerinnen und Teilnehmer des Seminars Thema: Cell to Cell Visibility in PVS Systemen Seminar: Andre Gärtner Betreuung: Ralf Petring Thema: Dynamische Hashingverfahren Seminar: Marco Müller Betreuung: Mario Mense Thema: Wegeberechnung für Roboter in 2D-Umgebungen Proseminar: Michael Kionka Seminar: Benjamin Eikel Betreuung: Matthias Fischer Thema: Geometrische Spanner Proseminar: Jasmin Kovac-Engelmeier Seminar: Philipp Wissneth Betreuung: Christiane Lammersen Thema: Clustering Proseminar: Holger Bürger Seminar: Markus Heberling Betreuung: Morteza Monemizahdeh Thema: Peer to Peer Netzwerke Proseminar: Andreas Vogelsang Seminar: Marc Borowski Betreuung: Peter Mahlmann Thema: Kinetische Datenstrukturen Proseminar: Peter Kling Seminar: Sabine Naewe Betreuung: Bastian Degener Thema: Dynamische Steinerbäume Proseminar: Linda Röhrkohl Seminar: Holger Hagedorn Betreuung: Jan Mehler Thema: Globale Sichtbarkeit in 3D Szenen Proseminar: Michael Kruse Seminar: David Schmelter Betreuung: Claudius Jähn

6

7 Inhaltsverzeichnis Teil I Proseminar Wegberechnung für Punktroboter mittels Trapezierung Michael Kionka Der Einsatz von Bereichsbäumen zur Beantwortung von orthogonalen Bereichsanfragen Jasmin Kovač-Engelmeier A Simple Linear Time (1+ε)-Approximation Algorithm for k-means Clustering in Any Dimensions für k = 2 Holger Bürger Skalierbare Peer-to-Peer-Netzwerke Andreas Vogelsang Eine Einführung in kinetische Datenstrukturen Peter Kling Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie Linda Röhrkohl Aspektgraphen und Verdeckung Michael Kruse Teil II Seminar Cell to Cell Visibility in PVS Systemen André Gärtner Hohe Verfügbarkeit in skalierbaren verteilten Hashingdateien mit Mirroring Marco Müller Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen in 2D-Umgebungen Benjamin Eikel

8 XII Inhaltsverzeichnis Konstruktion von geometrischen Spannern mit geringem Durchmesser Philipp Wissneth Ein einfacher, linearer (1+ɛ) - Approximationsalgorithmus für das k-means Clustering Problem Markus Heberling Peer-to-Peer Netzwerke: Skip-Graph Marc Borowski Kinetische Datenstrukturen für zweidimensionale Probleme Sabine Naewe Dynamische Steinerbäume Holger Hagedorn Approximationen und Alternativen für Aspektgraphen David Schmelter

9 Teil I Proseminar

10

11 Wegberechnung für Punktroboter mittels Trapezierung Michael Kionka Universität Paderborn Zusammenfassung. Das Wegberechnungsproblem für Roboter ist ein aktuelles Thema in der algorithmischen Geometrie und Robotik und hat über die Jahre bereits viel Beachtung in der Forschung erfahren. Mit dieser Ausarbeitung soll ein erster Einblick in das insgesamt sehr komplexe Thema gegeben werden. Untersuchungsgegenstand ist ein Punktroboter, der sich translatorisch in einer statischen, vorher bekannten 2D-Umgebung zwischen polygonen Hindernissen kollisionsfrei bewegen soll. Die vorgestellte Lösung beruht auf dem Verfahren der Trapezierung. Es wird gezeigt, dass für den Punktroboter Wegberechnungen zwischen zwei Positionen in O(n) Zeit, wobei n die Gesamtanzahl der Kanten der Hindernisse bezeichnet, möglich sind. Hierfür sind einmalige Vorberechnungen für den Raum nötig, die erwartete Zeit O(n log n) benötigen. 1 Einleitung Raumdefinitionen Trapezierung Grundlagen Algorithmus Wegberechnung initiale Berechnungen Pfadberechnung Zusammenfassung Bewertung Ausblick Literaturverzeichnis Einleitung Die Bedeutung von Robotern nimmt in der heutigen Zeit immer mehr zu. Neben den rein technischen bzw. mechanischen Anforderungen, stellen sich auch Anforderungen an die verwendete Steuerungslogik. Ein wesentlicher Punkt ist hierbei die Bewegungsplanung. Roboter müssen sich sicher bewegen können ohne durch Kollision mit anderen Objekten Schaden zu nehmen. Die Ausarbeitung setzt an diesem Punkt an. Die gestellten Fragen sind hierbei konkret: Existiert für den Roboter ein kollisionsfreier Weg zwischen zwei Punkten

12 4 Michael Kionka Falls ja, wie lautet dieser Weg Das hierfür betrachtete Szenario sieht wie folgt aus: Gegeben ist ein so genannter Punktroboter. Dies bedeutet, dass der Roboter keine Ausdehnung besitzt, sondern nur als Punkt dargestellt wird. Diese Einschränkung ist zwar nicht realistisch, dient aber dazu, die Betrachtung nicht unnötig kompliziert zu machen. Auf die grundlegenden Vorgehensweisen hat sie keinen Einfluss. Dieser Punktroboter kann sich nur translatorisch bewegen. Dies bedeutet, dass er sich nicht drehen kann bzw. seine Orientierung nicht ändern kann. Bei Punktrobotern ist die Unterscheidung der Bewegungsarten zunächst unerheblich für die Wegberechnung, sie ist aber von Bedeutung bei einer möglichen Erweiterung auf konvexe Roboter. Weiterhin ist ein 2-dimensionaler Raum gegeben. In ihm befinden sich disjunkte, polygone Hindernisse. Diese Hindernisse sind ausschließlich statisch und zu Beginn der Berechnungen bekannt. Die Umgebung des Roboters wird sich also im betrachteten Zeitraum nicht verändern. Die Aufgabe besteht nun darin, für den Punktroboter Wege zwischen beliebigen Punkten zu berechnen und auszugeben, falls diese Wege existieren. Der Fokus liegt hierbei ausschließlich auf dem Finden von existenten Wegen, nicht jedoch auf dem Angeben von kürzesten Wegen. In dieser Ausarbeitung wird angenommen, dass es für einen Roboter erlaubt ist, ein Hindernis zu berühren. Es ist aber sicherlich nicht verkehrt, allgemein ein zu nahes Vorbeifahren an einem Hindernis zu vermeiden, um mögliche Fehler in einer Robotersteuerung abzufangen. Um dieses zu Erreichen, könnte man zu Beginn alle Hindernisse minimal vergrößern. Die Berechnungen der vorgestellten Lösung lassen sich in zwei Teile aufteilen. Zunächst werden einige Vorberechnungen für den Raum stattfinden, die die eigentlichen Wegberechnungen vereinfachen sollen. Anschließend können, aufbauend auf den Ergebnissen, beliebig viele Weganfragen bearbeitet werden. Aus dieser grundsätzlichen Lösungstruktur ergibt sich, dass sie insbesondere dann sinnvoll ist, wenn die zu Beginn gegebene Raumumgebung für möglichst viele Anfragen bestehen bleibt. In diesem Fall lohnen sich die initialen Vorberechnungen. Diese Ausarbeitung orientiert sich dabei inhaltlich an den Kapiteln 6 und 13 in [1]. Die verwendeten Abbildungen sind ebenfalls an die dort verwendeten Abbildungen angelehnt. Bei dem Buch handelt es sich um eine Zusammenstellung verschiedener Themen der algorithmischen Geometrie. Die zu Grunde liegenden Arbeiten stammen von Mulmuley [2] und Seidel[3] im Bereich des Trapezierungs-Verfahrens. Die Ideen zur free space - Berechnung basieren auf den Arbeiten von Kedem et al.[4][5]. Im nächsten Kapitel werden zunächst einige grundlegende Begriffe geklärt. Hierbei wird die Einschränkung auf Punktroboter kurz aufgehoben, da einige wichtige Begriffe im Umfeld der Roboter-Wegberechnung nicht unerwähnt bleiben sollen, aber an Punktrobotern nicht sinnvoll erklärt werden können.

13 Wegberechnung für Punktroboter mittels Trapezierung 5 2 Raumdefinitionen Zunächst geht es darum, festzulegen, wie die Position des Roboters im Raum beschrieben werden kann und wie der Raum an sich dargestellt wird. Im Folgenden sei R der Roboter, der sich in seiner Umgebung, die wir work space nennen werden, bewegt. In dieser Umgebung befindet sich weiterhin eine Menge von Hindernissen H= {P 1,..., P t }. Um die aktuelle Position des Roboters beschreiben zu können, führen wir den Begriff des Referenzpunktes eines Roboters ein. Dies ist ein festgelegter Punkt, der sinnvoller-, aber nicht notwendigerweise, innerhalb des Roboterpolygons liegt. Wir beschreiben ihn mit R(x,y), wobei x und y die Koordinaten im 2 dimensionalen Raum darstellen. Der Referenzpunkt liegt für R(0,0) per Definition im Ursprung. Um nun die aktuelle Roboterposition darstellen zu können, geben wir für die momentane Position des Roboters, die derzeitigen Koordinaten seines Referenzpunktes an. Allgemein hängt die Anzahl der Parameter, die nötig sind, um die Platzierung eines Roboters im Raum eindeutig angeben zu können, von der Anzahl seiner Freiheitsgrade ab. In diesem Fall kann der Roboter sich in zwei Dimensionen translatorisch bewegen, daher ergibt sich die benötigte Anzahl von zwei Parametern. Würde sich der Roboter zum Beispiel im 3 dimensionalen Raum translatorisch bewegen können, so wären drei Parameter nötig. Allgemein wird pro Freiheitsgrad des Roboters ein weiterer Parameter benötigt. Im work space wird die tatsächliche Form des Roboters dargestellt. Da in dieser Ausarbeitung nur Punktroboter betrachtet werden, stellt dies hier kein Problem dar. Allgemein ist diese Darstellung für Berechnungen jedoch nicht sinnvoll. Für die Berechnungen definiert man daher als Repräsentation den sogenannten configuration space, kurz C(R), in dem der Roboter nur noch als Punkt (sein Referenzpunkt) dargestellt wird. Ein Punkt im configuration space entspricht also einer Platzierung des Roboters im work space und umgekehrt. Den configuration space müssen wir genauer definieren. Da wir in unserem Raum Hindernisse haben, sind nicht alle Positionierungen des Roboters im configuration space erlaubt. Genauer formuliert sind die Positionierungen nicht erlaubt, bei denen der Roboter ein Hindernis schneidet. Diese bezeichnen wir als forbidden (configuration) space, kurz, C forb (R, H). Den verbleibenden Raum, der gültige Positionierungen beschreibt, nennen wir free (configuration) space, kurz, C free (R, H). Bei Punktrobotern entsprechen sich der work space und der configuration space. 1 Weiterhin stellen die Hindernisse im work space genau den forbidden space des configuration space dar. Allgemein haben Roboter jedoch eine Ausdehnung, die im configuration space verloren geht. Um die reale Situation im allgemeinen Fall dennoch korrekt darzustellen, müssen somit die Hindernisse angepasst werden. Sie müssen entsprechend der Form des Roboters vergrößert werden. Veranschaulicht beschrieben ergeben sich die neuen Formen, indem man mit dem Referenzpunkt des Roboters die Kanten der Hindernisse entlang fährt und den dabei überstrichenen Bereich dem jeweiligen Hindernis als zusätzliche Ausdehnung zuordnet. Die so entstandenen vergrößerten Hindernisse bezeichnet man als configuration-space 1 unter der sinnvollen Annahme, dass der Referenzpunkt des Roboters dem Punkt des Roboters entspricht

14 6 Michael Kionka obstacle oder kurz C-obstacle. Abbildung 1 zeigt ein Beispiel hierfür. Auf die entsprechende Berechnung wird in der Ausarbeitung auf Grund des Fokus auf Punktroboter verzichtet. work space configuration space Referenzpunkt C obstacle Abb. 1. work space und configuration space 3 Trapezierung In diesem Kapitel soll eine Datenstruktur vorgestellt werden, die uns später helfen wird eine Repräsentation des free space zu erstellen. Bei dieser Datenstruktur handelt es sich um die sogenannte Trapezierung. Die Trapezierung des free space wird uns folgende Vorteile bieten. Zum einen werden wir den free space in kleinere, trapezförmige und damit konvexe Flächen aufgeteilt haben, in denen der Roboter sich sicher von einem beliebigen zu einem anderen beliebigen Punkt mit einer geradlinigen Bewegung bewegen kann, ohne gegen ein Hindernis zu stoßen. Zum anderen werden wir durch den Trapezierungs-Algorithmus eine Suchstruktur erzeugt bekommen, mit der wir leicht die Start- und Zielposition der Roboterbewegungen in der Repräsentation finden können. 3.1 Grundlagen Für eine Trapezierung gehen wir als Eingabe von einer Menge S von n sich nicht schneidenden Liniensegmenten aus, die eine Fläche in kleinere, polygone Flächen trennt. Bei uns wird diese Trennung später zwischen free space und forbidden space bestehen. Mittels der Trapezierung werden die polygonen Flächen dann in trapezförmige, konvexe Flächen aufgeteilt. Normallage In dieser Ausarbeitung werden zwei Vereinfachungen angenommen, die die Behandlung erleichtern. Eine Erweiterung auf den allgemeinen Fall kann in [1] in Kapitel 6.3 nachgelesen werden.

15 Wegberechnung für Punktroboter mittels Trapezierung 7 Zunächst wird um die Liniensegmente eine umgebene Hülle konstruiert, um die am Rand liegenden Flächen zu beschränken. Dies geschieht in Form eines achsen-parallelen Rechtecks, welches die gesamte betrachtete Fläche einschließt. Die zweite Einschränkung stellt sich schwerwiegender, weil weniger realistisch, dar. Es wird angenommen, dass keine zwei verschiedenen Endpunkte von Liniensegmenten die gleiche x-koordinate haben. Hieraus ergibt sich die wenig realistische Folgerung, dass es keine vertikalen Liniensegmente geben darf. Weiterhin ist es unwahrscheinlich, dass es allgemein keine Endpunkte von verschiedenen Segmenten gibt, die auf Grund einer eingeschränkten Genauigkeit, die gleiche x-koordinate besitzen. Zusammengefasst bezeichnen wir eine solche Menge S von n sich nicht schneidenden Liniensegmenten, die von einer umgebenen Hülle umschlossen sind und für die gilt, dass keine zwei verschiedenen Endpunkte die gleiche x-koordinate haben, als Menge von Liniensegmenten in Normallage. Struktur einer Trapezierung Die Trapezierung einer entsprechenden Eingabemenge entsteht, indem von den beiden Endpunkten eines jeden Liniensegmentes jeweils eine vertikale Linie nach oben und nach unten erzeugt wird, die bis zum Berührpunkt mit einem anderen Segment oder dem äußeren Rechteck verläuft. Diese Linien bezeichnen wir als obere bzw. untere vertikale Erweiterung des entsprechenden Endpunktes. Abbildung 2 zeigt beispielhaft eine solche Trapezierung. Abb. 2. Beispiel für eine Trapezierung Nicht-vertikale Seiten von so entstandenen Trapezen können nur aus Segmenten und den beiden horizontalen Seiten des äußeren Rechtecks bestehen. Wir bezeichnen das Segment bzw. die Seite des Rechtecks, die ein Trapez von oben bzw. unten begrenzt als top( ) bzw. bottom( ). Auf Grund der angenommenen Normallage können vertikale Seiten von Trapezen nur vertikale Erweiterungen von Segmentendpunkten oder eine der beiden vertikalen Ränder

16 8 Michael Kionka des Rechtecks sein. Insgesamt sind für die linke und die rechte Seite eines Trapezes jeweils fünf verschiedene Fälle möglich. Für die linke Seite sehen sie wie folgt aus: (1)Die linke Seite entartet zu einem Punkt, der der gemeinsame Endpunkt von top( ) und bottom( ) ist. (2)Es ist die untere vertikale Erweiterung des linken Endpunktes von top( ), die bis zum Berühren von bottom( ) verläuft. (3)Es ist die obere vertikale Erweiterung des linken Endpunktes von bottom( ), die bis zum Berühren von top( ) verläuft. (4)Es ist die obere und untere vertikale Erweiterung eines rechten Endpunktes eines weiteren Segmentes, bis sie top( ) bzw. bottom( ) berühren. (5)Es ist die linke Ecke des äußeren Rechtecks. Dieser Fall beschreibt die Situation für das am weitesten links liegende Trapez der Trapezierung. Die Fälle gelten entsprechend angepasst für die rechte Seite eines Trapezes. Die interessanten Fälle ((1)-(4)) sind in Abbildung 3 dargestellt. leftp(δ) leftp(δ) top(δ) top(δ) top(δ) top(δ) leftp(δ) bottom(δ) bottom(δ) leftp(δ) bottom(δ) bottom(δ) (1) (2) (3) (4) Abb. 3. Vier mögliche Entstehungen für die linke Seite eines Trapezes Wie man sieht, gilt für alle Trapeze, abgesehen vom am weitesten links liegenden, dass die linke Seite des Trapezes durch den linken Endpunkt von top( ) bzw. bottom( ) oder durch den rechten Endpunkt eines weiteren Segmentes definiert wird. Diesen Punkt bezeichnen wir im Folgenden mit lef tp( ). Für das am weitesten links liegende Trapez definieren wir, dass der Punkt lef tp( ) der unteren linken Ecke des Rechtecks entspricht. Entsprechende Definitionen gelten auch für die rechte Seite des Trapezes, wo der entsprechende Punkt mit rightp( ) bezeichnet wird. Für die spätere Verwendung soll bereits hier festgehalten werden, dass ein Trapez durch top( ), bottom( ), lef tp( ) und rightp( ) eindeutig festgelegt ist. Lemma 1. Die Anzahl der enthaltenen Trapeze in der Trapezierung T (S) für eine Menge S von n Liniensegmenten und damit die Komplexität der Trapezierung ist O(n). Beweis. Es folgt ein direkter Beweis mittels leftp( ). Jedes Trapez hat einen solchen Punkt leftp( ), wobei dieser der Endpunkt einer der n Segmente oder die linke, untere Ecke des umschließenden Rechtecks ist. Betrachtet man die vorgestellten fünf Fälle für die linke Seite eines Trapezes, so ergibt sich folgendes: Die linke untere Ecke des Rechtecks entspricht

17 Wegberechnung für Punktroboter mittels Trapezierung 9 lef tp( ) für genau ein Trapez. Ein rechter Endpunkt eines Segmentes entspricht lef tp( ) maximal für ein Trapez. Ein linker Endpunkt eines Segmentes entspricht lef tp( ) für maximal zwei Trapeze. (Ein Punkt in der Fläche kann die Rolle von leftp( ) für mehrere Trapeze spielen, da Endpunkte von Segmenten sich überdecken können. Wenn man Fall a) aber genauer betrachtet, so kann lef tp( ), angenommen als Endpunkt eines der Segmente, die Rolle leftp( ) nur für das über und das unter dem Segment liegende Trapez und damit für maximal zwei Trapeze annehmen.) Die Anzahl an Trapezen beträgt also maximal 3n Algorithmus Für die Berechnung einer Trapezierung gibt es verschiedene algorithmische Ansätze. Im Folgenden wird ein randomisierter inkrementeller Algorithmus in seiner grundsätzlichen Vorgehensweise beschrieben. Genauere Details hierzu finden sich in [1] in Kapitel 6.2. Für die Eingabe der Liniensegmente wird als Datenstruktur eine doppelt-verkettete Liste gewählt. Die Idee des Algorithmus ist es, zunächst von einem einzigen Trapez (dem umschließenden Rechteck) auszugehen und dann schrittweise durch Hinzufügen der einzelnen Segmente eine Trapezierung aufzubauen. Parallel hierzu wird eine Suchstruktur erzeugt, mit deren Hilfe für einen beliebigen Punkt q leicht ermittelt werden kann, in welchem Trapez er liegt. Der Aufbau dieser Datenstrukturen soll nun etwas genauer beschrieben werden: In der Trapezierungs-Datenstruktur werden Datensätze für alle Segmente und ihre Endpunkte gespeichert. Weiterhin gibt es Datensätze für die Trapeze, wobei diese nicht das Trapez an sich, sondern Verweise auf top( ), bottom( ), lef tp( ) und rightp( ) speichern. Wie oben beschrieben, reichen diese aus, um ein Trapez eindeutig zu definieren und damit, um mit ihnen die genauen Kanten und Ecken des Trapezes zu bestimmen. Dieses ist in konstanter Zeit möglich. Für die einzelnen Trapeze werden außerdem Verweise auf die rechten und linken Nachbartrapeze gespeichert, so dass die Trapeze insgesamt netzartig verbunden sind. Die Suchstruktur ist als Graph aufgebaut, der aus inneren Knoten und Blattknoten besteht. Für jedes Trapez gibt es genau einen diesem entsprechenden Blattknoten. Die inneren Knoten bestehen noch einmal aus zwei verschiedenen Knotentypen (x-knoten, y-knoten), die jeweils Entscheidungsknoten darstellen und genau zwei Ausgangskanten besitzen. Die x-knoten speichern jeweils Endpunkte von Segmenten, die y-knoten die Segmente an sich. Beim Durchlaufen des Graphen auf der Suche nach dem Trapez, in dem sich q befindet, stellen sich an den Entscheidungsknoten dann folgende Fragen, die über die anschließend gewählte Ausgangskante entscheiden: Beim x-knoten geht es darum, ob der Punkt q auf der rechten oder linken Seite einer durch den Segmentendpunkt, der im Knoten gespeichert ist, gezeichneten Linie liegt. Beim y-knoten entscheidet sich der weitere Weg dadurch, ob der Punkt q oberhalb oder unterhalb des im Knoten gespeicherten Segmentes liegt. Schließlich sind die Trapezierung und die Suchstruktur noch miteinander verlinkt. Die Verlinkung besteht in beidseitigen Verweisen vom Datensatz eines Trapezes in der einen Datenstruktur zum Datensatz des gleichen Trapezes in der anderen Datenstruktur. Der Algorithmus sieht formal wie folgt aus:

18 10 Michael Kionka Algorithmus 1 Trapezierung Eingabe: Menge S von n sich nicht schneidenden Liniensegmenten Ausgabe: Trapezierung T (S) und Suchstruktur D für T (S) 1: Bestimme ein Rechteck, in dem alle Liniensegmente von S liegen 2: Initialisiere Trapezierung T und Suchstruktur D 3: Bestimme eine zufällige Permutation s 1,..., s n der Elemente von S 4: for i = 1... n do 5: Finde 0, 1,..., k der Trapeze in T, die von s i geschnitten werden 6: Entferne 0, 1,..., k aus T und ersetze sie durch die durch die Einfügung von s i entstandenen Trapeze 7: Entferne die Blätter für 0, 1,..., k aus D, erzeuge neue Blätter für die neuen Trapeze und füge sie korrekt in D ein Die Korrektheit des Algorithmus erfolgt auf dieser Abstraktionsebene direkt aus seiner Schleifeninvariante, die wie folgt lautet: Sei S i definiert als S i := {s 1, s 2,..., s i }, wobei i die Schleifenvariable meint. Dann ist T eine korrekte Trapezierung für S i und D ist eine gültige Suchstruktur für T. Die Laufzeit werden wir erst später angeben, da sie sich direkt aus den folgenden Untersuchungen ergeben wird. Die am Ende erhaltene Trapezierung ist immer gleich, unabhängig von der in Schritt 3 erzeugten Permutation der Liniensegmente. Die Komplexität der Suchstruktur und die Laufzeit einer Suche auf dieser sind jedoch abhängig von der erzeugten Permutation der Segmente. Da der Algorithmus intern auch mit der Suchstruktur arbeitet (siehe [1], Seite 130), hängt auch seine Laufzeit von der Permutation ab. Im worst-case hat die Datenstruktur quadratische Größe und eine lineare Suchzeit 2. Allerdings gibt es auch Permutationen, bei denen sich deutlich bessere Werte ergeben. Interessant sind somit die erwartete 3 Komplexität, die erwartete Suchzeit und daraus folgend die erwartete Ausführungszeit des Algorithmus, die im Folgenden bestimmt werden sollen. Theorem 1. Berechne Algorithmus Trapezierung eine Trapezierung für eine Menge S von n Liniensegmenten in Normallage und eine zugehörige Suchstruktur. Die erwartete Laufzeit für eine Suchanfrage für einen beliebigen Punkt q beträgt dann O(log n). Beweis. Sei q der Punkt, für den eine Suchanfrage ausgeführt werden soll, beliebig aber fest. Die Ausführungszeit für eine solche Anfrage ist linear bezogen auf die Länge des zugehörigen Pfades im Suchgraphen. Die maximale Länge des Pfades entspricht der Tiefe von D. Da die Tiefe von D in jedem Iterationsschritt um maximal 3 zunimmt (siehe [1], Seite ), ist 3n eine obere Schranke für die Suchanfrage für q. Man betrachte nun aber die erwartete Suchzeit. Untersucht man den Suchpfad von q, so wurde jeder der Knoten auf diesem Pfad in einem Iterationsschritt des Algorithmus erzeugt. Bezeichne X i, 1 i n, die Anzahl an Knoten auf dem Pfad, die in Iterationsschritt i hinzugefügt wurden. Da S und q als fest angenommen sind, ist X i eine Zufallsvariable, welche 2 Begründung wird in den folgenden Beweisen gegeben 3 der Durchschnitt, der sich über alle n! möglichen Permutationen ergibt

19 Wegberechnung für Punktroboter mittels Trapezierung 11 nur von der zufälligen Einfügereihenfolge der Segmente abhängt. Die erwartete Pfadlänge kann nun wie folgt angegeben werden: E[ n X i ] = i=1 n E[X i ] Da in einem Iterationsschritt die Tiefe des Suchgraphen um maximal 3 zunimmt, wird auch der Suchpfad für q maximal um 3 länger, also gilt X i 3. Bezeichnet P i die Wahrscheinlichkeit, dass es einen in Iteration i erzeugten Knoten auf dem Suchpfad von q gibt, so folgt: E[X i ] 3P i Um P i nach oben zu beschränken, hilft folgende Beobachtung: Ein Knoten wurde genau dann in Iteration i zum Suchpfad von q hinzugefügt, wenn q (S i 1 ), das Trapez, welches q in T (S i 1 ) enthält, nicht das gleiche ist, wie q (S i ). Formal geschrieben: i=1 P i = P r[ q (S i ) q (S i 1 )] Wenn q (S i ) und q (S i 1 ) nicht identisch sind, muss q (S i ) in Iteration i entstanden sein. Alle Trapeze, die in Iteration i entstanden sind, grenzen an das in dieser Iteration eingefügte Segment s i ; entweder top( ) oder bottom( ) ist s i, oder leftp( ) oder rightp( ) sind ein Endpunkt von s i. Man betrachte nun eine beliebige, aber feste Menge S i S. Die Trapezierung T (S i ) und damit insbesondere q (S i ) ist allein als Funktion von S definiert. q (S i ) hängt also nicht von der Reihenfolge ab, in der die Segmente von S i eingefügt wurden. Um die Wahrscheinlichkeit, dass sich das q enthaltene Trapez durch Einfügen von s i geändert hat, nach oben zu beschränken, benutzt man die Technik der Rückwärtsanalyse: Betrachte T (S i ) und untersuche die Wahrscheinlichkeit, dass q (S i ) aus der Trapezierung verschwindet, wenn Segment s i entfernt wird. q (S i ) verschwindet nur genau dann aus der Trapezierung, wenn top( q (S i )), bottom( q (S i )), leftp( q (S i )) oder rightp( q (S i )) durch das Entfernen von s i verschwinden (siehe oben). Man untersuche jetzt die Wahrscheinlichkeit, dass top( q (S i )) verschwindet. Da alle Segmente von S i in zufälliger Reihenfolge eingefügt wurden, ist für jedes Element die Wahrscheinlichkeit gleich hoch s i zu sein. Also ist die Wahrscheinlichkeit, dass s i = top( q (S i )) gilt, 1/i. 4 Entsprechendes gilt für bottom( q (S i )). Es kann mehrere Segmente geben, die als Endpunkt den Punkt leftp( q (S i )) haben. Daher kann die Wahrscheinlichkeit, dass s i eines dieser Segmente ist, groß sein. Allerdings verschwindet leftp( q (S i )) nur, wenn s i das einzige Segment von S i ist, welches leftp( q (S i )) als Endpunkt besitzt. Dementsprechend ist auch für leftp( q (S i )) die Wahrscheinlichkeit maximal 1/i, dass er verschwindet. Gleiches gilt für rightp( q (S i )). Zusammenfassend ergibt sich somit: P i = P r[ q (S i ) q (S i 1 )] = P r[ q (S i ) / T (S i 1 )] 4/i Für die erwartete Laufzeit der Suchanfrage folgt abschließend: n E[ X i ] i=1 n 3P i i=1 n i=1 12 i = 12 n i=1 1 i = 12H n 4 Falls top( q(s i)) die obere Kante des äußeren Rechtecks ist, ist die Wahrscheinlichkeit 0.

20 12 Michael Kionka H n entspricht hierbei der n-ten Harmonischen Zahl, die wie folgt definiert ist: Für n > 1 gilt: H n := n ln n < H n < ln n + 1 Somit ergibt sich für eine Suchanfrage für einen beliebigen Punkt q die erwartete Laufzeit O(log n). Theorem 2. Berechne Algorithmus Trapezierung eine Trapezierung für eine Menge S von n Liniensegmenten in Normallage und eine zugehörige Suchstruktur. Die erwartete Größe der Suchstruktur D beträgt dann O(n). Beweis. Es genügt die Anzahl von Knoten in D anzugeben, um die Größe der Suchstruktur zu beschränken. Die Blätter von D gehören alle zu genau einem Trapez der Trapezierung und jedes Trapez besitzt genau ein Blatt in D, so dass die Anzahl der Blätter der Anzahl der Trapeze entspricht, welche durch O(n) beschränkt ist (siehe Lemma 1). Für die Gesamtzahl von Knoten ergibt sich somit: O(n) + n (Anzahl innerer Knoten, die in Iteration i erzeugt wurden) i=1 Sei k i die Anzahl an Trapezen, die in Iteration i neu erzeugt wurden. k i entspricht somit der Anzahl der neuen Blätter in D. Die Anzahl neuer innerer Knoten entspricht genau k i 1 (siehe [1], Seite ). Eine einfache obere Schranke für die worst-case Größe der Suchstruktur ergibt sich aus der Tatsache, dass offensichtlich nicht mehr Trapeze in Iteration i neu erzeugt werden können, als insgesamt in der Trapezierung T (S i ) vorhanden sind. Dies entspricht O(i). Somit folgt für die obere Schranke: O(n) + n O(i) = O(n 2 ) Aber nun zurück zum eigentlichen Beweis. Für die erwartete Größe gilt zunächst O(n) + E[ i=1 n (k i 1)] = O(n) + i=1 n E[k i ] Es muss also noch E[k i ] beschränkt werden. Man betrachte eine feste Menge S i S. Für ein Trapez T (S i ) und ein Segment s S i, sei { 1, falls aus T (Si ) verschwindet, wenn s aus S δ(, s) := i entfernt wurde 0, sonst Im Beweis zu Theorem 1 zeigte sich, dass es maximal 4 Segmente gibt, die zum Verschwinden eines Trapezes führen können. Es folgt also δ(, s) 4 T (S i ) = O(i) s S i T (S i ) i=1

21 Wegberechnung für Punktroboter mittels Trapezierung 13 Für k i gilt nun zusätzlich, dass es die Anzahl Trapeze in T (S i ) angibt, die verschwinden, wenn Segment s i entfernt wird. Da s i ein zufälliges Element aus S i ist, kann der Durchschnitt über alle s S i für E[k i ] herangezogen werden: E[k i ] = 1 i s S i T (S i ) δ(, s) O(i) i = O(1) Die erwartete Anzahl von neuen Trapezen in jeder Iteration des Algorithmus ist also O(1). Insgesamt folgt somit eine erwartete Größe der Suchstruktur von O(n). Es fehlt nun noch eine Laufzeitbeschränkung für den eigentlichen Algorithmus. Theorem 3. Algorithmus Trapezierung berechnet eine Trapezierung T (S) für eine Menge S von n Liniensegmenten in Normallage und eine Suchstruktur D für T (S) in O(n log n) erwarteter Zeit. Beweis. Die Permutation der Elemente von S benötigt O(n) Zeit (siehe [1], Kapitel 4, Seite 78). Für eine Ausführung des Schleifenrumpfes, was dem Einfügen eines Segmentes entspricht, ergibt sich Folgendes: Das Suchen der betroffenen Trapeze in Schritt 5 benötigt unter Zurhilfenahme der Suchstruktur von T (S i 1 ) O(log i) Zeit (siehe [1], Seite 130f.), wobei i den i-ten Schleifendurchlauf bzw. das i-te eingefügte Segment meint. Das Aktualisieren der Trapezierung und der Suchstruktur benötigt O(k i ) Zeit (siehe [1], Seite ). Mit der im Beweis zu Theorem 2 erhaltenen Grenze für k i ergibt sich somit insgesamt O(n) + n {O(log i) + O(E[k i ])} = O(n log n) i=1 für die Laufzeit von Algorithmus Trapezierung. 4 Wegberechnung In diesem Kapitel wird beschrieben wie die Wegberechnung im Detail abläuft. Sie lässt sich in zwei Teilbereiche unterscheiden, die in zwei Unterkapiteln dargestellt werden. Zunächst muss aus den bekannten Informationen über den Bewegungsraum eine Repräsentation eben dessen konstruiert werden, deren Datenmenge nicht zu komplex wird, die aber gleichzeitig später eine schnelle Wegfindung ermöglicht. Dies geschieht vor der eigentlichen Wegberechnung. In einem zweiten Schritt kann nun jedes mal, wenn ein neuer Weg berechnet werden soll, auf die bereits erstellte Repräsentation zurückgegriffen werden und auf dieser der Wegfindungs- Algorithmus ausgeführt werden. 4.1 initiale Berechnungen In diesem Unterkapitel sollen Datenstrukturen konstruiert werden, die eine schnelle Wegfindung ermöglichen. Hierfür werden wir zunächst eine Repräsentation für den free space angeben.

22 14 Michael Kionka Berechnung des Free Space Um die Handhabung angenehmer zu machen, begrenzen wir den Bewegungsraum des Roboters durch ein ausreichend großes Rechteck B, in dessen Innerem die Hindernisse liegen und in dem sich der Roboter bewegen wird. Den Bereich außerhalb des Rechtecks interpretieren wir als großes Hindernis. Durch diese Raumbeschränkung begrenzen wir den Bewegungsfreiraum des Roboters jedoch nicht stärker als in realen Situationen, da auch dort irgendwann natürliche Grenzen gegeben sind, so dass die Ergebnisse unserer Berechnungen nicht verfälscht sind. Der free space besteht nun aus dem Inneren des Rechtecks ohne die Hindernisse. Formal geschrieben: C free = B\ t i=1 P i Unsere Repräsentation berechnen wir unter Verwendung der im letzten Kapitel vorgestellten Technik der Trapezierung. Die Eingabe besteht aus der Menge der disjunkten, polygonen Hindernisse, genauer gesagt aus Polygonzügen, die jeweils die Kanten eines dieser Hindernisse beschreiben. Die Segmente im Trapezierungs-Algorithmus stellen dementsprechend die Kanten der Hindernisse dar. Als Datenstruktur wird eine doppelt-verkettete Liste für die Kanten verwendet. Die Berechnung sieht algorithmisch dann wie folgt aus: Algorithmus 2 BerechneFreeSpace Eingabe: H= {P 1,..., P t} als Menge von disjunkten Polygonen Ausgabe: Trapezierung von C free (R,H) inklusive Suchstruktur D für Punktroboter R 1: Sei E die Menge von Kanten der Polygone in H 2: Berechne Trapezierung T (E) und Suchstruktur D mittels Trapezierung(E) 3: Entferne die Trapeze, die innerhalb der Polygone liegen, aus T (E) und D 4: Ausgabe der resultierenden Trapezierung und Suchstruktur Schritt 3, also das Entfernen der Trapeze, die innerhalb der Hindernisse liegen, kann dabei wie folgt realisiert werden: Nach der Trapezierung ist für jedes Trapez bekannt, durch welche Kante es von oben begrenzt wird (top( )) und zu welchem Polygon/Hindernis diese Kante gehört. Um nun zu entscheiden, ob das entsprechende Trapez entfernt werden muss, reicht es aus zu testen, ob die Kante das Hindernis von oben oder von unten begrenzt. Wird ein Trapez gefunden, das innerhalb eines Hindernisses liegt, so werden seine Daten aus der Trapezierung entfernt. Weiterhin wird das Trapez in der Suchstruktur als nicht vorhanden markiert, damit bei einer Punktsuche festgestellt werden kann, dass der entsprechende Punkt im forbidden space liegt. Abbildung 4 zeigt noch einmal die sich nach Schritt 2 und 3 ergebenden Trapezierungen. Es folgt eine Analyse der Laufzeit des Algorithmus: Sei n die Anzahl an Segmenten/Hinderniskanten. Die Trapezierung benötigt dann O(n log n) erwartete Zeit. Der Test, ob ein Trapez innerhalb eines Hindernisses liegt, benötigt nur konstante Zeit, da die Kanten der Hindernisse in der Reihenfolge ihres Vorkommens entlang der Hindernisgrenze sortiert sind, so dass bekannt ist, auf welcher Seite der Kanten der Hindernisinnenraum liegt. Die erhaltenen Datenstrukturen, also die Trapezierung T (C free ) und die Suchstruktur D haben nach Lemma 1 und Theorem 2 beide eine Komplexität von O(n).

23 Wegberechnung für Punktroboter mittels Trapezierung 15 Abb. 4. Trapezierungen von BerechneFreeSpace vor und nach Schritt 3 Damit ergibt sich folgendes Lemma: Lemma 2. Sei R ein Punktroboter. Sei H eine Menge von disjunkten, polygonen Hindernissen, wobei n die Gesamtanzahl ihrer Kanten ist. R bewegt sich zwischen diesen Hindernissen. Die Trapezierung des free space benötigt dann O(n log n) erwartete Zeit. Die erhaltenen Datenstrukturen haben eine Komplexität von O(n). Wegkarte Um die Wegberechnung zu vereinfachen, konstruieren wir uns eine weitere Datenstruktur. Wenn sich sowohl Start- als auch Zielposition im gleichen Trapez befinden, besteht der Weg aus einer einfachen direkten Bewegung von der Start- zur Zielposition. Auf Grund unserer vorherigen Definitionen ist garantiert, dass sich auf diesem Weg kein Hindernis befindet. Viel häufiger wird es aber vorkommen, dass Start- und Zielposition in unterschiedlichen Trapezen liegen. Um die Wegberechnung in diesem Fall zu vereinfachen, erzeugen wir uns einen Graph als Wegkarte, die uns Wege beschreibt, auf denen wir uns leicht zwischen verschiedenen Trapezen bewegen können. Hierbei nutzen wir aus, dass zwei benachbarte Trapeze immer eine gemeinsame vertikale Kante besitzen, die durch eine vertikale Erweiterung eines Segmentendpunktes entstanden ist. Die Knoten des Graphen wählen wir nun wie folgt. Wir nehmen zum einen den Mittelpunkt jeden Trapezes und zum anderen jeweils die Mitte jeder vertikalen Erweiterung als Knoten. Die Kanten legen wir jeweils von jedem Trapezmittelpunkt zu den Mittelpunkten der begrenzenden vertikalen Erweiterungen. Auf diese Weise entsteht jeweils ein Weg von der Mitte eines Trapezes zu den Mitten der angrenzenden Trapeze über die zwischen ihnen liegende vertikale Begrenzung, der aus zwei translatorischen Bewegungen besteht. Eine Veranschaulichung der Wegkarte ist in Abbildung 5 gegeben. Die Konstruktion dieser Wegkarte aus den in der Trapezierung enthaltenen Informationen ist in Zeit O(n) möglich. Für die Komplexität der Wegkarte gilt: Der Graph besitzt einen Knoten pro Trapez und jeweils einen Knoten für jede vertikale Erweiterung. Sowohl die Anzahl an vertikalen Erweiterungen als auch die Anzahl an Tra-

24 16 Michael Kionka pezen ist linear bezogen auf die Gesamtanzahl der Ecken der Hindernisse. Diese wiederum ist linear bezogen auf die Anzahl der Kanten der Hindernisse. Die Anzahl an Kanten im Graph ist ebenfalls linear, da er planar ist. Dies folgt aus dem eulerschen Polyedersatz. Insgesamt folgt also, dass die Komplexität der Wegkarte durch O(n) beschränkt ist. start ziel v ziel p ziel v start p start Abb. 5. Wegkarte und Wegkomponenten des vollständigen Weges 4.2 Pfadberechnung In diesem Unterkapitel wird der eigentliche Wegberechnungs-Algorithmus vorgestellt. Durch die initialen Berechnungen besitzen wir eine Trapezierung des free space (inklusive Suchstruktur) und eine auf dieser aufsetzende Wegkarte. Ziel ist es nun mit Hilfe dieser Datenstrukturen einen Weg von einem Startpunkt p start zu einem Zielpunkt p ziel zu finden und, falls dieser existiert, diesen zu berechnen und auszugeben. Liegen p start und p ziel im gleichen Trapez, ergibt sich der Weg wie beschrieben als direkte Bewegung zwischen ihnen. Ansonsten lässt sich ein existierender Weg aus drei Teilen zusammensetzen; dabei bezeichne v start und v ziel die Knoten im Wegkartengraphen, die in der Mitte von start und ziel liegen:

25 Wegberechnung für Punktroboter mittels Trapezierung Eine direkte Bewegung von p start zum Wegkartenknoten v start in der Mitte von start. 2. Eine Bewegung entlang der Wegkarte von v start zu v ziel. (Berechnung über Breitensuche im Wegkartengraphen möglich) 3. Eine direkte Bewegung vom Wegkartenknoten v ziel in der Mitte von ziel zu p ziel. Falls kein Weg zwischen p start und p ziel existiert, so gibt es hierfür zwei mögliche Gründe: Einer der Punkte p start und p ziel liegt nicht im free, sondern im forbidden space. Beide Punkte liegen zwar im free space, aber zwischen ihnen liegt nicht umgehbarer forbidden space. Der vollständige Algorithmus sieht dann wie folgt aus: Algorithmus 3 BerechnePfad Eingabe: Trapezierung T (C free ) mit Suchstruktur D, Wegkarte G road, Positionen p start, p ziel Ausgabe: Weg von p start zu p ziel, falls einer existiert, sonst entsprechend negative Meldung 1: Finde start und ziel 2: if start oder ziel nicht existent then 3: Ausgabe, dass p start oder p ziel in C forb liegen 4: else 5: Sei v start der Wegknoten in der Mitte von start 6: Sei v ziel der Wegknoten in der Mitte von ziel 7: Berechne den Weg in G road von v start zu v ziel mittels Breitensuche 8: if es existiert kein Weg then 9: Ausgabe, dass kein solcher Weg existiert 10: else 11: Ausgabe des Weges p start v start v ziel p ziel Beweis. Um die Korrektheit des Algorithmus zu beweisen, müssen zwei Dinge gezeigt werden. Jeder Weg, der ausgegeben wird, ist kollisionsfrei. Wenn ein kollisionsfreier Weg existiert, wird er auch gefunden. zu 1. Ausgegebene Wege befinden sich immer innerhalb von Trapezen. Da aber alle Trapeze zum C free gehören, der nach Definition kollisionsfreie Positionen angibt, muss ein ausgegebener Weg kollisionsfrei sein. zu 2. Angenommen, es gibt einen kollisionsfreien Weg von p start nach p ziel. Damit müssen p start und p ziel in Trapezen des free space liegen. Es muss also noch gezeigt werden, dass es einen Weg von v start nach v ziel in G road gibt. Dieser Weg muss eine Folge von Trapezen schneiden. Bezeichne die Folge von Trapezen mit 1, 2,..., k, wobei nach Definition 1 = start und k = ziel gilt. Sei v i der Knoten von G road, der in der Mitte von i liegt. Wenn der Weg von i nach i+1 geht, dann müssen die beiden Trapeze Nachbarn sein und sich damit eine vertikale Erweiterung teilen. Aber G road ist so konstruiert, dass die Knoten solcher Trapeze über den Knoten ihrer gemeinsamen Grenze verbunden sind. Also gibt es einen Weg in G road von v i nach v i+1. Daraus folgt, dass es auch einen Weg von v 1 nach v k bzw. v start nach v ziel gibt. Einen solchen Weg findet eine Breitensuche, die auf G road ausgeführt wird. Nachdem die Korrektheit des Algorithmus nachgewiesen ist, folgt nun eine Analyse seiner Laufzeit:

26 18 Michael Kionka Das Suchen der Trapeze in Schritt 1 kann mittels der Suchstruktur erfolgen, die während der Trapezierung des free space erzeugt wird. Es benötigt somit O(log n) erwartete Zeit und maximal O(n) Zeit. Das Berechnen eines Weges in Graphen mittels Breitensuche benötigt lineare Zeit bezogen auf die Größe des Graphen. Wie gezeigt ist die Größe des Graphen durch O(n) beschränkt. Somit benötigt die Breitensuche O(n) Zeit. Die benötigte Zeit zur Ausgabe des Weges ist begrenzt durch die maximale Anzahl an Kanten auf dem Weg, welche O(n) ist. Insgesamt benötigt der Algorithmus also eine Laufzeit von O(n). Unsere Untersuchungen lassen sich in einem abschließenden Theorem zusammenfassen. Theorem 4. Sei R ein Punktroboter. Sei H eine Menge von disjunkten, polygonen Hindernissen, wobei n die Gesamtanzahl ihrer Kanten ist. R bewegt sich zwischen diesen Hindernissen. H lässt sich in erwarteter Zeit von O(n log n) so aufbereiten, dass ein kollisionsfreier Weg zwischen Start- und Zielposition für R in O(n) berechnet werden kann, falls er existiert. Die erzeugten Datenstrukturen haben dabei eine Komplexität von O(n). 5 Zusammenfassung 5.1 Bewertung Die in dieser Ausarbeitung vorgestellte Methode der Wegberechnung für einen Roboter mittels Trapezierung liefert wie gezeigt zulässige Wege, wenn sie existieren. Sie garantiert jedoch keine kürzesten Wege. Genauer gesagt wird sie auf Grund ihrer Herangehensweise fast nie kürzeste Wege liefern. Dies ist bereits in der in Abbildung 5 dargestellten Situation erkennbar. Für ein extremeres Beispiel kann man als Start- und Zielpunkt die beiden unteren Ecken wählen. Es ergibt sich ein unnötig komplizierter Weg, wie in Abbildung 6 veranschaulicht ist. Aus diesem Grund muss man die Vorgehensweise als nicht realitäts-tauglich einstufen. Niemand wird akzeptieren, dass ein Roboter Zick-Zack-Linien fährt, obwohl eine geradlinige Bewegung möglich wäre. Bei den Zick-Zack-Bewegungen handelt es sich um ein ansatzbedingtes Problem, welches sich daher mit diesem Ansatz kaum vermeiden lassen wird. Eine gewisse Verbesserung ist jedoch auch beim gezeigten Ansatz noch möglich. Die Wegfindung in der Wegkarte G road beruht auf Breitensuche. Daher wird bei mehreren zulässigen Wegen, derjenige Weg gewählt, der die wenigsten Knoten besitzt. Dies ist jedoch nicht zwingend sinnvoll, da nicht von gleichen Entfernungen zwischen den einzelnen Knoten ausgegangen werden kann. Deutlich besser wäre es daher, für jede Kante im Graphen ein Kantengewicht anzugeben, das die jeweilige Länge beschreibt und dann einen kosten-optimierenden Algorithmus anzuwenden. 5.2 Ausblick Soll das Problem von einem Punktroboter, wie hier betrachtet, auf konvexe Roboter erweitert werden, so können die vorgestellten Algorithmen weitgehend beibehalten werden. Da sich nun aber der work space und der configuration space unterscheiden, gestaltet sich die

27 Wegberechnung für Punktroboter mittels Trapezierung 19 start ziel v start v ziel p start p ziel Abb. 6. Beispiel für eine schlechte Wegberechnung Berechnung des free space aufwändiger. Die Berechnung benötigt nun O(n log 2 n) erwartete Zeit, wobei die Komplexität des free space weiterhin linear bleibt. Auch die eigentliche Wegberechnungszeit beträgt weiterhin O(n). Die Berechnung und die Schranken werden in [1] in Kapitel 13.3 und 13.4 vorgestellt und bewiesen. Mit einem verbesserten Algorithmus kann die free space-berechnungszeit jedoch auch wieder auf O(n log n) gesenkt werden. Sollen auch Rotationsbewegungen erlaubt sein, so gestalten sich die Berechnungen wiederum komplizierter. Eine mögliche Erweiterung hierfür wird in Kapitel 13.5 in [1] beschrieben. Neben dem hier vorgestellten Verfahren mittels Trapezierung, existieren weitere Verfahren, die insbesondere auch optimale Lösungen garantieren. Ein Beispiel für ein solches Verfahren unter Verwendung so genannter gerahmter quadtrees, wird im Seminarbeitrag vorgestellt. Literaturverzeichnis 1. de Berg M, van Kreveld M, Overmars M, Schwarzkopf O (2000) Computational Geometry, Algorithms and applications, 2nd Edition Springer, Berlin Heidelberg New York 2. Mulmuley K (1990) A fast planar partition algorithm. In: Journal of Symbolic Computation 10: Seidel R (1991) A simple and fast incremental randomized algorithm for computing trapezoidal decompositions and for triangulating polygons. Comput. Geom. Theory Appl. 1:51 64

28 20 Michael Kionka 4. Kedem K, Livne R, Pach J, Sharir M (1986) On the union of Jordan regions and collision-free translational motion amidst polygonal obstacles. Discrete Comput. Geom. 1: Kedem K, Sharir M (1985) An efficient algorithm for planning collision-free translational motion of a convex polygonal object in 2-dimensional space amidst polygonal obstacles. In: Proc. 1st Annu. ACM Sympos. Comput. Geom

29 Der Einsatz von Bereichsbäumen zur Beantwortung von orthogonalen Bereichsanfragen Jasmin Kovač-Engelmeier Universität Paderborn Zusammenfassung. Unter einer orthogonalen Bereichsanfrage versteht man die Suche nach den Punkten einer gegebenen Punktmenge in einem d-dimensionalen Raum, die in einem achsenparallelen definierten Bereich liegen. Ein mögliches Anwendungsgebiet für orthogonale Bereichsanfragen ist die Realisierung von Datenbankanfragen. So wird jede Tabellenspalte als eine Dimension interpretiert, und jede Tabellenzeile als ein Punkt in dem entsprechenden d-dimensionalen Raum. Für die 1-dimensionale Bereichssuche kann auf die Datenstruktur eines binären balancierten Suchbaums zurückgegriffen werden. Im Fall der 2-dimensionalen oder auch mehrdimensionalen Bereichssuche bieten sich Bereichsbäume als eine Datenstruktur an. Wie diese Datenstrukturen genutzt werden können, um orthogonale Bereichsanfragen zu unterstützen, wird in der vorliegenden Arbeit erörtert. 1 Einleitung Orthogonale Bereichsanfragen dimensionale Bereichssuche Bereichsbäume Mehrdimensionale Bereichsbäume Fazit Literaturverzeichnis Einleitung Das Problem, orthogonale Bereichsanfragen effizient zu beanworten, spielt nicht nur innerhalb der Geometrie eine wichtige Rolle. So kann diese Fragestellung z.b. konkret auf Datenbankanfragen übertragen werden, wenn jeder Datensatz als ein Punkt in einer Ebene bzw. in einem mehrdimensionalen Raum interpretiert wird. Aus einer Menge von Datenstrukturen, die das Beantworten von orthogonalen Bereichsanfragen unterstützen können, fiel im Rahmen der vorliegenden Proseminararbeit die Wahl auf Bereichsbäume 1. In dem folgenden Kapitel wird zunächst der Begriff einer orthogonalen Bereichsanfrage anhand eines Anwendungsbeispiels näher erläutert. Es gilt dann in den darauffolgenden Kapiteln ausführlich zu beschreiben, wie binäre balancierte Suchbäume die 1-dimensionale 1 Die folgenden Ausführungen orientieren sich primär an [1].

30 22 Jasmin Kovač-Engelmeier Bereichssuche und schließlich Bereichsbäume die 2- bzw. mehrdimensionale Bereichssuche unterstützen können. 2 Orthogonale Bereichsanfragen Auf den ersten Blick scheint es fraglich, ob und wie die Geometrie für Datenbankanfragen genutzt werden kann. Wenn nun aber jede der n Spalten einer Datenbank als eine Dimension und jede Zeile als ein Punkt in einem entsprechenden d-dimensionalen Raum interpretiert wird, so kann die Suche nach einem Datenbankeintrag durch die Suche nach dem korrespondierenden Punkt im d-dimensionalen Raum simuliert werden. Ein anschauliches Beispiel aus der Praxis ist die Mitarbeiterliste, welche von der Personalabteilung eines Unternehmens erstellt wird. In der Datenbank ist von jedem Mitarbeiter der Name, die Adresse, das Geburtsdatum, das Gehalt usw. gespeichert. Aus welchen Gründen auch immer kann es nun notwendig sein, dass eine Auswertung über alle Mitarbeiter, die zwischen 1950 und 1955 geboren sind und die zugleich zwischen Euro 3.000,- und Euro 4.000,- pro Monat verdienen, erstellt werden soll. Diese Anfrage kann nun auch geometrisch interpretiert werden. Dies erfolgt, indem jeder Mitarbeiter als ein Punkt in der Ebene dargestellt wird. Die erste Koordinate spiegelt dann das Geburtsdatum wieder, und die zweite Koordinate das monatliche Einkommen. Das Geburtsdatum wird in dem vorliegenden Beispiel nach der folgenden Regel umgewandelt: Geburtsjahr Monat + Tag. So erhält man zum Beispiel für das Geburtsdatum den Wert Für die oben genannte Anfrage bedeutet dies, dass alle Punkte gesucht werden, deren erste Koordinate zwischen den Werten und liegt, und deren zweite Koordinate sich zwischen den Werten und befindet. Wenn man dies nun in ein Koordinatensystem überträgt, so wird deutlich, dass die Punkte, die gesucht werden, in dem achsenparallelen Rechteck liegen, das durch die Eckpunkte ( , 3.000) und ( , 4.000) definiert wird (vgl. Abbildung 1 2 ). Eine solche Anfrage kann selbstverständlich noch um weitere Attribute ergänzt werden wie z.b. die Anzahl der Kinder eines Mitarbeiters. D.h. es werden in dem Beispiel nun alle Mitarbeiter gesucht, die zwischen 1950 und 1955 geboren worden sind, monatlich zwischen Euro 3.000,- und Euro 4.000,- verdienen und zusätzlich zwei bis vier Kinder haben. Die Anzahl der Kinder wird demnach durch die dritte Koordinate eines jeden Punktes repräsentiert. Somit handelt es sich um eine Suche im dreidimensionalen Raum. Im Rahmen der Anfrage sind alle Punkte zu ermitteln, die in dem achsenparalleln Quader [ : ] [2.000 : 4.000] [2 : 4] liegen (siehe Abbildung 2 3 ). Anhand der beiden vorgestellten Beispiele lässt sich zusammenfassen, dass die Datensätze einer Datenbank sich als Punkte in einem d-dimensionalen Raum darstellen lassen. Die Suche nach den auf eine Anfrage zutreffenden Datenbankeinträge wird durch die Suche nach der Punktmenge ersetzt, die in dem d-dimensionalen und achsenparallel begrenzten Bereich 2 Die Abbildung ist entnommen aus [1]. 3 Die Abbildung ist entnommen aus [1].

31 Bereichsbäume Gehalt Karl Schmidt Geburtsdatum: 19. August 1954 Gehalt: 3.678, Geburtsdatum Abb. 1. Geometrische Interpretation einer Datenbankanfrage Gehalt Kinder Geburtsdatum Abb. 2. Geometrische Interpretation einer Datenbankanfrage in einem 3-dimensionalen Raum

32 24 Jasmin Kovač-Engelmeier liegt. Das Ermitteln dieser Punktmenge wird als orthogonale 4 Bereichsanfrage bezeichnet. Im Folgenden werden Datenstrukturen vorgestellt, die orthogonale Bereichsanfragen unterstützen. Zunächst wird auf eine Datenstruktur für die 1-dimensionale Bereichssuche eingegangen, um von dieser Datenstruktur die Vorgehensweise für 2- und mehrdimensionale Bereichsanfragen abzuleiten. 3 1-dimensionale Bereichssuche Im Fall der Bereichssuche in einem 1-dimensionalen Raum besteht die betrachtete Punktmenge aus reellen Zahlen. Bei einer Anfrage werden dann die Punkte gesucht, die in einem 1-dimensionalen Rechteck liegen, d.h. also in einem Intervall [x : x ]. Sei nun P := {p 1, p 2,..., p n } die Menge der Punkte auf einer Zahlengeraden. Die Durchführung der 1-dimensionalen Bereichssuche kann nun mithilfe eines balancierten binären Suchbaums τ erfolgen. In den Blättern von τ werden alle Punkte von P gespeichert. In den inneren Knoten von τ sind die sogenannten Splittwerte gespeichert. Sie übernehmen im Suchbaum sozusagen die Rolle von Wegweisern. Der Splittwert eines inneren Knotens v wird mit x v bezeichnet. Charakteristisch für einen Suchbaum ist, dass alle Werte, die im linken Teilbaum von v gespeichert sind, kleiner als oder gleich x v sind. Analog sind alle Werte, die sich im rechten Teilbaum von v befinden, größer als x v. Zum Ermitteln der Punkte, die in dem Intervall [x : x ] liegen, wird in τ eine Suche nach x und x durchgeführt. Mit µ und µ werden die Blätter bezeichnet, bei denen jeweils die Suche nach x und x in τ endet. Man kann somit sagen, dass die Punkte, die in dem Intervall [x : x ] liegen, in den Blättern zwischen µ und µ gespeichert sind. Zusätzlich ist zu prüfen, ob auch die Werte von µ und µ in diesem Intervall liegen. Ein gutes Anschauungsbeispiel liefert die Abbildung 3 5, in welcher die 1-dimensionale Bereichsanfrage in einem binären Suchbaum dargestellt ist. Es sollen in dem Beispiel alle Punkte ermittelt werden, die in dem Intervall [18 : 77] liegen. Mithilfe der Abbildung lässt sich schnell intuitiv die Lösung ermitteln. So liegen in der Ergebnismenge alle Punkte, die in den dunkelgrau markierten Blättern gespeichert sind, plus der Punkt, der in dem Blatt µ gespeichert ist. Wie lässt sich nun diese eher intuitive Vorgehensweise, die zwischen µ und µ liegenden Blätter, welche die gesuchten Punkte beinhalten, zu ermitteln, in einen Algorithmus fassen? Beim Betrachten des abgebildeten Suchbaums fällt auf, dass die gesuchten Blätter zu Teilbäumen gehören, die sich zwischen µ und µ befinden, und deren Wurzeln auf den Suchpfaden von x und x liegen. Um diese Blätter zu finden, ist es zunächst notwendig, den letzten gemeinsamen Knoten v split zu ermitteln, bei dem sich die Suchpfade von x und x voneinander trennen. Das Ermitteln von v split wird mittels der folgenden Prozedur FindeSplittknoten durchgeführt. Mit LK(v) und RK(v) werden jeweils das linke und rechte Kind eines Knotens v bezeichnet. 4 Der Begriff orthogonal kommt aus dem Griechischen, und bedeutet soviel wie rechtwinklig oder rechteckig (vgl. [2]). 5 Die Abbildung ist entnommen aus [1].

33 Bereichsbäume μ μ' Abb. 3. Beispiel einer 1-dimensionalen Bereichssuche in einem binären balancierten Suchbaum FindeSplittknoten(τ, x, x ) Eingabe: Baum τ und die Werte x und x mit x x. Ausgabe: Knoten v, bei dem die Wege zu x und x starten, oder das Blatt, wo beide Wege enden. 1. v root(τ) 2. while v ist kein Blatt and (x x v or x > x v) 3. do if x x v 4. then v LK(v) 5. else v RK(v) 6. return v Die Eingabeparameter für die Prozedur sind τ, x und x. Beginnend bei der Wurzel des Baums τ, wird schrittweise jeder Knoten, der im Rahmen der Prozedur besucht wird, dahingehend geprüft, ob er ein Blatt ist, und ob sein Wert innerhalb des Intervalls [x : x ] liegt. Solange dies nicht eintrifft, wird für den Fall, dass der Wert des betrachteten Knotens größer als x - sozusagen die rechte Grenze des Intervalls - ist, das linke Kind des betrachteten Knotens v als nächstes untersucht. Für den anderen Fall, d.h. dass der Wert des aktuell betrachteten Knotens v kleiner als x - die linke Grenze des vorgegebenen Intervalls - ist, wird als nächstes das rechte Kind des Knotens v untersucht. Sobald es sich bei dem betrachteten Knoten v um ein Blatt handelt, oder der in ihm gespeicherte Wert in dem Intervall [x : x ] liegt, wird v als Splittknoten ausgegeben. Der somit ermittelte Splittknoten wird nun zum Ausgangspunkt für den Suchpfad von x. Bei jedem Knoten, der im Rahmen des Suchpfades besucht wird, wird überprüft, ob der Wert x im linken oder im rechten Teilbaum zu suchen ist. D.h. es wird ein Vergleich zwischen x und dem Wert, der in v gespeichert ist, durchgeführt. Führt der Suchpfad im linken Teilbaum weiter, so werden alle Blätter des rechten Teilbaums ausgegeben, da dieser

34 26 Jasmin Kovač-Engelmeier Teilbaum zwischen den Suchpfaden von x und x liegt. Analog wird der Suchpfad von x durchlaufen, jedoch mit dem Unterschied, dass, wenn der Suchpfad im rechten Teilbaum eines Knotens weiterverläuft, die Blätter des linken Teilbaums auszugeben sind. Wie bereits eingangs erwähnt, sind zusätzlich noch die beiden Blätter µ und µ darauf zu prüfen, ob die in ihnen gespeicherten Werte ebenfalls in dem Intervall [x : x ] liegen. Falls dies der Fall ist, sind auch sie entsprechend auszugeben. Es folgt nun noch der entsprechende Algorithmus, welcher wiederum die Prozedur BerichteTeilbaum enthält. Mittels dieser Prozedur werden die Werte ausgegeben, die in den Blättern der Teilbäume gespeichert sind, deren Wurzeln auf einem der beiden Suchpfade liegen. Aufgrund der Tatsache, dass die Anzahl der inneren Knoten eines binären Suchbaumes kleiner als die Anzahl seiner Blätter ist, ist die Zeit, die diese Prozedur benötigt, linear zur Anzahl der zu berichtenden Punkte. Algorithmus 1DBereichsanfrage(τ, [x : x ]) Eingabe: ein binärer Suchbaum τ und ein Intervall [x : x ] Ausgabe: alle Punkte, die in τ gespeichert sind und in dem Intervall [x : x ] liegen. 1. v split F indesplittknoten(τ, x, x ) 2. if v split ist ein Blatt 3. then überprüfe, ob der Punkt, der in v split gespeichert ist, auszugeben ist. 4. else (*Folge dem Weg zu x und gib die Punkte der Teilbäume aus, die rechts vom Suchpfad liegen.*) 5. v LK(v split ) 6. while v ist kein Blatt 7. do if x x v 8. then BerichteTeilbaum(RK(v)) 9. v LK(v) 10. else v RK(v) 11. Überprüfe, ob der Punkt, der in dem Blatt v gespeichert ist, ausgegeben werden muss. 12. Folge analog dem Suchpfad von x. Gib alle Punkte der Teilbäume aus, die links von dem Suchpfad liegen, und überprüfe, ob der Punkt, der in dem Blatt gespeichert ist, wo der Suchpfad endet, ausgegeben werden muss. Der vorgestellte Algorithmus scheint soweit die gesuchte Ergebnismenge zu liefern. Jedoch ist seine Korrektheit noch im Folgenden formal zu zeigen. Lemma 1. Der Algorithmus 1DBereichsanfrage gibt genau die Punkte aus, die in dem angegebenen Intervall liegen. Der folgende Beweis erstreckt sich über zwei Teile. Zunächst ist zu zeigen, dass jeder Punkt p, der durch den Algorithmus ausgegeben wird, in dem angegebenen Intervall liegt. Falls p in einem der beiden Blätter gespeichert ist, wo jeweils die Suchpfade von x und x enden, dann wird explizit durch den Algorithmus überprüft, ob p in dem vorgegebenen Intervall liegt, und ob p dementsprechend auszugeben ist. Andernfalls wird p infolge des Aufrufs von BerichteTeilbaum ausgegeben. Angenommen dieser Aufruf findet während

35 Bereichsbäume 27 des Durchlaufens des Suchpfades von x statt. So sei v ein Knoten auf diesem Suchpfad, so dass p infolge des Aufrufs von BerichteTeilbaum(RK(v)) ausgegeben wird. Da v und folglich auch RK(v) in dem linken Teilbaum von v split liegen, gilt p x vsplit. Aus der Tatsache, dass der Suchpfad von x rechts von x split abzweigt, folgt auch, dass p < x gilt. Des Weiteren steht fest, dass der Suchpfad von x links von v weiterverläuft. Da p im rechten Teilbaum von v liegt, impliziert dies, dass x < p gilt. Daraus lässt sich insgesamt schließen, dass p [x : x ]. Der Beweis, dass p auch in dem Intervall liegt, wenn der Suchpfad von x durchlaufen wird, erfolgt symmetrisch. In einem weiteren Schritt ist nun noch zu zeigen, dass auch tatsächlich alle Punkte vom Algorithmus ausgegeben werden, die in dem vorgegebenen Intervall liegen. Zu diesem Zweck wird angenommen, dass µ das Blatt ist, in welchem p gespeichert ist. Zusätzlich sei v der kleinste Vorfahr von µ, der im Rahmen des Algorithmus besucht wird. Es wird behauptet, dass v = µ ist. Dies impliziert, dass p ausgegeben wird. Zur Erzeugung eines Widerspruchs wird nun angenommen, dass v µ ist. Geht man von dieser Annahme aus, dann kann v kein Knoten sein, der infolge eines Aufrufs der Prozedur BerichteTeilbaum besucht wird, da alle Nachfolger dieses Knotens besucht werden. Somit kann v nur auf dem Suchpfad von x, auf dem Suchpfad von x oder auf beiden liegen. Im Folgenden wird lediglich der letztgenannte Fall näher betrachtet, da sich alle drei Fälle ähnlich gestalten. Es wird angenommen, dass µ im linken Teilbaum von v angesiedelt ist. Der Suchpfad von x wird jedoch im rechten Teilbaum von v fortgesetzt. Andernfalls wäre v nicht der kleinste Vorfahr, der im Rahmen des Algorithmus besucht wird. Dies hat zur Folge, dass p < x ist. Für den analogen Fall, dass der Suchpfad von x im linken Teilbaum von v weiterverläuft, gilt p > x, da gemäss der getroffenen Annahmen µ im rechten Teilbaum von v liegt. In beiden Fällen führt die Behauptung, dass p in dem angegebenen Intervall liegt, zu einem Widerspruch. Folglich ist bewiesen, dass der betrachtete Algorithmus alle Punkte ausgibt, die in dem vorgegebenen Intervall liegen. Der Speicherplatz, der für einen balancierten binären Suchbaum benötigt wird, beträgt O(n). Des Weiteren wurde eingangs vorausgesetzt, dass der verwendete binäre Suchbaum balanciert ist. Und balancierte Suchbäume garantieren eine Höhe von O(log n) (siehe [3]). Infolgedessen kann der Baum in einer Zeit von O(n log n) erzeugt werden. Die Suchzeit beträgt im schlimmsten Fall Θ(n). Dies tritt ein, wenn sich alle Punkte des Baums in dem angefragten Intervall befinden. Um jedoch so eine Suchzeit zu erhalten, würde es auch ausreichen, einfach die Punkte mit dem Intervall zu vergleichen. Die zuvor beschriebene Datenstruktur müsste dann erst gar nicht verwendet werden. Diese Suchzeit lässt sich aber auch nicht vermeiden, wenn alle Punkte, die in dem Baum gespeichert sind, am Ende ausgegeben werden müssen, weil sie allesamt im Intervall liegen. Abgesehen vom schlimmsten Fall, lässt sich jedoch eine Verbesserung der Suchzeit erreichen, wenn nicht nur die reine Anzahl n der Punkte aus P berücksichtigt wird, sondern auch die Anzahl der auszugebenden Punkte. Letztgenannte wird im weiteren Verlauf mit k bezeichnet. Aus der Tatsache, dass die Zeit, die für einen Aufruf von BerichteTeilbaum benötigt wird, linear zur Anzahl der aus dem Teilbaum auszugebenden Punkte ist, folgt, dass der Zeitaufwand, der insgesamt für die Aufrufe von BerichteTeilbaum aufgebracht werden muss, O(k) beträgt. Alle restlichen Knoten, die noch in dem Baum τ besucht werden, liegen entweder auf dem Suchpfad von x oder auf dem von x. Diese Suchpfade haben die Länge O(log n), da - wie eingangs voraus-

36 28 Jasmin Kovač-Engelmeier gesetzt - der binäre Suchbaum τ balanciert ist. Dadurch wird eine Baumhöhe von O(log n) garantiert. Für jeden Knoten, der auf dem Suchpfad besucht wird, fällt ein Zeitaufwand von O(1) an. Demnach beträgt der Gesamtaufwand für diese Knoten O(log n). So erhält man einen gesamten Suchaufwand von O(log n + k). Das folgende Theorem fasst noch einmal die wichtigsten Ergebnisse aus diesem Abschnitt zusammen. Theorem 1. Sei P eine Menge von n Punkten in einem 1-dimensionalen Raum. Die Menge P kann in einem balancierten binären Suchbaum gespeichert werden. Dafür wird O(n) Speicherplatz und O(n log n) Konstruktionszeit benötigt. Die in einem angefragten Intervall liegenden Punkte können dann in O(k + log n) Zeit ausgegeben werden, wobei k für die Anzahl der auszugebenen Punkte steht. Eine 1-dimensionale Bereichsanfrage kann also mithilfe eines balancierten binären Suchbaums durchgeführt werden. Es stellt sich nun die Frage, ob dieses Wissen genutzt werden kann, um Bereichsanfragen in einem 2-dimensionalen Raum bewerkstelligen zu können. Dementsprechend beschäftigt sich das folgende Kapitel ausführlich mit Bereichsbäumen. Diese Datenstruktur unterstützt das Durchführen von 2-dimensionalen Bereichsanfragen. 4 Bereichsbäume Allgemein lassen sich Bereichsbäume als eine Datenstruktur beschreiben, mittels derer n Punkte einer Menge P gespeichert werden können, um anschließend auf ihnen orthogonale Bereichsanfragen durchführen zu können. Im Grunde wurden Bereichsbäume bereits im vorherigen Kapitel vorgestellt, denn ein balancierter binärer Suchbaum ist nichts anderes als ein 1-dimensionaler Bereichsbaum. Jedoch wie sieht dann der Aufbau eines Bereichsbaums für 2-dimensionale Bereichsanfragen aus? Bevor diese Frage beantwortet wird, gilt es einige Vorüberlegungen anzustellen. Zunächst wird angenommen, dass P eine Menge von n Punkten in einem 2-dimensionalen Raum ist. Die Position jedes Punktes dieser Menge wird durch zwei Werte bestimmt: die x- und die y-koordinate. Im Rahmen der 1-dimensionalen Bereichsanfrage wurden die Punkte ermittelt, die innerhalb eines vorgegebenen Intervalls [x : x ] lagen. Bei der 2-dimensionalen Bereichsanfrage sind wiederum die Punkte zu ermitteln, die in dem achsenparallelen Rechteck liegen, welches durch [x : x ] [y : y ] bestimmt wird. Im Grunde besteht die 2- dimensionale Bereichsanfrage aus zwei 1-dimensionalen Bereichsanfragen. So erfolgt im ersten Schritt die Ermittlung der Punkte aus P, deren x-koordinate jeweils in dem Intervall [x : x ] liegt. Es liegt somit eine 1-dimensionale Bereichsanfrage vor, die bereits aus dem vorherigen Kapitel bekannt ist. D.h. es wird zunächst der Splitknoten v split ermittelt, bei dem sich die Suchpfade von x und x trennen. Mit dem linken Kind von v split beginnend, wird der restliche Suchpfad von x durchlaufen. Bei jedem Knoten wird überprüft, wo der Suchpfad weiterverläuft. Falls der Suchpfad im linken Teilbaum eines Knotens fortgesetzt wird, werden alle Punkte, die im rechten Teilbaum von v gespeichert sind, ausgegeben. Der gleiche Vorgang wird für den restlichen Suchpfad von x wiederholt, wobei die Punkte des linken Teilbaum eines Knotens ausgegeben werden, falls der Suchpfad im rechten Teilbaum von v fortgesetzt wird. Die Blätter µ und µ - bei denen die Suchpfade von x und x jeweils enden - werden explizit dahingehend geprüft, ob die in ihnen gespeicherten Punkte in dem

37 Bereichsbäume 29 vorgegebenen Intervall liegen. Infolgedessen werden O(log n) Teilbäume ausgewählt, die genau die Punkte aus P enthalten, deren x-koordinate in dem x-intervall des Anfragebereichs liegt. In diesem Zusammenhang soll der Begriff der kanonischen Teilmenge eingeführt werden. Die kanonische Teilmenge eines Knotens v, welche wiederum mit P (v) bezeichnet wird, ist die Teilmenge der Punkte, die in den Blättern eines Teilbaums gespeichert sind. Die Wurzel dieses Teilbaums ist der Knoten v. So ist zum Beispiel die kanonische Teilmenge der Wurzel eines Baums die gesamte Punktmenge P. Wiederum die kanonische Teilmenge eines Blattes ist einfach der Punkt, der in dem Blatt gespeichert ist. Infolgedessen kann die Teilmenge der Punkte aus P, deren x-koordinate in dem angefragten Bereich liegt, als eine disjunkte Vereinigung von O(log n) kanonischen Teilmengen P (v) der Knoten v - d.h. den Wurzeln der ausgewählten Teilbäume - bezeichnet werden. Genaugenommen sind von dieser Teilmenge von P auch nur die Punkte von Interesse, deren y-koordinate gleichzeitig in dem Intervall [y : y ] liegt. Wie bereits angedeutet, handelt es sich dabei um die zweite 1-dimensionale Bereichsanfrage. Diese kann ebenfalls mithilfe eines binären Suchbaums durchgeführt werden, der auf den y-koordinaten der Punkte aus P beruht. Es gilt nun diese beiden 1-dimensionalen Bereichsanfragen zu vereinen. Es ergibt sich daraus die folgende Datenstruktur. Der Hauptbaum ist ein balancierter binärer Suchbaum τ, der die x-koordinaten der Punkte aus P beinhaltet. Für jeden inneren Knoten und jedes Blatt v von τ werden die kanonischen Teilmengen P (v) in einem weiteren balancierten binären Suchbaum τ verbund (v) gespeichert. Dieser beinhaltet wiederum die y-koordinaten der Punkte aus P. Von einem Knoten v führt ein Zeiger zur Wurzel des Baums τ verbund (v), welcher als verbundene Struktur von v bezeichnet wird (siehe Abbildung 4 6 ). Die soeben grob beschriebene Datenstruktur wird Bereichsbaum genannt. Generell heißen solche Datenstrukturen, bei denen Zeiger von den Knoten zu den verbundenen Strukturen führen, auch Multi-Level-Datenstrukturen. Der Hauptbaum τ wird dann als First- Level-Baum bezeichnet, und die verbundenen Strukturen als Second-Level-Bäume. So stellt sich nun die Frage, wie ein solcher Bereichsbaum konstruiert wird. Es sei eine Punktmenge P := {p 1,..., p n } gegeben, die nach der x-koordinate sortiert ist. Der folgende rekursive Algorithmus Erzeuge2DBereichsbaum liefert dann die Wurzel eines 2-dimensionalen Bereichsbaums. Bezüglich der vorgegebenen Punktmenge wird an dieser Stelle vereinfachend angenommen, dass es keine zwei Punkte gibt, welche die gleichen Koordinaten haben. Es ist zu betonen, dass in den Blättern der verbundenen Struktur nicht lediglich die y-koordinaten der Punkte gespeichert werden, sondern es werden die Punkte selbst in den Blättern gespeichert. Das bedeutet, dass beim Durchsuchen der verbundenen Struktur am Ende auch tatsächlich die Punkte ausgegeben werden. Es gilt nun den Speicherplatz, den diese Datenstruktur benötigt, zu ermitteln. Lemma 2. Ein Bereichsbaum, der n Punkte im Rahmen einer 2-dimensionalen Bereichsanfrage enthält, benötigt O(n log n) Speicherplatz. 6 Die Abbildung ist entnommen aus [1].

38 30 Jasmin Kovač-Engelmeier τ τverbund(v) P(v) P(v) Abb. 4. Der Aufbau eines 2-dimensionalen Bereichsbaumes Algorithmus Erzeuge2DBereichsbaum(P ) Eingabe: eine Punktmenge P in der 2-dimensionalen Ebene Ausgabe: die Wurzel eines 2-dimensionalen Bereichsbaums 1. Konstruiere die verbundene Struktur: erzeuge einen binären Suchbaum τ verbund mit der Punktmenge P y, die sich aus den y-koordinaten der Punkte aus P ergibt. Speichere in den Blättern des Baums τ verbund nicht einfach nur die jeweiligen y-koordinaten, sondern die Punkte selbst. 2. if P aus nur einem Punkt besteht 3. then erzeuge ein Blatt v, das diesen Punkt speichert, und mache τ verbund zur verbundenen Struktur von v 4. else teile P in zwei Teilmengen auf: die Teilmenge P links enthält die Punkte, deren x-koordinate kleiner gleich x mitte - der mittleren x-koordinate - ist, und die Teilmenge P rechts enthält die Punkte aus P, deren x-koordinate größer als x mitte ist. 5. v links Erzeuge2DBereichsbaum(P links ) 6. v rechts Erzeuge2DBereichsbaum(P rechts ) 7. Erzeuge einen Knoten v, der x mitte speichert, mache v links zum linken Kind von v, v rechts zum rechten Kind von v und τ verbund zur verbundenen Struktur von v. 8. return v

39 Bereichsbäume 31 Der Beweis dieses Satzes sieht folgendermaßen aus. Ein Punkt p aus der Menge P wird ausschließlich in der verbundenen Struktur der Knoten in τ gespeichert, die auf dem Weg zu dem Blatt liegen, welches letztendlich p enthält. Somit lässt sich sagen, dass für alle Knoten einer bestimmten Tiefe in τ gilt, dass p in genau einer verbundenen Struktur gespeichert ist. Aus der Tatsache, dass 1-dimensionale Bereichsbäume linearen Speicherplatz benötigen, lässt sich schliessen, dass für die verbundenen Strukturen aller Knoten von τ zusammen O(n) Speicherplatz benötigt wird. Wie bereits gezeigt, ist die Tiefe von τ O(log n). Demnach beträgt der Gesamtspeicherplatz, der benötigt wird, O(n log n). Der vorgestellte Algorithmus Erzeuge2DBereichsbaum(P ) erreicht nicht unbedingt die optimale Zeit von O(n log n), um einen Bereichsbaum zu erzeugen. Es wird nun aber angenommen, dass eine unsortierte Menge von n Schlüsseln vorliegt. Um für diese Menge nun einen binären Suchbaum zu erzeugen, wird eine Konstruktionszeit von O(n log n) benötigt. Dies bedeutet, dass für das Erzeugen einer verbundenen Struktur - so wie es in der Zeile 1 des genannten Algorithmus der Fall ist - ein Zeitbedarf von O(n log n) anfällt. Dies kann jedoch verbessert werden, indem die Punkte von P y bezüglich der y-koordinate vorsortiert werden. Die Folge ist, dass der binäre Suchbaum von unten nach oben in linearer Zeit aufgebaut werden kann. Aufgrunddessen wird für den Konstruktionsalgorithmus die Punktmenge in zwei Listen verwaltet: d.h. in einer Liste werden die Punkte nach der x- Koordinate sortiert, und in der anderen nach der y-koordinate. Demzufolge ist die Zeit, die für einen Knoten im Hauptbaum τ benötigt wird, linear zur Größe seiner kanonischen Teilmengen. Dies führt wiederum zu dem Schluß, dass die Gesamtkonstruktionszeit der Menge des benötigten Speichplatzes entspricht: O(n log n). Die Tatsache, dass das Vorsortieren in einer Zeit O(n log n) realisiert werden kann, führt ebenfalls zur Gesamtkonstruktionszeit von O(n log n). Im Laufe des folgenden Algorithmus werden zunächst die O(log n) kanonischen Teilmengen ausgewählt, die zusammen die Punkte enthalten, deren x-koordinate in dem Intervall [x : x ] liegt. Dies wird mithilfe des 1-dimensionalen Anfragealgorithmus durchgeführt. Von diesen Teilmengen ausgehend, werden anschließend die Punkte ausgegeben, deren y- Koordinate in dem Intervall [y : y ] liegt. D.h. es wird der 1-dimensionale Anfragealgorithmus auf die verbundenen Strukturen angewendet, welche die jeweiligen kanonischen Teilmengen enthalten. Im Prinzip kann man sagen, dass der Algorithmus 2DBereichsanfrage dem 1-dimensionalen Anfragealgorithmus 1DBereichsanfrage gleicht. Die beiden Algorithmen unterscheiden sich dadurch, dass bei der 2-dimensionalen Bereichsanfrage nicht BerichteTeilbaum aufgerufen wird, sondern 1DBereichsanfrage. Es stellt sich erneut die Frage nach der Laufzeit des Algorithmus. Lemma 3. Für eine orthogonale Anfrage in einem Bereichsbaum, der n Punkte beinhaltet, wird O(log 2 n+k) Zeit benötigt. In diesem Kontext steht k für die Anzahl der auszugebenden Punkte. Lässt sich diese Aussage auch beweisen? Bei jedem Knoten im Hauptbaum τ wird für die Entscheidung, wo der Suchpfad nun weiterverläuft, eine konstante Zeit benötigt. Möglicherweise ist es notwendig, in diesem Rahmen den Algorithmus 1DBereichsanfrage auszu-

40 32 Jasmin Kovač-Engelmeier Algorithmus 2DBereichsanfrage(τ, [x : x ], [y : y ]) Eingabe: ein 2-dimensionaler Bereichsbaum τ und ein Bereich [x : x ]x[y : y ]. Ausgabe: alle Punkte von τ, die in dem Bereich liegen. 1. v split F indesplitknoten(τ, x, x ) 2. if v split ist ein Blatt 3. then Überprüfe, ob der Punkt, der in v split gespeichert ist, ausgegeben werden muss. 4. else (*Folge dem Weg zu x und rufe 1DBereichsanfrage für die Teilbäume auf, die rechts von dem Weg liegen.*) 5. v LK(v split ) 6. while v ist kein Blatt 7. do if x x v 8. then 1DBereichsanfrage(τ verbund (RK(v)), [y : y ]) 9. v LK(v) 10. else v RK(v) 11. Überprüfe, ob der Punkte, der in v gespeichert ist, ausgegeben werden muss. 12. Analog folge dem Weg von RK(v split ) bis x, rufe 1DBereichsanfrage mit dem Intervall für die Teilbäume auf, die links des Weges liegen, auf und überprüfe, ob der Punkt, der in dem Blatt am Ende des Pfades gespeichert ist, ausgegeben werden muss. führen. Infolge des Theorems 1 ist bekannt, dass für diesen rekursiven Aufruf O(log n + k v ) Zeit benötigt wird, wobei k v für die Anzahl der Punkte steht, die im Rahmen dieses Aufrufs ausgegeben werden. Dies führt zur Gesamtzeit O(log n + k v ). Diese Summe reicht über v alle Knoten, die innerhalb des Hauptbaums τ besucht werden. Die Summe k v ist gleich v k - der Gesamtanzahl aller Knoten, die ausgegeben werden. Und wie bereis zuvor erwähnt, weisen die Suchpfade von x und x in dem Hauptbaum τ jeweils die Länge O(log n) auf. Daraus folgt O(logn) = O(log 2 n) und wiederum Lemma 3. v v Das folgende Theorem fasst noch einmal die Ergebnisse dieses Kapitels zusammen. Theorem 2. Sei P die Menge von n Punkten in einer Ebene. Dann benötigt ein Bereichsbaum für P O(n log n) Speicherplatz und eine Konstruktionszeit von O(n log n). Eine orthogonale Anfrage bezüglich einer bestimmten Teilmenge von P kann dann in O(log 2 n + k) Zeit beantwortet werden, wobei mit k die Anzahl der auszugebenden Punkte bezeichnet wird. Von der Konstruktion 2-dimensionaler Bereichsbäume ausgehend, soll im folgenden Kapitel eine allgemeine Vorgehensweise für den Aufbau von mehrdimensionalen Bereichsbäumen vorgestellt werden. 5 Mehrdimensionale Bereichsbäume Im Rahmen mehrdimensionaler Bereichsbäume sei P die Menge von Punkten in einem d- dimensionalen Raum. Im ersten Schritt wird ein balancierter binärer Suchbaum konstruiert, der von den Punkten jeweils die erste Koordinate enthält. In diesem First level-baum - dem Hauptbaum - enthält die kanonische Teilmenge P (v) eines Knotens v die Punkte, die in

41 Bereichsbäume 33 den Blättern des Teilbaums von v gespeichert sind. Für jeden Knoten v wird eine verbundene Struktur τ verbund (v) konstruiert. Dieser Second Level-Baum τ verbund (v) ist folglich ein (d 1)-dimensionaler Suchbaum für die Punkte in P (v). Diese Punkte bestehen dann also aus den (d 1)-letzten Koordinaten. Auf die gleiche Weise - wie zuvor beschrieben - wird dieser (d 1)-dimensionale Suchbaum rekursiv konstruiert. D.h. es wird ein balancierter binärer Suchbaum auf Basis der ursprünglich zweiten Koordinate der Punkte gebildet. Jeder Knoten verweist mit einem Zeiger auf einen (d 2)-dimensionalen Bereichsbaum, welcher die auf die (d 2)-letzten Koordinaten beruhenden Punkte aus dem Teilbaum des jeweiligen Knotens beinhaltet. Die Rekursion endet, wenn nur noch die Punkte übrig bleiben, die ausschließlich die letzte Koordinate repräsentieren. Diese Punkte werden dann in einem balancierten binären Suchbaum gespeichert (vgl. Abbildung 5 7 ). Abb. 5. Der Aufbau eines mehrdimensionalen Bereichsbaumes Diese Vorgehensweise ähnelt der, die bereits für den 2-dimensionalen Fall vorgestellt worden ist. D.h. der First Level-Baum dient dazu, O(log n) Knoten zu ermitteln, deren kanonische Teilmengen zusammen die Punkte beinhalten, deren erste Koordinate jeweils in dem vorgegebenen Bereich liegt. Diese kanonischen Teilmengen werden erneut betrachtet, wenn eine Bereichsanfrage auf den entsprechenden Second Level-Strukturen durchgeführt wird. In jeder Second Level-Struktur werden nun O(log n) kanonische Teilmengen ausgewählt. Daraus folgt, dass es insgesamt O(log 2 n) solcher Teilmengen in den Second Level-Strukturen gibt. Sie beinhalten demnach alle Punkte, deren erste und zweite Koordinate in dem definierten Bereich liegen. Im darauffolgenden Schritt werden die Third Level-Strukturen betrachtet, welche die kanonischen Teilmengen beinhalten, bei denen die dritte Koordinate in dem vorgegebenen Bereich liegt. Diese Vorgehensweise wird so lange rekursiv wiederholt, bis 7 Die Abbildung ist entnommen aus [1].

42 34 Jasmin Kovač-Engelmeier die 1-dimensionalen Bäume erreicht werden, in welchen die Punkte gespeichert sind, deren letzte Koordinate in dem definierten Bereich liegt. Diese Punkte werden dann schließlich als Ergebnismenge ausgegeben. Soweit es den benötigten Speicherplatz und das Laufzeitverhalten betrifft, so kann Folgendes festgehalten werden. Theorem 3. Sei P eine Menge von n Punkten in einem d-dimensionalen Raum, wobei d 2 gilt. Ein Bereichsbaum benötigt dann für P O(n log (d 1) n) Speicherplatz und O(n log (d 1) n) Konstruktionszeit. Somit können die Punkte aus P, die in einem orthogonalen Anfragebereich liegen, in O(log d n + k) Zeit ausgegeben werden. So bezeichnet k die Anzahl der auszugebenden Punkte. Für den Beweis dieser Aussagen wird angenommen, dass T d (n) für die Zeit steht, die für das Konstruieren eines Suchbaums auf Basis einer Menge von n Punkten in einem d-dimensionalen Raum benötigt wird. Laut Theorem 2 gilt T 2 (n) = O(n log n). Das Konstruieren eines d-dimensionalen Bereichsbaums basiert letztendlich auf dem Erzeugen eines balancierten binären Suchbaums, wofür O(n log n) Zeit benötigt wird, und das Bilden der verbundenen Strukturen. In dem First Level-Baum wird jeder Punkt in genau einer verbundenen Struktur gespeichert. Um alle verbundenen Strukuren zu erzeugen, wird O(T d 1 (n)) Zeit benötigt. Folglich ergibt sich die Gesamtkonstruktionszeit T d (n) = O(n log n) + O(log n) T d 1 (n). Wie bereits gezeigt, gilt T 2 (n) = O(n log n). Somit lässt sich die Rekursionsgleichung lösen und man erhält O(n log d 1 n). Die Ermittlung des Speicherbedarfs erfolgt analog. Es stellt sich nun die Frage nach der Zeit - im weiteren Verlauf mit Q d (n) bezeichnet -, die benötigt wird, um in einem d-dimensionalen Bereichsbaum eine Anfrage auf n Punkten durchzuführen. Zum einen ist es notwendig, eine Suche in dem First Level-Baum auszuführen, wofür ein Zeitbedarf von O(log n) anfällt. Des Weiteren ist eine logarithmische Anzahl von (d 1)-dimensionalen Bereichsbäumen zu durchsuchen. Somit folgt Q d (n) = O(log n) + O(log n) Q d 1 (n). Wie bereits gezeigt, gilt Q 2 (n) = O(log 2 n). Folglich lässt sich auch diese Rekursionsgleichung lösen und man erhält Q d (n) = O(log d n). An dieser Stelle fehlt nur noch die Zeit, die benötigt wird, um die ermittelten Punkte auszugeben. Diese ist auf O(k) beschränkt. 6 Fazit Es wurde gezeigt, dass ein 1-dimensionaler Bereichsbaum im Grunde ein gewöhnlicher binärer balancierter Suchbaum ist, der wiederum O(n) Speicherplatz und O(n log n) Konstruktionszeit für das Speichern von n Punkten einer Punktmenge benötigt. Im Worst case beträgt die Suchzeit Θ(n). Dieser Fall tritt ein, wenn alle Punkte in dem vorgegebenen Intervall liegen. Generell lässt sich aber die Suchzeit verbessern, indem man die tatsächlich auszugebene Punktmenge k in Betracht zieht. Dann erhält man eine Suchzeit von O(k + log n).

43 Bereichsbäume 35 Soweit es 2-dimensionale Bereichsbäume betrifft, so wurde im Verlauf der Ausführungen festgestellt, dass für diese O(n log n) Speicherplatz und eine Konstruktionszeit von O(n log n) benötigt wird. Bei der Ermittlung der Suchzeit wurde auch in diesem Fall die tatsächlich auszugebene Punktmenge k berücksichtigt, so dass sich eine orthogonale Bereichsanfrage dann in einer Zeit von O(log 2 n + k) beantworten lässt. Auf diesen Fall aufbauend, wurde zuletzt noch die Arbeitsweise von mehrdimensionalen Bereichsbäumen skizziert, welche eine Konstruktionszeit von O(n log d 1 n) und O(n log d 1 n) Speicherplatz benötigen. Eine orthogonale Bereichsanfrage kann dann in O(log d n + k) beantwortet werden. Diese Suchzeit in einem mehrdimensionalen Bereichsbaum kann noch mithilfe von Fractional Cascading auf O(log d 1 n + k) reduziert werden, indem der jeweils höchstdimensionale assoziierte Baum als Array gespeichert wird. Literaturverzeichnis 1. Mark de Berg and Mark van Kreveld and Mark Overmars and Otfried Schwarzkopf (1997) Computational Geometry: Algorithms and Applications. Springer-Verlag, Berlin Heidelberg, Seite Der Brockhaus in einem Band (2000). 9. Auflage. Brockhaus, Mannheim, Seite Thomas H. Cormen and Charles E. Leiserson and Ronald L. Rivest and Clifford Stein (2001) Introduction to Algorithms. 2. Auflage. MIT Press, Cambridge, Massachusetts u.a., Seite Rolf Klein (2005) Algorithmische Geometrie, 2. Auflage. Springer-Verlag, Berlin Heidelberg, Seite ,

44

45 A Simple Linear Time (1+ε)-Approximation Algorithm for k-means Clustering in Any Dimensions für k = 2 Holger Bürger Universität Paderborn Zusammenfassung. Diese Arbeit befasst sich mit dem Thema Clustering mit maximal 2 Schwerpunkten. Zu Grunde liegt das Paper A Simple Linear Time (1+ε)-Approximation Algorithm for k-means Clustering in Any Dimensions [14] 1 Einleitung Verwandte Themen Die Leistung von Kumar und anderen[14] Hauptteil Eigenschaften des 1-means Problems Ein Linearzeit-Algorithmus für das 2-means Clustering Schluß Literaturverzeichnis Einleitung Im Rahmen meines Proseminars Perlen der Theoretischen Informatik beschäftige ich mich laut Seminarbeschreibung mit der Schönheit von Problemlösungen aus dem Bereich der Theoretischen Informatik, mit raffinierten Beweistechniken, eleganten Argumenten und überraschenden Konstruktionen auf höchst vergnügliche Art und Weise und im Speziellen mit dem Thema Clustering. Dieses ist im Folgenden verschriftlicht. Laut Paper[14] ist das Problem des Clustering einer Gruppe von gleichen Datenobjekten eines der am meisten studierten in der Informatik. Clustering findet eine breite Anwendung, zum Beispiel bei data mining, Informationsbeschaffung, Bildverarbeitung, Internetsuche[5, 8, 10]. Clustering kommt original aus dem Englischen und ist mittlerweile ein deutsches Wort. Das Synonym Gruppenbildung läßt mehr auf die Bedeutung schließen. So wird beim data mining unter anderem versucht Gruppen in einem Datenbestand zu bilden, um Daten in sinnvolle Teilmengen aufzuspalten. Sinnvoll kann hier bedeuten, Kommunikationswege (beim Datenzugriff) zu verkürzen. Ein Beispiel in der Bildbearbeitung könnte die Vektorisierung eines Pixelbildes sein, dabei muss man unter anderem naheliegende Punkte zusammenfassen. Es wurde ausgesagt, dass bei dieser Vielfalt von Anwendungsformen es unterschiedliche Definitionen[9, 4] gibt. Die Meisten von diesen sollen mit der Definition eines Abstandes

46 38 Holger Bürger zwischen zwei Punkten beginnen und dann Cluster formen mit der Eigenschaft, dass zwei nahe gelegene Punkte zu einem Cluster zugeordnet werden. Eine weitere Aussage ist, dass meistens ein Zusammenhang zwischen Clustering und geometrischen Sachverhalten existiert, so dass Datenobjekte als Punkte in einem mehrdimensionalen Raum angesehen werden können. Unter diesen Rahmenbedingungen soll es nahe liegen, die Distanz zwischen diesen Punkten als euklidischen Abstand anzusehen. Als eine der meistgebrauchten Definitionen des Clustering wird das k-means Clustering Problem angesehen. Bei einer gegebenen Menge von Punkten P wird versucht eine Menge K zu finden, bei der k Schwerpunkte so zugeordnet werden, dass d(p, K) 2 (1) p P minimiert ist. Die Punkte in K können gewöhnliche Punkte im euklidischen Raum sein und mit d(p, K) ist der Abstand zwischen p und seinem am nächsten gelegenen Schwerpunkt gemeint. Die Punkte, welche dem gleichen Schwerpunkt zugeordnet werden, bilden einen Cluster. Das k-means Problem ist NP-hart, auch für k = 2. Des Weiteren soll es noch als gebräuchliche Defintion des Clusterings das k-median Problem geben. Dieses sei auf die gleiche Art und Weise definiert, außer dass folgende Formel zugrunde liegt. d(p, K) p P Zur Erinnerung: Ein Median war der Wert in der Mitte einer Stichprobe ( in der Mitte liegend ). Man beachte jedoch, dass hier nicht durch die Anzahl der Elemente geteilt wird. Der Unterschied der Formeln ist ungefähr der gleiche wie zwischen arithmetischem Mittel (Durchschnitt) und Varianz. Vorteil der Quadrierung von Elementen ist die stärkere Sichtbarkeit von Abweichungen. Zumindest ist es ebenfalls das Ziel die maximale Distanz zu minimieren(siehe [1, 2, 3, 11, 13] und beinhaltete Referenzen). Es ist jedoch zu beachten, dass die Distanzberechnung zwischen Punkten, welche hierbei gebraucht wird keine Metrik ist. Somit sei das Lösen des k-means Problems nicht schwerer als das des k-median Problems. Dies wird in dem Paper[14] bewiesen. Zur Erinnerung: Laut Taschenbuch der Mathematik [6],von Bronstein und anderen, ist eine Metrik eine mathematische Funktion, die je zwei Elementen eines Raums einen nicht negativen reellen Wert zuordnet, der als Abstand der beiden Elemente voneinander aufgefasst werden kann. Sei X eine beliebige Menge. Eine Abbildung d: X X R heißt Metrik, wenn für beliebige Elemente x, y und z von X die folgenden axiomatischen Bedingungen erfüllt sind: 1. d (x, x) = 0 (identische Punkte haben Abstand 0), 2. d (x, y) = 0 x = y(nichtidentische Punkte haben nicht Abstand 0), 3. d (x, y) = d(y, x) (Symmetrie), 4. d (x, y) d(x, z) + d(z, y) (Dreiecksungleichung).

47 (1+ε)-Approximation Algorithm for 2-Means Clustering 39 Die Dreiecksungleichung (4) besagt, dass der Abstand entlang dem direkten Weg, also entlang der kürzesten Verbindung zwischen zwei Punkten gemessen wird. Ein Umweg über einen dritten Punkt kann nicht kürzer als der direkte Weg sein. Dies gilt hier nicht. Die Aussagen des Papers [14] sind weiterhin, dass eine Menge Forschung betrieben wurde, um das k-means Problem exakt zu lösen(siehe [12] und enthaltene Referenzen). Jedoch selbst die besten Algorithmen brauchen Ω(n d ) Zeit. Bei der Suche nach konstanten (1+ε) Approximationsalgorithmen wurden neulich auch Fehler gemacht, indem mapping subjective features von Punkten im euklidischen Raum benutzt wurden, wobei ε eine gewöhnliche kleine Konstante sein kann. Dies führte zu Algorithmen mit einer stark verbesserten Laufzeit, doch das mapping bzw. Abbilden war fehlerhaft. In diesem Paper [14] wurde der erste echte Linearzeit (1+ε)-Approximationsalgorithmus für das k-means Clustering vorgestellt, wobei diese Proseminar-Arbeit nur Sachverhalte bis zum 2-means Clustering beschreibt und ε und k als Konstante betrachtet werden. Weiteres ist in der Seminararbeit von Markus Heberling zu finden, welcher sich weitergehend mit dem k-means Clustering beschäftigt. Es folgt die Beschäftigung mit bzw. Darstellung von den zugrundeliegenden Sachverhalten, welche sukzessive zum Beweis des... Simple Linear Time (1+ε)-Approximation Algorithm for k-means Clustering in Any Dimensions für k = 2 führt. 1.1 Verwandte Themen Kumar und andere [14] stellten fest, dass der schnellste exakte Algorithmus für das k- means clustering Problem von Inaba und anderen[12] eingebracht wurde. Diese berücksichtigten, dass die Anzahl der Voronoi Partitionen von k Punkten in R d O(n kd ) ist und so das optimale k-means clustering exakt in O(n kd+1 ) Zeit berechnet werden könnte. Inaba und andere haben ebenfalls einen randomisierten (1+ε)-Approximationsalgorithmus für das 2-means clustering Problem mit Laufzeit von O(n/ε d ) entwickelt. Matousek[15] soll einen deterministischen (1+ε)-Approximationsalgorithmus für das k-means Problem in Laufzeit von O(nε 2k2d log k n) entwickelt haben, Bâdoiu und andere [3] einen (1+ε)- Approximationsalgorithmus für das k-median Problem mit Laufzeit O(2 (k/ε)o(1) d O(1) nlog O(k) n). Letzterer soll erweitert werden können zu einem (1+ε)-Approximationsalgorithmus für das k-means Problem mit gleicher Laufzeit. W. F. de la Vega und andere [7] sollen einen (1+ε)- Approximationsalgorithmus für das k-means Problem erarbeitet haben, welcher gut auf Punkte im hoch dimensionalen Raum anzuwenden sei. Die Laufzeit sei O(g(k, ε)nlog k n) wobei g(k, ε) = exp[(k 3 /ε 8 )(ln(k/ε)lnk)] sein soll. Ebenfalls sollen kürzlich Har-Peled und andere[11] einen (1+ε)-Approximationsalgorithmus für das k-means Problem veröffentlich haben, mit einer Laufzeit von O(n + k k+2 ε (2d+1)k log k+1 nlog k 1 ε ). Dieser sei jedoch ziemlich kompliziert und soll sich auf Ergebnisse der algorithmischen Geometrie stützen. Das Wort exponentiell wurde dabei mit der Zahl der Dimension in Verbindung gebracht, so dass dies nur für geringere Dimensionen anwendbar sei. 1.2 Die Leistung von Kumar und anderen[14] Ein (1+ε)-Approximationsalgorithmus für das k-means Problem wird präsentiert. k und ε werden als Konstanten betrachtet. Die Laufzeit soll besser im Vergleich zu allen vorher bekannten Algorithmen für dieses Problem sein. Der Algorithmus von Har-Peled und Mazumdar[11] sei, trotz linear in n, nicht linear bezogen auf die Eingabegröße des Problems,

48 40 Holger Bürger es sei dn (für n Punkte und d Dimensionen). Der Algorithmus ist daher nur für kleinere Dimensionen besser geeignet und zwar für d = Ω(logn). Der hier vorgestellte Algorithmus sei viel schneller. Selbst die Verwendung des Johnson-Lindenstraus Lemmas mache die Laufzeit nicht vergleichbar, da es seinen eigenen Overhead haben soll. Viele der neueren Algorithmen verwenden Techniken, wie exponential grid oder scaling, welche ihren eigenen Overhead haben sollen. Beispielsweise Normalisierung in Verbindung mit minimaler Distanz zwischen Punkten verursache extra Kosten in Höhe von Ω(n) pro Punkt, abhängig von dem verwendeten Rechenmodell. In [3] sollen die Autoren Techniken für das Runden verwendet haben, basierend auf Approximation für den optimalen Wert des k-schwerpunktes ohne die Kosten für diesen Prozess zu berücksichtigen. Die in dem jetzigen Algorithmus eingebettete Technik habe keinen solchen Overhead. Das 2-means clustering Problem hat auch schon in der Vergangenheit Forschungsinteresse geweckt. Der Algorithmus von Amit Kumar und anderen [14] stellt einen (1+ε)- Approximationsalgorithmus für das 2-means clustering Problem mit konstanter Wahrscheinlichkeit in O(2 (1/ε)O(1) dn) dar. Dies sei, laut Kumar und anderen, der erste (im Exponenten) dimensionsunabhängige Algorithmus für das Problem, welcher in linearer Zeit zur Eingabegröße abläuft. Die Basisidee des Algorithmus sei sehr einfach. Begonnen wird, wie bei Inaba und anderen [12], mit der Betrachtung einer Menge von Punkten, wobei ihr Schwerpunkt durch Stichproben der Größe O(k) sehr gut approximiert werden kann. Es werden alle Teilmengen mit dieser konstanten Größe ausprobiert und deren Schwerpunkte bestimmt. Das bedeutet, dass man eine konstante Anzahl von Punkten dem größten Cluster zuordnet, bevor man kleineren Clustern Punkte zuordnet - dies sei die Vorgehensweise. Das heisst wiederum, dass der Algorithmus einen hohen konstanten Rechenaufwand produziert, aber im Sinne des O-Kalküls immernoch simpel wirkt. Der Algorithmus des Papers soll, in Anlehnung an dem von Bâdoiu und anderen [3], sehr einfach wirken. Beide beginnen mit der Zufallsauswahl von Punkten, jedoch muss der Algorithmus von Bâdoiu und anderen die Größe des kleineren Clusters raten und den Abstand zwischen diesen. Dies verursacht einen Faktor für die Laufzeit von O(log k n). Der Algorithmus von Kumar und anderen [14] vermeidet dies komplett - dies macht ihn so wesentlich einfacher. 2 Hauptteil Von Kumar und anderen wird definiert, dass P eine Menge von n Punkten im euklidischen Raum R d sei. Weiterhin sei eine Menge von k Punkten K gegeben, welche als Schwerpunkte bezeichnet werden. Definiert werden die k-means Kosten von P in Beziehung zu K, (P, K), als (P, K) = p P d(p, K) 2, wobei d(p, K) die Distanz zwischen p und dem nächsten Punkt zu p in K beschreibt. Das k-means Problem versucht eine Menge K von Größe k zu finden, so dass (P, K) minimiert ist. Sei k (P ) die Bezeichnung für die Kosten der optimalen Lösung für das k- means Problem in Beziehung zu P. Sollte K eine einelementige Menge sein y, wird (P, K) durch (P, y) ersetzt. Sollte P eine einelementige Menge sein, geschieht dies analog.

49 (1+ε)-Approximation Algorithm for 2-Means Clustering 41 Definition 1. Wenn k 1 (P ) (1 + 32ε) k (P ), ist die Menge von Punkten P (k, ε)- irreduzibel, sonst ist sie (k, ε)-reduzibel. Reduzierbarkeit impliziert hauptsächlich, dass nicht die optimale k-means Lösung gesucht wird, sondern die (k 1)-means Lösung. Dies soll nahe an der vorherigen Lösung liegen. Nun werden die Eigenschaften des 1-means Problems betrachtet. 2.1 Eigenschaften des 1-means Problems Definition 2. Für eine Menge von Punkten P wird der Schwerpunkt c(p ) von P als definiert. p P p P Für jeden Punkt in x R d gilt: (P, x) = (P, c(p )) + P (c(p ), x). (2) D.h. Abstand zwischen einer Menge P und einem Punkt x ist definiert als die Summe vom Abstand der Menge P zu seinem Schwerpunkt c(p ) und dem Produkt aus der Anzahl der Elemente von P und dem Abstand zwischen x und dem Schwerpunkt c(p ) von P. Im Paper wird nun Folgendes festgestellt: Ein Fakt ist, dass jede optimale Lösung für das 1-means Problem unter Einbeziehung der Menge von Punkten P als Eingabe, c(p ) als Schwerpunkt wählt. Es soll eine weitere wichtige Eigenschaft für jede optimale Lösung des k-means Problems gefolgert werden können. Angenommen eine optimale Lösung des k-means Problems unter Einbeziehung der Eingabe P sei gegeben. Sei K = {x 1,..., x k } eine Menge von Schwerpunkten, welche durch diese Lösung konstruiert wurde. K verursacht eine Partitionierung der Menge von Punkten P in k Cluster, nämlich P 1,..., P k. P i ist die Menge von Punkten für welche der nächste Punkt in K x i ist. In anderen Worten, die Cluster korrespondieren mit den Punkten in den Voronoi-Regionen in R d in Beziehung zu K. Der gerade genannte Fakt impliziert nun, dass für alle i x i der Schwerpunkt von P i sein muss. Diese Feststellung scheint trivial. Kumar und andere sagen aus, dass das Interesse in schnellen Algorithmen der Berechnung guter Approximationen für das k-means Problem gilt. Der Fall k = 1 wird zuerst berücksichtigt. Inaba und andere [12] zeigten, dass der Schwerpunkt einer kleinen zufälligen Stichprobe von Punkten aus P eine gute Approximation für c(p ) sein kann. Lemma 1. [12] Sei T eine Menge von m Punkten, erhalten durch die zufällige, unabhängige, gleichmäßige Auswahl von m Punkten aus einer Menge von Punkten P. Dann gilt für jedes δ > 0, ( (T, c(t )) < ) 1 (P ) δm mit einer geringsten Wahrscheinlichkeit von 1 δ. Den Sachverhalt des Lemmas 1 aus [12] haben Kumar und andere als Voraussetzung benutzt. Falls m mit der Eigenschaft 2 ε gewählt wird, erhält man mit einer minimalen Wahrscheinlichkeit von 1/2 eine gute (1 + ε)-approximation für 1 (P ), aufgrund der Wahl des Zentrums von T gleichzeitg als Schwerpunkt für T und damit der approximierten 1-means Lösung für P. Also erhält man durch Auswahl einer konstanten Größe schnell eine, im Sinne von

50 42 Holger Bürger Kumar und anderen, gute Approximation für die optimale 1-means Lösung. Würde man δ sehr viel kleiner wählen, würde zwar die Wahrscheinlichkeit größer werden, aber damit auch die Ungenauigkeit. Letzterem könnte man wiederum nur durch die Auswahl von mehr Punkten entgegenwirken. Daraufhin wird angenommen P sei eine Teilmenge von P und man möchte eine gute Approximation für das optimale 1-means Problem für die Menge P finden. Lemma 1 folgend, würde man von P Punkte zur Berechnung auswählen. Ein Problem sei aber, dass P nicht explizit gegeben ist. Das folgende, ebenfalls aus dem Paper stammende Lemma 2 sagt aus, wenn die Größe von P nahe der Größe von P ist, kann man eine leicht größere Anzahl von Punkten aus P auswählen und hofft, dass diese Zufallsauswahl genug Punkte von P enthält. In dem Paper werden jedoch vorerst folgende Sachverhalte weiter formalisiert. Sei P eine Menge von Punkten und P eine Teilmenge von P, mit der Eigenschaft, dass P β P, wobei β eine Konstante zwischen 0 und 1 ist. Angenommen man bestimmt eine Auswahl S von P mit der Größe 4 βε. Nun betrachtet man alle möglichen Teilmengen von S, genannt S, mit der Größe 2 ε. P β P P P β Dann stelle man sich folgende Verhältnisgleichung vor: P verhält sich zu 4 βε, wie P zu x. Dies ergibt dann: P P = x 4 βε Will man nun x ausrechnen, erhält man: 4 βε P P = 4 βε β = 4 ε Dabei wurde gleich P P durch β ersetzt und man erhielt letztendlich 4 ε. Ziel war es, die 1-means Lösung für P zu finden. Wir haben aber nur die Menge P gegeben und wissen, das durch eine zufällige, unabhängige, gleichmäßige Stichprobenauswahl nach Lemma 1 die Lösung approximiert werden kann. Also haben wir durch eine Stichprobenauswahl von P mit der Größe 4 βε sogar eine größere Stichprobe für die unbekannte Teilmenge P ( 4 ε anstatt 2 ε ) zur Verfügung, um das Problem zu lösen. Für jede dieser Teilmengen S berechnet man nun den Schwerpunkt c(s ) und betrachtet es als potenzielles Zentrum für die 1-means Probleminstanz von P. Anders ausgedrückt, man betrachtet (P, c(s )) für alle Teilmengen S. Das folgende Lemma soll zeigen, dass eine dieser Teilmengen eine Approximation für eine optimale 1-means Lösung für P ergibt, welche genau genug ist. Lemma 2. (Superset Sampling Lemma) Das Folgende gilt mit konstanter Wahrscheinlichkeit: min S :S S, S = 2 ε (P, c(s )) (1 + ε) 1 (P ) Beweis. Mit konstanter Wahrscheinlichkeit enthält S mindestens 2 ε Punkte von P. Der Rest folgt aus Lemma 1.

51 (1+ε)-Approximation Algorithm for 2-Means Clustering 43 Es wird die Standardnotation B(p, r) benutzt, um die offene Kugel mit Radius r um einen Punkt p zu beschreiben. Es wird angenommen, dass für den Eingabeparameter ε, welcher im Faktor der Approximation enthalten ist, gilt: 0 < ε Ein Linearzeit-Algorithmus für das 2-means Clustering Theorem 1. Gegeben sei eine Menge von n Punkten P im R d. Es existiert ein Algorithmus, welcher eine (1 + ε)-approximation für die optimale 2-means Lösung der Menge P mit konstanter Wahrscheinlichkeit berechnet. Seine Laufzeit beträgt O(2 1/ε)O(1) dn). Man beachte, dass das ε im Bruch des Exponenten der Laufzeit, wie weiter oben beschrieben, zwischen 0 und 1 liegt. Das bedeutet der Bruch ist gross, die Laufzeit damit lang, aber sie ist linear zur Eingabe. Kumar und andere beweisen dies wie folgt: Beweis. Sei α = ε/64. Es kann angenommen werden, das P (2, α)-irreduzibel ist. Aufgrund eines Widerspruchbeweises nimmt man an, dass P (2, α)-reduzibel ist. Dann ist, aufgrund von Definition 1, 1 (P ) (1+ε/2) 2 (P ). Man kann eine Lösung für das 1-means Problem für P bekommen, in dem man den Schwerpunkt von P in O(n d ) Zeit ausrechnet, also den Durchschnitt der Koordinaten pro Dimension. Die Kosten für dieses Problem sind höchstens (1 + ε/2) 2 (P ). So hätte man das Theorem gezeigt, wenn P (2, α)-reduzibel wäre. Angenommen es gäbe eine optimale 2-means Lösung für P. Seien c 1 und c 2 die beiden Zentren dieser Lösung. Seien P 1 die Punkte, welche näher an c 1 als an c 2 und P 2 die Punkte, welche näher an c 2 als an c 1 sind. So ist c 1 der Schwerpunkt von P 1 und c 2 der Schwerpunkt von P 2. Ohne Beschränkung der Allgemeinheit kann angenommen werden, dass P 1 P 2. Da P 1 P /2, impliziert Lemma 2, dass wenn man eine Stichprobe S der Größe O( 1 ε ) aus der Menge P nimmt und betrachtet die Menge der Schwerpunkte aller Teilmengen von S der Größe 2 ε, dann hat mindestens einer dieser Schwerpunkte, genannt c 1, die Eigenschaft (P 1, c 1 ) (1+α) (P 1, c 1 ). Da dieser Algorithmus [14] alle Teilmengen von S durchläuft, kann angenommen werden, dass solch ein Punkt c 1 gefunden wurde. Sei t die Distanz zwischen c 1 und c 2, also d(c 1, c 2 ) = t. Lemma 3. d(c 1, c 1 ) t/4 Beweis. Aufgrund eines Widerspruchbeweises wird angenommen, dass d(c 1, c 1 ) > t/4 ist. Gleichung 2 impliziert (P 1, c 1 ) (P 1, c 1 ) = P 1 (c 1, c 1 ) t2 P Bemerkung: x aus Gleichung 2 ist hier c 1 und (P 1, c 1 ) wurde von der Gleichung subtrahiert. t2 P 1 16 entsteht aus Gleichung 1, so ist (c 1, c 1 ) = d(c 1, c 1 )2 und dies ist wiederum laut Annahme (t/4) 2 = t2 16. (c 1, c t2 1 ) wurde also im rechten Teil durch 16 substituiert. Man weiss ebenfalls, dass die linke Seite höchstens α (P 1, c 1 ) beträgt. Daraus ergibt sich t 2 P 1 16α (P 1, c 1 ). Gleichung 2 nochmal angewendet ergibt weiterhin

52 44 Holger Bürger (P 1, c 2 ) = (P 1, c 1 ) + t 2 P 1 (1 + 16α) (P 1, c 1 ). Daher ist (P, c 2 ) (1 + 16α) (P 1, c 1 ) + (P 2, c 2 ) (1 + 16α) 2 (P ). Dies widerspricht dem Fakt, das P (2, α)-irreduzibel ist. Nun wird die Kugel B(c 1, t/4) betrachtet. Das vorhergehende Lemma impliziert, dass sich diese Kugel in der Kugel B(c 1, t/2) mit 0 t/4 t/2 3t/4 t c 1 c 1 Abb. 1. Verhältnis zwischen B(c 1, t/4) zwischen B(c 1, t/2) Radius t/2 und Mittelpunkt c 1 befindet. So beinhaltet P 1 B(c 1, t/4). Da nach dem Punkt c 2 gesucht wird, können die Punkte dieser Kugel gelöscht werden und es wird gehofft, dass die verbleibende Menge von Punkten eine guten Anteil an Punkten von P 2 enthält. In dem zugrundeliegenden Paper wird dies als nächstes bewiesen. Sei P 1 die Menge von Punkten P 1 B(c 1, t/4). Sei P die Menge P 1 P 2. Wie gerade erwähnt ist P 2 Teilmenge von P. Behauptung. P 2 α P 1 Beweis. Aufgrund eines Widerspruchbeweises wird angenommen, dass P 2 α P 1 ist. Beachte (P 1, c 1 ) (P 1, c 1 ) t2 P 1 16 Aus (P 1, c 1 ) (1 + α) (P 1, c 1 ) folgt Weiterhin (P, c 1 ) = (P 1, c 1 ) + (P 2, c 1 ) = (P 1, c 1 ) + (P 2, c 2 ) + t 2 P 2 (P 1, c 1 ) + (P 2, c 2 ) + 16α(1 + α) (P 1, c 1 ) (1 + 32α) (P 1, c 1 ) + (P 2, c 2 ) (1 + 32α) 2 (P ) t 2 P 1 16(1 + α) (P 1, c 1 ) (3) folgt die 2. Gleichung aus 2, während die 3. Ungleichung aus 3 und dem Sacherverhalt

53 (1+ε)-Approximation Algorithm for 2-Means Clustering 45 P 2 α P 1 folgt. Dies widerspricht jedoch dem Fakt das P (2, α)-irreduzibel ist. Dies beweist die Behauptung. Kumar und andere kombinieren nun Lemma 1 und die vorhergehende Behauptung und implizieren damit, dass wenn eine Stichprobe von O( 1 ) Punkten von P genommen wird α 2 und man die Schwerpunkte aller Teilmengen von Größe 2 α dieser Stichprobe betrachtet, dann sollte mit konstanter Wahrscheinlichkeit ein Punkt c 2 gefunden werden, für den (P 2, c 2 ) (1 + α) (P 2, c 2 ) zutrifft. Aufgrund dessen finden sie die Schwerpunkte c 1 und c 2, welche die Vorraussetzungen für das Lemma 3 erfüllen. Das einzige Problem besteht darin, dass der Parameter t nicht bekannt ist. Dieser muss geraten werden, wobei die Eigenschaft des Algorithmus, dass er nur lineare Zeit zur Eingabe verbraucht, nicht verletzt werden dürfe. Sie schrieben, das angenommen werden darf, dass c 1 (unabhängig von t) gefunden wurde. Es müsse von P (alle Punkte der Menge P, außer denen, welche innerhalb der Kugel B(t/4,c 1 ) lagen) eine Stichprobe genommen werden. Angenommen man kenne den Parameter i, so dass n P n gilt. Betrachte man nun die Punkte in P in absteigender 2 i 2 i 1 Reihenfolge der Distanz zu c 1. So seien Q i die ersten n Punkte in dieser Sequenz. Man 2 i 1 beachte, dass P eine Teilmenge von Q i ist und P Q i /2. Ebenfalls kann Q i in linearer Zeit gefunden werden, da man den Punkt an der Position n in linearer Zeit finden kann. 2 i 1 Aus P 2 α P ergibt sich P 2 α Q i /2. Folglich impliziert Lemma 1, dass es ausreichend ist O( 1 ) Punkte von Q α 2 i zu nehmen, um c 2 mit konstanter Wahrscheinlichkeit zu lokalisieren. Ein Problem sei jedoch, dass nun der Wert von i unbekannt ist. Alles auszuprobieren kostet O(n log n) Zeit, unter der Bedingung, dass α und d als Konstante betrachtet werden. Approximierende Distanzsuche könne ebenfalls nicht verwendet werden kann, da die Vorverarbeitung ebenfalls O(n log n) Zeit brauchen würde. Die Idee der Stichprobennahme und das Raten des Wertes i wurde kombiniert. Der zugrundeliegende Algorithmus verfährt wie folgt: Er probiert Werte für i in der Reihenfolge 0, 1, 2,.... Mit der Iteration von i wird die Menge Q i gefunden. Man beachte, dass Q i+1 eine Teilmenge von Q i ist. Genauer betrachet ist Q i+1 die Hälfte von Q i und weiter von c i entfernt. So wird in Iteration (i + 1) begonnen durch Stichprobenentnahme aus Menge Q i, anstelle von P um den Punkt c 2 zu finden. Folglich wird Q i+1 in linearer Zeit zu Q i+1 gefunden. Die folgende Grafik soll nocheinmal den Sachverhalt für n=8 verdeutlichen. Die Rahmen sind jeweils mit dem Wert für i beschriftet. i=3 i=2 i=1 i=0 c 1 t Abb. 2. Punkte der Menge Q i für n=8 und verschiedene i

54 46 Holger Bürger Die weitere Iteration von i führt außerdem zu der Summe (P Q i+1, c 1 ). Weil (P Q i+1, c 1 ) = (P Q i, c 1 ) + (Q i Q i+1, c 1 ) ist, kann (P Q i+1, c 1 ) in Interation i + 1 in linearer Zeit zu Q i+1 berechnet werden. Dies wird benötigt, da Kumar und andere c 2 in Iteration i+1 finden. Dann wird die 2-means Lösung berechnet, wenn alle Punkte P Q i c 1 zugewiesen sind und die Punkte in Q i dem näheren von c 1 und c 2 zugewiesen wurden. Dies wird in linearer Zeit zu Q i+1 getan, wenn die Beträge zu (P Q i, c 1 ) für alle i bestimmt wurden. Kumar und andere merken an, dass daraufhin ersichtlich ist, dass die Iteration i lineare Zeit zu Q i benötigt. Da sich der Betrag von Q i um Faktor 2 verringert, beträgt die gesamte Laufzeit für einen gegebenen Wert von c 1 O(21/αO(1) dn). Da es für c 1 auch nur O(2 1/αO(1) ) Möglichkeiten gibt, ist die Laufzeit konstant. Behauptung. Die Kosten des Algorithmus liegen zwischen 2 (P ) (1 + α) 2 (P ). Nun folgt der letzte Beweis, wortwörtlich übersetzt. Beweis. 2 (P ) ist offensichtlich, da jedem Punkt eines der beiden Zentren zugeordnet wird, unter damit verbundenen Kosten. Nun wird die Menge von Zentren betrachet, wobei jedes Zentrum ein (1 + α)-approximierter Schwerpunkt seines entsprechenden Clusters ist. Wenn jeder Punkt einem approximierten Schwerpunkt eines entsprechenden Clusters zugeordnet wird, folgt daraus, dass (1 + α) 2 (P ) ist. Wenn die minimalen Kosten C betrachtet werden, können die konkreten Kosten nur besser sein als die Kosten dieses Algorithmus [14], da nur approximierte Schwerpunkte verwendet werden, aufgrund der in Beziehung stehenden Voronoi-Partitionen. werden. So ergibt sich (C) (1+α) 2 (P ). 3 Schluß Zusammenfassend ist zu sagen, dass dieser Algorithmus im Vergleich zu den anderen, in der Einleitung angesprochenen Algorithmen tatsächlich sehr einfach wirkt. Als erstes wurde festgestellt, dass die maximalen Abstände von Punkten zu ihren Schwerpunkten zu minimieren sind. Dann wurde der Sachverhalt verwendet, dass es möglich ist, bei einer Menge von Punkten P, für eine unbekannte Untermenge P eine gute Approximation durch das Durchprobieren aller möglichen Teilmengen bestimmter Größe von P für das 1-means Problem zu finden. Daraufhin wurde dem ersten größeren Cluster viele Punkte zugeordnet und einem weiteren Cluster Punkte durch Zufallsauswahl zugeordnet, dies mit einer linearen Laufzeit zur Eingabegröße im Sinne des O-Kalküls. Jedoch wurde festgestellt, dass dieser Algorithmus einen starken konstanten Rechenaufwand produziert. Das die Brauchbarkeit dieses Algorithmus für kleinere Dimensionen und Eingabegröße eher gering ist, wird in der Seminararbeit von Markus Heberling des gleichen Seminars noch näher erläutert. Literaturverzeichnis 1. S. Arora, P. Raghavan und S. Rao, 1998, Approximation schemes for euclidean k-medians and related problems. In Proceedings of the thirtieth annual ACM symposium on Theory of computing, Seite ACM Press.

55 (1+ε)-Approximation Algorithm for 2-Means Clustering V. Arya, N. Garg, R. Khandekar, K. Munagala und V. Pandit, 2001, Local search heuristic for k-median and facility location problems. In Proceedings of the thirty-third annual ACM symposium on Theory of computing, Seite ACM Press. 3. M. Bâdoiu, S. Har-Peled and P. Indyk, 2002, Approximate clustering via core-sets. In Proceedings of the thirty-fourth annual ACM symposium on Theory of computing, Seite ACM Press. 4. M. Bern und D. Eppstein, 1997, Approximation algorithms for geometric problems. Seite A. Broder, S. Glassman, M. Manasse und G. Zweig, 1997, Syntactic clustering of the web. In Proceedings of the 6th International World Wide Web Conference. 6. I. N. Bronstein, K. A. Semendjajew, G. Musiol und H. Mühlig, 2001, Taschenbuch der Mathematik, 5. überarbeitete und erweiterte Auflage, Seite 624. Verlag Harri Deutsch. 7. W.F. de la Vega, M. Karpinski, C. Kenyon und Y. Rabani, 2003, Approximation schemes for clustering problems. In Proceedings of the thirty-fifth annual ACM symposium on Theory of computing, Seite ACM Press. 8. S. Deerwester, S. Dumais, G. Furnas, T. Landauer und R. Harshman, 1990, Indexing by latent semantic analysis. 9. R. O. Duda, P. E. Hart und D. G. Stork, 2000, Pattern Classification. Wiley-Intersience Publication. 10. C. Faloutsos, R. Barbar, M. Flickner, J. Hafner, W. Niblack, D. Petkovic und W. Equitz, 1994, Efficient and effective querying by image content. J. Intell. Inf. Syst., 3(3-4): S. Har-Peled and S. Mazumdar, 2004, On coresets for k-means and k-median clustering. In Proceedings of the thirty-sixth annual ACM symposium on Theory of computing, Seite ACM Press. 12. M. Inaba, N. Katoh, und H. Imai, 1994, Applications of weighted voronoi diagrams ans randomization to variance-based k-clustering: (extended abstract). In Proceedings of the tenth annual symposium on Computational geometry, Seite ACM Press. 13. S. Kolliopoulos and S. Rao, 1999, A nearly linear time approximation scheme for the euclidean k-medians problem. In Proceedings of the 7th European Symposium on Algorithms, Seite Amit Kumar and Yogish Sabharwal and Sandeep Sen, 2004, A Simple Linear Time (1 + ε) - Approximation Algorithm for k-means Clustering in Any Dimensions. In Proceedings of the 45th Annual IEEE Symposium on Foundations of Computer Science, Seite J. Matousek, 2000, On approximate geometric k-clustering. In Discrete and Computational Geometry, Seite

56

57 Skalierbare Peer-to-Peer-Netzwerke Andreas Vogelsang Universität Paderborn Zusammenfassung. Peer-to-Peer-Netzwerke (P2P-Netzwerke) verursachen allein in Deutschland inzwischen über 69% des Verkehrsaufkommens im Internet [4]. Besonders die große Anzahl an Teilnehmern und die hohe Inhomogenität der Teilnehmer untereinander, macht es schwierig ein P2P-Netzwerk zu konzipieren, das in Bezug auf eine Datumssuche gut skalierbar ist. In dieser Arbeit wird, neben einer Einführung in die Welt der P2P-Netzwerke, mit dem Content-Adressable Network (CAN) ein P2P-Netzwerk vorgestellt, das unter Verwendung von Distributed Hash Tables eine effiziente und gut skalierbare Datumssuche bereitstellt. 1 P2P-Netzwerke Einleitung Entstehung, Geschichte, Vorteile Napster Gnutella DHT Distributed Hash Tables Motivation Hash Tables Distributed Hash Tables CAN Content-Addressable Network Einleitung Verwendung von DHT in CAN Funktionsweise und Analyse Verbesserungsmöglichkeiten Zusammenfassung Literaturverzeichnis P2P-Netzwerke In diesem Kapitel soll eine Einführung in das Thema P2P-Netzwerke gegeben werden. Neben einer Definition sowie Daten zur Entwicklung und Geschichte werden mit Napster und Gnutella zwei bekannte und bedeutende Netzwerke vorgestellt. Abbildungen und Inhalt sind angelehnt an [5].

58 50 Andreas Vogelsang 1.1 Einleitung Als Peer-to-Peer Netzwerke (P2P-Netzwerke) werden Netzwerke bezeichnet, in denen alle Teilnehmer gleichbehandelt werden. Das Netzwerk verwaltet und organisiert sich vollständig selbst ohne zentrale Instanz oder höhergestellte Teilnehmer. Die Teilnehmer eines P2P-Netzwerks werden als Peers (dt.: Gleichrangige, Ebenbürtige) bezeichnet. Diese Idee steht im Gegensatz zu der vorherrschenden Client-Server-Netzwerk-Struktur, bei der jeder Teilnehmer entweder die Rolle des Dienstanbieters (Server) oder die des Dienstkonsumenten (Client) annimmt. Die Verwaltung des Netzwerkes wird dabei meistens ausschließlich von den Servern übernommen. Diese Rollenverteilung wird in einem P2P-Netzwerk derart aufgebrochen, dass jeder Teilnehmer gleichzeitig die Rolle des Servers und des Clients annehmen kann. Daraus folgt auch, dass die Verwaltung des Netzwerkes von allen Teilnehmern gleichermaßen übernommen wird. Ein P2P-Netzwerk ist gut skalierbar, wenn es bei steigender Teilnehmer-, oder Datenlast nicht übermäßig an Leistung verliert, oder gar ausfällt. Der Begriff Robustheit beschreibt das Verhalten des Netzwerks bei ausfallenden Teilnehmern, oder anderen unerwarteten Ereignissen. P2P-Netzwerke sind in der Regel Overlay Netzwerke, die auf das bestehende Internet aufgesetzt werden. Das heißt, auf die bestehende Netzwerkstruktur des bekannten Internets wird auf Anwendungsebene eine zusätzliche Netzwerkstruktur aufgesetzt, die das P2P-Netzwerk darstellt. Dieses kann zu Verwirrungen führen, wenn man über Eigenschaften des P2P- Netzwerks spricht, denn das P2P-Netzwerk ist unabhängig von dem darunter liegenden Internet zu betrachten. So können zum Beispiel zwei unmittelbar benachbarte Teilnehmer eines P2P-Netzwerks im darunter liegenden Internet viele tausend Kilometer oder Routerhops entfernt sein. 1.2 Entstehung, Geschichte, Vorteile Das erste Netzwerk, das als P2P-Netzwerk bekannt wurde, war Napster, welches Shawn Napster Fanning 1999 herausbrachte. Die Software, deren ursprüngliche Aufgabe die Bereitstellung eines File-Sharing-Systems war, erlangte schnell Popularität, da sie von vielen missbraucht wurde um urheberrechtlich geschützte Musik bereitzustellen oder herunterzuladen. Die immer weiter steigende Beliebtheit führte zusammen mit den sinkenden Zahlen der CD-Verkäufe dazu, dass die Musikindustrie immer stärkeren juristischen Druck auf die Betreiber von Napster ausübte, was schließlich Ende 2000 zur Schließung dieses P2P-Netzwerks führte. Ironischerweise hing das abrupte Ende umittelbar mit der Tatsache zusammen, dass Napster kein P2P-Netzwerk im eigentlichen Sinne war, sondern eine zentrale Instanz zur Verwaltung der Indexdaten hatte. Mehr dazu in Kapitel 1.3. Nach dem Scheitern von Napster versuchten viele Entwickler, den Kerngedanken der P2P- Netzwerke stärker in eine Implementierung einfließen zu lassen. Ein Ergebnis war das Gnutella Netzwerk, dessen Client-Software im Jahr 2000 von Justin Frankel zum kostenlosen Download freigegeben wurde. Da dieses Netz völlig ohne zentrale Instanzen auskommt, ist es praktisch unangreifbar, denn es existiert, sobald nur ein Teilnehmer im Netz ist. Ausführlicher wird Gnutella im Kapitel 1.4 beschrieben. Im Laufe der Jahre kamen immer mehr Protokolle und Implementierungen auf den Markt, die immer leistungsfähigere P2P-Netzwerke zur Verfügung stellten.

59 Skalierbare Peer-to-Peer-Netzwerke 51 Im Jahr 2008 werden P2P-Netzwerke zu verschiedensten Zwecken verwendet. Neben P2P- File-Sharing Netzen wie Bittorrent [1] existieren auch P2P-VoIP-Netze wie Skype [2] oder P2P-Netzwerke, die als Ziel haben, die Anonymität und somit das Grundrecht auf Meinungsäußerung zu sichern wie z.b. das Freenet [3]. Studien haben ergeben, dass in Deutschland über 69% des Verkehrsaufkommens im Internet über P2P Protokolle verursacht werden [4]. 1.3 Napster Einleitung Napster war das erste als P2P-Netzwerk bezeichnete Netzwerk. Im Juni 1999 stellte Shawn Napster Fanning eine Beta-Version der zum Netz gehörigen Client Software zum kostenlosen Download bereit. Durch das Engagement eines Freundes von Fanning wurde das Netz, welches ursprünglich ein File-Sharing-System bereitstellen sollte, zu einem Portal zur Verbreitung von Musikdateien. Diese Funktionalität brachte der Software eine hohe Popularität und machte sie bereits im Herbst 1999 zum Download des Jahres [5]. Die einfache und schnelle Verbreitung von Musikdateien über Napster zog allerdings zahlreiche Verstöße gegen das Urheberrecht nach sich, so dass Napster Ende 2000 unter dem juristischen Druck der Musiklabels geschlossen werden musste. Im Anschluss ging Fanning einen Kooperationsvertrag mit Bertelsmann Ecommerce ein und vermarktet seitdem ein Client-Server-basiertes kommerzielles File-Sharing-System unter dem Namen Napster. Funktionsweise Abb. 1. Die Funktionsweise von Napster

60 52 Andreas Vogelsang So rasant der Popularitätsanstieg von Napster war, so einfach ist die Funktionsweise. Wie Abbildung 1 zeigt, melden sich alle Teilnehmer des Netzwerks an einem Server an. Eine Dateianfrage (Query) wird von einem Client zum Beispiel in Form des zu suchenden Dateinamens an den Server übermittelt. Auf dem Server sind Informationen zu der entsprechenden Datei gespeichert. Unter anderem besitzt der Server eine Liste von Netzteilnehmern, die diese Datei lokal bei sich gespeichert haben. Der Server schickt dem anfragenden Client eine Reply-Nachricht als Antwort, die eine Liste mit allen Clients enthält, die die gesuchte Datei bereitstellen. Die gesuchte Datei kann nun direkt von den Teilnehmern heruntergeladen werden. Evaluierung Napster war zwar das erste Netzwerk, das unter dem Namen P2P-Netzwerk bekannt wurde, aber nach der in Kapitel 1.1 gegebenen Definition handelt es sich bei Napster nicht um ein reines P2P-Netzwerk. Genauer gesagt entspricht lediglich der direkte Dateidownload von einem anderen Teilnehmer des Netzes der Definition. Die Suche nach einer bestimmten Datei und das Herausgeben der Kontaktdaten zu Besitzern dieser Datei wird über eine zentrale Instanz, den Server, organisiert. Gerade dieser Umstand machte es möglich, dass Napster von einem auf den anderen Tag geschlossen werden konnte. Nachdem die Server, die für die Dateisuche zuständig waren, abgeschaltet wurden, konnte kein Teilnehmer des Netzes mehr eine erfolgreiche Suchanfrage starten. Stärken Napster ist eine vergleichsweise einfache Möglichkeit, ein schnelles und effizientes File- Sharing-System zu implementieren. Durch die Client-Server-Struktur ist es für die Betreiber einfach zu organisieren und zu koordinieren. Wenn eine Datei im Netzwerk vorhanden ist, dann wird sie durch die Dateisuche auch gefunden und kann direkt heruntergeladen werden. Schwächen Die großen Nachteile der in Napster genutzten Client-Server-Struktur liegen in den Bereichen Robustheit und Skalierbarkeit. Bei Ausfall des verwendeten Servers ist das ganze Netz funktionsunfähig. Es handelt sich also bei dem Server um einen sogenannten single point of failure. Das Netz ist an dieser Stelle von außen besonders angreifbar. Ebenso kann ein gesteigertes Datei- oder Teilnehmeraufkommen den Server, der diesen verwalten muss, überlasten und so ebenfalls zu einem Zusammenbruch des Netzes führen. Erkenntnisse Die hohe Popularität Napsters ließ erahnen, welche Möglichkeiten P2P-Netzwerke bieten. Viele Wissenschaftler und Firmen forschten in Folge an weiterentwickelten Netzwerken. Dabei wurden die bei Napster aufgetauchten Schwächen schnell zu Kernfeldern der Weiterentwicklung. Vor allem die Entwicklung einer verteilten Indexsuche, die es ermöglicht, Dateien ohne eine zentrale Instanz im Netzwerk effizient zu finden, ist eine der wichtigsten Problemstellungen beim Entwurf eines P2P-Netzwerks.

61 Skalierbare Peer-to-Peer-Netzwerke Gnutella Einleitung Im März 2000 stellten Justin Frankel und Tom Pepper von der Firma Nullsoft das Gnutella- Netzwerk [6] vor. Bei dem Versuch, die Schwächen des in Kapitel 1.3 vorgestellten Napster auszumerzen, entstand ein P2P-Netzwerk, das diesen Namen auch in allen Teilen des Netzes verdient. Wie Napster auch ist Gnutella ein reines File-Sharing-System und bietet daher von der Funktionsweise wenig Innovatives. Die Netzwerkstruktur und die Indexsuche jedoch setzt sich deutlich von der in Napster ab. Funktionsweise Jeder Teilnehmer des Gnutella Netzwerkes verwaltet eine Menge von Nachbarknoten. Um eine solche Menge zu erhalten, kontaktiert ein neuer Peer des Netzwerkes eine Reihe von Peers, deren Adressen er durch eine Initialliste, die mit der Clientsoftware ausgeliefert wird, erhält. Der Kontakt wird hergestellt, indem der neue Peer eine sogenannte Ping-Nachricht nacheinander an die Peers der Initialliste schickt. Der erste Peer der Liste, der aktiv ist, antwortet mit einer Pong-Nachricht und leitet die Ping-Nachricht an alle Peers seiner Nachbarmenge weiter. Diese verfahren in derselben Weise bis zum k-nächsten Nachbarn des ersten kontaktierten Peers. Pong-Nachrichten werden auf dem selben Weg zurückgesendet, wie die dazu gehörige Ping-Nachricht. Der neue Peer erhält so durch den Empfang von Pong-Nachrichten eine Liste von aktiven Peers. Aus diesen Peers sucht sich der neue Peer zufällig m Peers aus, die dann seine Nachbarschaft definieren. Der Enstehungsprozess der Gnutella-Netzwerkstruktur ist also völlig zufällig und bedarf keiner zentralen Instanz (wie etwa bei einem Server) außer dem sogenannten TTL-Feld (time to live), das die Tiefe k der Rekursion festlegt, indem es bei jeder Ping-Nachrichten-Weiterleitung um eins verringert wird. Die Dateisuche ist analog zum Anmeldeprozess. Eine Query-Nachricht wird rekursiv an alle Nachbarn bis zur Tiefe k geschickt und von einem Peer p mit einer QueryHit-Nachricht beantwortet, wenn die gesuchte Datei von p bereitgestellt werden kann. Der Initiator der Suche kann die Datei dann direkt von Peers herunterladen, die ihm mit einem QueryHit geantwortet haben (siehe auch Abbildung 2). In Algorithmus 4 und 5 ist die Indexsuche von Gnutella in Pseudo-Code angegeben. Algorithmus 4 Dateisuche in Gnutella(1): Suche(Datei x, Knoten p) Vorbedingung: Knoten p sucht Datei x. Sei N die Menge der Nachbarn von p. Download(p, x) startet den direkten Download der Datei x vom Knoten p. for all n N do send Query(p, x, T T L) to n wait until receipt of a QueryHit or timeout if receipt a QueryHit(p, x) then download(p, x)

62 54 Andreas Vogelsang Algorithmus 5 Dateisuche in Gnutella(2): Empfang eines Query(Knoten p, Datei x, int T T L) bei einem Knoten p Vorbedingung: Knoten p hat Query(p, x, T T L) von Knoten p mit der Anfrage nach Datei x und time-tolive Wert T T L empfangen. Sei DB die lokale Datenbasis des Knotens p und N die Menge der Nachbarn von p. if x DB then send QueryHit(p, x) to p if T T L 0 then for all n N do send Query(p, x, T T L 1) to n while not timeout do On receipt of a QueryHit(q, x) send QueryHit(q, x) to p Abb. 2. Die Dateisuche in Gnutella. Eine Query-Nachricht mit TTL-Wert 2 wird rekursiv an alle Nachbarn weitergeleitet (a). Peers, die die gesuchte Datei bereitstellen können antworten mit einer QueryHit-Nachricht (b). Anschließend kann die gesuchte Datei direkt heruntergeladen werden (c). Evaluierung Wie beschrieben kommt das Gnutella Netzwerk gänzlich ohne strukturierende oder organisierende Instanzen aus, was es zum ersten P2P-Netzwerk im eigentlichen Sinne macht. Durch die Vermeidung eines dedizierten Servers löst Gnutella eines der großen Probleme von Napster. Auch die Indexsuche als völlig dezentralisierter Algorithmus wurde in Gnutella zum ersten Mal umgesetzt. Diese Eigenschaften machen das Gnutella Netzwerk von außen praktisch unangreifbar, da das Netzwerk besteht und funktioniert, sobald ein Teilnehmer

63 Skalierbare Peer-to-Peer-Netzwerke 55 im Netzwerk ist. Dass es dennoch möglich ist, das Netz so zu stören, dass Funktionen nur noch eingeschränkt nutzbar sind, wird im Folgenden noch erklärt. Stärken Die Stärke von Gnutella liegt eindeutig in seiner verteilten Netzwerkstruktur, die es extrem robust macht. Außerdem ist sie sehr gut skalierbar, da viele Knoten aufgenommen werden können, ohne dass die Leistungsfähigkeit des Gesamtsystems darunter leidet. Schwächen Die Schwächen von Gnutella liegen in der verteilten Indexsuche, die im Gegensatz zur Netzwerkstruktur nicht gut skalierbar ist. Da die Suche nach einem Datum durch das TTL-Feld tiefenbeschränkt ist, wird ein Datum, das im Netzwerk faktisch vorhanden ist, nicht sicher gefunden. Nur, wenn das Datum von einem der k-nächsten Nachbarn bereitgestellt werden kann, findet die Indexsuche das Datum auch. Eine Erhöhung des TTL-Feldes, um dieses Problem zu umgehen, verstärkt nur noch die zweite gravierende Schwäche. Da es in keinster Weise klar ist, in welcher Richtung des Netzwerkes sich ein Datum befindet, verursacht die Indexsuche ein sehr hohes Nachrichtenaufkommen zwischen Knoten. Das Netzwerk wird mit Suchanfragen regelrecht geflutet. Böswillige Teilnehmer, die besonders viele Suchanfragen stellen, können so einzelne Netzwerkteilnehmer überfordern und das Netzwerk beträchtlich stören. 2 DHT Distributed Hash Tables In diesem Kapitel sollen Distributed Hash Tables (DHT) als besonders geeignete verteilte Datenstruktur für eine effiziente Indexsuche in P2P-Netzwerken vorgestellt werden. Abbildungen und Inhalt sind angelehnt an [5] und [8]. 2.1 Motivation Mitentscheidend für den Erfolg eines P2P-Netzwerks ist eine effiziente Datensuche innerhalb des Netzwerkes. Aus den Erfahrungen von Napster kann gefolgert werden, dass nur eine verteilte Datenstruktur für P2P-Netzwerke Sinn macht, da sie ohne zentrale Instanzen auskommt und so extrem robust und angriffssicher ist. Dieses Konzept der verteilten Datenstruktur wird bereits im Gnutella-Netzwerk verwendet, jedoch auf Kosten einer ineffizienten Suche auf den Daten. Daten werden im Gnutella Netzwerk nicht zwangsläufig gefunden und die Suche nach ihnen verursacht ein hohes Nachrichtenaufkommen. Eine Datenstruktur, in der jeder Teilnehmer wüsste, wo er nach einem Datum suchen muss, würde eine gute Grundlage für eine effiziente Suche bilden. Ebenso wäre es wünschenswert, wenn Daten nahezu auf alle Peers gleichverteilt wären, damit nicht das Problem der Überlastung einzelner Peers mit sehr vielen Daten entsteht.

64 56 Andreas Vogelsang 2.2 Hash Tables Eine Datenstruktur, die die genannten Anforderungen sehr gut erfüllt, sind Hash Tabellen. Sie werden in zahlreichen Software-Systemen verwendet und gehören zu der Grundausstattung moderner Betriebssysteme. In Hash Tabellen erfolgt die Verteilung von Daten über eine Hash Funktion h : K V, die jedem Datum unter Verwendung eines bestimmten Schlüssels (Key) k K eine scheinbar zufällige Position (Value) v V zuweist. Eine der einfachsten Hash Funktionen ist die Modulo-Funktion h(k) = k mod a, die einem Key k den Wert zuweist, der als Rest bei einer Division von k durch a entsteht. Typischerweise ist a gleich der Größe des Wertebereiches V. Abbildung 3 zeigt, wie Keys mit Hilfe der Modulo-Funktion auf Werte und somit auf Positionen abgebildet werden. Werden 2 verschiedene Keys auf einen Wert abgebildet, also gilt h(k 1 ) = h(k 2 ), k 1 k 2 spricht man von einer Kollision. In der Praxis treten solche Kollisionen jedoch kaum auf, wenn ein ausreichend großer Wertebereich gewählt wird. Die Modulo-Funktion ist im allgemeinen als Hash Funktion ungeeignet, da erreicht werden soll, dass Daten gleichmäßig auf den Wertebereich verteilt werden und folglich ähnliche Keys auf sehr unterschiedliche Werte abgebildet werden müssen. Dieses Konzept lässt sich auf Peer-to-Peer-Netzwerke übertragen, indem der Wertebereich als Menge der Peers aufgefasst wird und die Hash Funktion Indexdaten von Dateien auf einen bestimmten Peer abbildet. Benachbarte Elemente des Wertebereichs, also Peers sind dabei jeweils verbunden (siehe Abbildung 3). Diese Umsetzung bietet allerdings einige Nachteile. Da jeweils nur benachbarte 1 Peers ver- Abb. 3. Die Hash Funktion h(k) = k mod 5 bildet die Keys k = 23, 15, 7, 3 nacheinander auf den Wertebereich V = {0, 1, 2, 3, 4} ab. Elemente des Wertebereichs können als Peers und Keys als Indexdaten interpretiert werden. bunden sind, steigt die Suchzeit mit der Anzahl der teilnehmenden Peers linear. Ebenso 1 im Sinne der Anordung im Wertebereich

65 Skalierbare Peer-to-Peer-Netzwerke 57 verhält es sich mit dem Hinzufügen und dem Entfernen von Peers, bei dem die Neunummerierung lineare Zeit beansprucht. Der schwerwiegenste Nachteil ist jedoch, dass beim Hinzufügen oder Entfernen von Peers die Hash Funktion angepasst werden muss, was im schlechtesten Falle zu einer Umsortierung aller Key-Value-Paare führt. 2.3 Distributed Hash Tables Distributed Hash Tables (DHT) sind in der Lage, die Umsortierung von Key-Value-Paaren beim Hinzufügen oder Entfernen von Peers auf einen lokalen Bereich der Hash Table zu beschränken. Dazu wird der Bildbereich in ein kontinuierliches Intervall geändert. Wird beispielsweise das Intervall [0,1) gewählt, sieht die geänderte Hash Funktion wie folgt aus: h : K [0, 1). Diese Hash Funktion bildet die Keys k K der Daten auf einen Punkt des Intervalls ab. Anders als bei den zuvor vorgestellten Hash Tables wird nun den Peers eines P2P-Netzwerks nicht genau ein Element des Bildbereichs der Hash Funktion zugeordnet sondern ein ganzer Bereich. Der Peer ist dann zuständig für alle Daten, deren Key von der Hash Funktion auf den Bereich des Peers abgebildet wird. Wird nun ein Peer hinzugefügt, wird diesem eine zufällige Position im Bildbereich zugeordnet. Der bisher für diese Position zuständige Peer teilt seinen Zuständigkeitsbereich und übernimmt nur einen Teil des Bereiches, während der andere Teil vom hinzugefügten Peer übernommen wird (siehe Abbildung 4). Ebenso verhält es sich beim Entfernen eines Peers. Der Bereich des entfernten Peers wird einfach durch einen benachbarten Peer mit übernommen. Somit verursacht das Hinzufügen und Entfernen von Peers in eine DHT nur lokale Änderungen der Key-Value-Paare und ist daher deutlich besser für P2P-Netzwerke geeignet als Hash Tables. Diese Eigenschaft wird auch Konsistenz genannt. Abb. 4. Nacheinander werden Peers der DHT hinzugefügt, indem sie eine zufällige Position zugewiesen bekommen. Der bisher für diese Position zuständige Peer teilt sich nun den Zuständigkeitsbereich mit dem neu hinzugefügten Peer.

66 58 Andreas Vogelsang Lemma 1. In einer DHT der Größe m mit n Teilnehmern hat der Zuständigkeitsbereich mit hoher Wahrscheinlichkeit ( 1 n c ) höchstens die Größe O( m n log n) und mindestens die Größe Ω( m n ) (für eine Konstante c 0). c Beweis. Für die untere Schranke betrachten wir einen Peer p i, der einen solchen minimalen Bereich der Größe m n verwaltet. Die Wahrscheinlichkeit, dass ein neuer Peer auf diesen c Bereich abgebildet wird und somit den Bereich von p i verkleinert, ist gegeben durch P (Peer wird in Bereich von p i abgebildet) = Größe des Bereichs von p i Größe der DHT = m n c m = m mn c = 1 n c = n c Beim Hinzufügen von n Peers kann dieser Bereich maximal n mal geteilt werden, wodurch die Wahrscheinlichkeit für eine weitere Verkleinerung beschränkt ist durch n c+1. Für die obere Schranke betrachten wir die Wahrscheinlichkeit, dass kein Peer einem festen Bereich der Größe B = O( m n log n) = c m n log n zugeordnet wird und somit ein Peer zuständig ist für einen Bereich größer als dieser. Die Wahrscheinlichkeit, dass ein Peer dem Bereich B zugeordnet wird, ist gegeben durch Größe von B P (ein Peer wird dem Bereich B zugeordnet) = Größe der DHT = c m n log n m = c log n n Somit ist die Wahrscheinlichkeit, dass ein Knoten nicht dem Bereich B zugeordet wird 1 c log n n. Für die Wahrscheinlichkeit, dass B nach Einfügen von n Knoten immer noch ungeteilt bleibt, gilt somit ( P (kein Peer teilt B) = 1 c log n ) n n e c log n n n n c Also ist die Wahrscheinlichkeit, dass ein Bereich der Größe B von n Peers nicht unterteilt wird, sehr gering und somit sind die Zuständigkeitsbereiche der Peers in einer DHT mit sehr hoher Wahrscheinlichkeit nicht größer als O( m n log n). Geht man davon aus, dass die Daten gleichverteilt auf die ganze DHT sind, dann ist die Menge an Daten, die ein Peer verwaltet proportional zur Größe seines Zuständigkeitsbereiches. Da die durchschnittliche Größe eines Bereiches der DHT m n beträgt, folgt aus Lemma 1, dass ein Peer maximal nur log n mal mehr Daten verwaltet als der Durchschnitt.

67 Skalierbare Peer-to-Peer-Netzwerke 59 3 CAN Content-Addressable Network In diesem Kapitel soll gezeigt werden, wie Distributed Hash Tables in P2P-Netzwerken verwendet werden können um eine effiziente Indexsuche zu gewährleisten. Dieses soll am Beispiel des Content-Addressable Network (CAN) erläutert werden. Abbildungen und Inhalt sind angelehnt an [5] und [7]. 3.1 Einleitung Das Content-Addressable Network (CAN) war das erste P2P-Netzwerk, das mit Hilfe von Distributed Hash Tables eine effiziente Datensuche ermöglicht. Es wurde im Jahr 2000 von Sylvia Ratnasamy, Paul Francis, Mark Handley, Richard Karp und Scott Shenker in einem Paper [7] vorgestellt. Die Verwendung von DHT ist mittlerweile zum Standard in skalierbaren P2P-Netzwerken geworden. 3.2 Verwendung von DHT in CAN In einem CAN wird eine Hash Funktion h : K Q, Q = [0, 1) [0, 1) eingesetzt, die Datenkeys k K auf eine kontinuierliche quadratische Fläche abbildet. Die Hash Funktion sorgt dafür, dass Daten gleichmäßig auf die Fläche verteilt werden. Weiterhin wird die quadratische Fläche so partitioniert, dass jeder teilnehmende Peer für genau ein von mindestens n, idealerweise gleich großen Rechtecken zuständig ist. Ein Peer verwaltet nun alle Daten, dessen Key auf die Fläche des Peers abgebildet wird. Offensichtlich wird hier das Konzept der in Kapitel 2.3 vorgestellten DHT auf den 2-dimensionalen Raum übertragen. Eine mögliche Verteilung von Peers und Daten auf eine quadratische Fläche im CAN zeigt Abbildung Funktionsweise und Analyse Um die Funktionsweise eines CAN zu verstehen, sollen hier die grundlegenden Operationen auf einem CAN beschrieben werden. Dabei soll der Schwerpunkt mehr auf den grundsätzlichen Ideen hinter den Operationen liegen und nicht so sehr auf Implementationsdetails. Einfügen von Peers Wird ein Peer p neu in ein CAN eingefügt, wählt er eine zufällige Position auf der Fläche Q. Durch ein Verfahren, dass später erklärt wird, kontaktiert p neu den Peer p alt, der bisher für diese Position zuständig war. Nun wird der Zuständigkeitsbereich von p alt in der Mitte geteilt. Ist der Bereich ein Quadrat wird entlang der y-achse geteilt sonst entlang der x- Achse. Die beiden entstehenden Flächen werden von jeweils einem Peer übernommen (siehe auch Abbildung 6). Durch dieses Einfügeverfahren wird sichergestellt, dass sich die verteilte Datenstruktur nur in einem kleinen lokalen Bereich ändert, da sich lediglich der Zuständigkeitsbereich eines Knotens ändert. Diese Eigenschaft wird Konsistenz genannt und gibt der DHT auch den Beinamen Consistent Hashing. Im Unterkapitel Netzwerkstruktur und Routing wird gezeigt, dass sich beim Einfügen von Knoten die Netzwerkstruktur des CAN ebenfalls nur lokal verändert.

68 60 Andreas Vogelsang Abb. 5. Ein CAN mit Peers und Daten verteilt auf eine quadratische Fläche Q = [0, 1) [0, 1). Einfügen von Daten Das Einfügen von Daten erfolgt analog zum Einfügen von Peers. Ein neu einzufügendes Datum d 1 bekommt von der Hash Funktion eine zufällige Position (x, y) auf der Fläche Q des CAN zugewiesen. Der Peer p, in dessen Zuständigkeitsbereich der Punkt (x, y) liegt, ist dann zuständig für das neue Datum d 1. Zuständig heißt in diesem Fall, er verwaltet Meta-Daten, die zum Download des Datums d 1 nötig sind 2. Offensichtlich ist die Menge an Daten, die ein Peer verwalten muss, proportional zur Fläche, für die er zuständig ist. Zwar ist für den Einstieg eines neuen Peers jeder Punkt der Fläche gleichwahrscheinlich, eine völlig gleichmäßige Verteilung der Fläche auf alle Peers ist jedoch sehr unwahrscheinlich. Dennoch lässt sich die Größe des Zuständigkeitsbereiches eines Peers nach oben hin beschränken. Lemma 2. Sei P R,n die Wahrscheinlichkeit, dass ein Rechteck R mit Fläche A(R) nach Einfügen von n Peers nicht unterteilt wird. Dann gilt P R,n e na(r) Beweis. Wir betrachten ein Rechteck R mit Fläche q = A(R) Die Wahrscheinlichkeit, dass ein Peer beim Einfügen eine Position außerhalb von q zugewiesen wird, ist 1 q, da für 2 z.b. eine Liste mit IP-Adressen aller Netzwerkteilnehmer, die das Datum zur Verfügung stellen

69 Skalierbare Peer-to-Peer-Netzwerke 61 Abb. 6. Durch mehrfaches Einfügen von Peers wird die Fläche des CAN immer weiter unterteilt. die Gesamtfläche Q gilt A(Q) = 1. Diese Warscheinlichkeit ist unabhängig von anderen eingefügten Peers. Daher gilt für die Wahrscheinlichkeit, dass n Peers eine Position außerhalb von q zugewiesen bekommen (1 q) n. Es gilt für alle m > 0: ( 1 1 ) m 1 m e Es folgt P R,n = (1 q) n = ( ) (1 q) 1 nq q e nq = e na(r) und somit das Lemma.

70 62 Andreas Vogelsang Theorem 1. In einem CAN wird es nach dem Einfügen von n Peers mit hoher Wahrscheinlichkeit, d.h. mit Wahrscheinlichkeit 1 n c für eine Konstante c > 0, kein Rechteck R mit Fläche A(R) 2c ln n n geben. Beweis. Sei R i ein Rechteck mit Fläche A(R i ) = 2 i. Für die Wahrscheinlichkeit, dass ein Rechteck R i von 2c i ln n nicht geteilt wird, gilt nach Lemma 2: P Ri,c2 i ln n e A(R i)c2 i ln n = e 2 i 2 i c ln n c ln n = e = n c Es genügen also c2 i ln n Peers, um R i mit Wahrscheinlichkeit 1 n c zu teilen. Damit ein Rechteck R i+1 überhaupt entsteht, muss das entsprechende Rechteck R i geteilt werden. Wir n betrachten das Einfügen weiterer neuer Peers nun staffelweise für i = 1, 2,..., log 2c ln n. In Staffel i werden c2 i ln n neue Peers eingefügt. Diese teilen das umschließende Rechteck R i eines Rechtecks mit hoher Wahrscheinlichkeit. n Es wird also in der Staffel i = log 2c ln n, mit hoher Wahrscheinlichkeit, ein Rechteck mit der Größe R log n 2c ln n ( A R log n 2c ln n ) = 2 log n 2c ln n = 2c ln n n geteilt. Werden die Peers, die in den Staffeln hinzugefügt werden, zusammengezählt, ergibt sich: log n 2c ln n i=1 c2 i ln n = c(ln n) log n 2c ln n i=1 n c(ln n)2 2c ln n = n Damit wird ein bestimmtes Rechteck der Größe 2c ln n n mit Wahrscheinlichkeit n c log n von n Peers nicht geteilt. Von diesen Rechtecken gibt es höchstens n Stück. Damit ist die Wahrscheinlichkeit, dass eines dieser Rechtecke ungeteilt bleibt, höchstens n n c log n n c+2. Wählt man also c groß genug, so kann jede polynomiell kleine Fehlerwahrscheinlichkeit erreicht werden. Theorem 1 zeigt, dass ein Rechteck nach Einfügen von n Peers mit hoher Wahrscheinlichkeit 2c ln n nicht größer ist als n. Da die Größe eines Rechtecks im Durchschnitt 1 n ist, sagt Theorem 1 aus, dass ein Peer mit hoher Wahrscheinlichkeit nicht mehr als das 2c(ln n)-fache an Daten verwaltet als der Durchschnitt. Netzwerkstruktur und Routing Für den Einfüge- und Suchalgorithmus in P2P-Netzwerken muss eine Graphenstruktur auf den Peers des Netzes etabliert werden. In CAN geschieht dies, indem Peers orthogonal 2 i

71 Skalierbare Peer-to-Peer-Netzwerke 63 benachbarter Rechtecke miteinander verbunden werden. Zusätzlich werden sogenannte Torus-Kanten eingefügt, die Rechtecke gleicher Höhe am rechten bzw. linken Rand verbinden. Analog werden Rechtecke des oberen und unteren Rands, die übereinander liegen, miteinander verbunden. Durch diese Torus Kanten wird die durchschnittliche Entfernung von Peers im Graphen halbiert. In allen Abbildungen dieser Arbeit werden jedoch aus Gründen der Übersichtlichkeit keine Torus Kanten eingezeichnet (siehe Abbildung 7). Bei einer völlig gleichmäßigen Unterteilung des Quadrats Q ergibt sich ein Netzwerkdurchmesser von O( n) für n Peers. Für die folgende Betrachtung nehmen wir an, dass die Kanten zwischen Peers immer vom Abb. 7. Ein CAN mit Netzwerkstruktur kleineren zum größeren Rechteck ausgerichtet sind und bei gleicher Größe in zufälliger Richtung. Jedes Rechteck hätte dann den maximalen Ausgangsgrad von vier Kanten, da jede Kante zu einem größeren oder gleichgroßen Rechteck führt. Insgesamt existieren dadurch maximal 4n Kanten im ganzen Graphen. Da jede Kante zwei Peers miteinander verbindet, haben die Peers einen durchschnittlichen Grad von höchstens acht Kanten. Insbesondere ist dieser Grad konstant und nicht abhängig von den Knoten n im Netzwerk. Diese Tatsache trägt wesentlich dazu bei, dass ein CAN sehr gut skalierbar ist. Die Suche nach einem Datum in einem CAN läuft dann in zwei Schritten ab. Zunächst wird mit Hilfe der Hash Funktion die Position des Datums in der Fläche Q bestimmt. Danach wird die Suchanfrage solange an den Nachbarnpeer weitergeleitet, dessen Rechteck in der x oder y Richtung näher an der Position des Datums liegt, bis der Peer erreicht ist, in dessen Zuständigkeitsbereich die Position des Datums liegt. Dieses Routing-Verfahren wird

72 64 Andreas Vogelsang neben der Datumssuche auch verwendet, um neu einzufügende Peers an die von ihnen zufällig gewählte Position zu routen. Dort treten sie dann in Kontakt mit dem bisher für den Punkt zuständigen Peer. Wie bei der Aufteilung der Zuständigkeitsbereiche hat das Einfügen eines Peers in der Netzwerkstruktur ebenfalls nur lokale Auswirkungen. Lediglich der Knoten, dessen Bereich geteilt wird, und seine unmittelbaren Nachbarn müssen ihre Nachbarschaftsumgebung anpassen. In Bezug auf die Netzwerkstruktur handelt es sich also ebenfalls um konsistentes Hashing. Ein Ablauf der Routing-Routine ist in Abbildung 8 abgebildet. Abb. 8. Routing in CAN. Die Suchanfrage von Peer p 1 nach Datum d 1 wird über die Peers p 2, p 3, p 4, p 5 an den für das Datum zuständigen Peer p 6 weitergeleitet. Entfernen von Peers, Defragmentierung Gerade in P2P-Netzwerken spielt Robustheit eine große Rolle, da häufig Peers ohne Vorwarnung das Netz verlassen oder ausfallen. Aus diesem Grund gibt es im CAN einen take-over Mechanismus. Ein Knoten sendet in regelmäßigen Zeitabständen seine Position und seine Nachbarschaft an seine Nachbarn. Bleibt eine solche Update-Message aus, wird ein solcher Knoten als fehlerhaft entdeckt. Jeder Knoten, der einen fehlerhaften Knoten entdeckt hat, startet einen Countdown-timer, der proportional zur Größe des Zuständigkeitsbereiches ist. Aus diesem Grund läuft der timer des Nachbarknotens mit der kleinsten Fläche am ehesten ab. Dieser übernimmt dann zusätzlich den Bereich des ausgefallenen Knotens und benachrichtigt die übrigen Nachbarn über die Veränderung (siehe Abbildung 9). Durch diesen Mechanismus ist es möglich, dass ein Knoten mehr als ein Rechteck verwal-

73 Skalierbare Peer-to-Peer-Netzwerke 65 Abb. 9. Der Bereich eines ausgefallenen Peers p 0 wird von dem Nachbarpeer p 1 mit dem kleinsten Bereich übernommen. tet. Als Konsequenz kann eine sehr starke Fragmentierung des Netzes entstehen. Um dieser Fragmentierung entgegenzuwirken, wird von Zeit zu Zeit ein Defragmentierungsalgorithmus durchgeführt. Um diesen Algorithmus besser zu veranschaulichen ist es sinnvoll, das CAN als Binärbaum darzustellen. Die Wurzel des Baumes ist die ursprüngliche Fläche Q. Ein

74 66 Andreas Vogelsang Knoten im Baum hat als Kinder die beiden Rechtecke, in die es unterteilt wurde. Ist ein Rechteck nicht unterteilt, so ist es im Baum ein Blatt und verbunden mit dem Peer, der für das Rechteck zuständig ist. Der zur Abbildung 9 (b) passende Binärbaum ist in Abbildung 10 dargestellt. Während der Defragmentierungsroutine versucht ein Peer, der mehr als ein Rechteck ver- Abb. 10. Der zu Abbildung 9 (b) passende Binärbaum waltet, das kleinste von ihm verwaltete Rechteck an einen anderen Peer abzugeben. Sei A dieses kleinste Rechteck eines Peers p 0. Dann ist A in der Binärbaumdarstellung ein Blatt. Zur Defragmentierung wird der Bruderbaum B des Rechtecks A betrachtet. Im einfachen Fall ist B ebenfalls nur ein Blatt, das von einem Peer p 1 verwaltet wird. Dann werden A und B miteinander verschmolzen und sie werden zusammen von p 1 verwaltet (siehe Abbildung 11). Ist B kein Blatt, wird im Teilbaum B mit Hilfe einer Tiefensuche nach zwei benachbarten Blättern gesucht 3. Diese beiden Blätter werden zu einer Fläche verschmolzen und von einem der beiden zuständigen Peers übernommen. Der übrig gebliebene Peer übernimmt das Rechteck A von p 0 (siehe Abbildung 12). In beiden Fällen wird der Grad der Fragmentierung verringert. 3.4 Verbesserungsmöglichkeiten Durch verschiedene Verbesserungen des CAN können einige Metriken verbessert werden. Wir betrachten bei den folgenden Konzepten nur Veränderungen des Netzwerkdurchmessers, der Robustheit und des Knotengrades. 3 Dieses existiert, da ein Knoten des Baumes immer genau 0 oder 2 Kinder hat.

75 Skalierbare Peer-to-Peer-Netzwerke 67 Abb. 11. Einfacher Fall der Defragmentierung. p 0 gibt das Rechteck A an p 1 ab. Abb. 12. Schwieriger Fall der Defragmentierung. Per Tiefensuche wird nach zwei benachbarten Blättern gesucht. Diese werden verschmolzen und von einem der zuständigen Peers übernommen. Der andere Peer übernimmt das Rechteck A. Dimensionen Bisher haben wir das CAN als eine 2-dimensionale Fläche angesehen. Dabei lag der Netzwerkwerkdurchmesser bei O(n 1 2 ). Wird das CAN auf einen 3-dimensionalen Würfel erweitert wird der Netzwerkdurchmesser auf O(n 1 3 ) verringert. Im allgemeinen Fall gilt für den Netzwerkdurchmesser O(n 1 d ) bei Verwendung von d Dimensionen. Auf der anderen Seite gilt jedoch für den Knotengrad O(d), da bei Verwendung von höheren Dimensionen (z.b. in

76 68 Andreas Vogelsang einem Würfel) jeder Peer mehr Nachbarn hat. Abbildung 13 stellt dar, wie sich die Verwendung von mehreren Dimensionen auf die Routingdistanz auswirkt. Abb. 13. Verwendung von mehreren Dimensionen und ihr Einfluss auf die Routingdistanz Realitäten Eine weitere Möglichkeit der Verbesserung ist das gleichzeitige Betreiben von mehreren CAN Netzwerken auf gleichen Daten und Peers. Durch die Verwendung von mehreren verschiedenen Hash Funktionen entstehen verschiedene Anordnungen von Peers und Daten in jeweils einem Netzwerk. Diese Netzwerke werden Realitäten genannt. Die Verwendung von r Realitäten erhöht die Robustheit, da bei Ausfall eines Netzes immer noch r 1 weitere Netzwerke zur Verfügung stehen. Für den Netzwerkdurchmesser kann gezeigt werden, dass dieser nur noch O(log n) beträgt. Für das Routing ist dies allerdings nur eingeschränkt nützlich, da der kürzeste Weg nicht mehr unbedingt bekannt ist. Eine gewisse Verkürzung des Routing-Weges ist jedoch empirisch messbar zu erkennen. Durch die Verwendung von r Realitäten erhöht sich allerdings der Knotengrad um den Faktor r. Abbildung 14 stellt dar, wie sich die Verwendung von mehreren Realitäten auf die Routingdistanz auswirkt. Latenzoptimiertes Routing Wenn wir bisher von Weglängen beim Routing gesprochen haben, waren immer Wege im CAN gemeint. Allerdings sagt die Netzwerkstruktur nichts über die darunterliegende Netzwerkstruktur z.b. des Internets aus. Ein benachbarter Peer im CAN kann theoretisch auf der

77 Skalierbare Peer-to-Peer-Netzwerke 69 Abb. 14. Verwendung von mehreren Realitäten und ihr Einfluss auf die Routingdistanz anderen Seite der Erde liegen (siehe auch Kapitel 1.1). Dadurch können beim Routing hohe Latenzzeiten enstehen. Ein Konzept, um dies zu verhindern, ist das sogenannte Überladen von Rechtecken. Während bisher immer ein Peer für ein Rechteck verantwortlich war, werden nun bis zu MaxPeers Peers einem Rechteck zugeordnet. Die Netzwerkstruktur wird dahingehend geändert, dass Verbindungen zu allen Peers eines Nachbarrechtecks gehalten werden. Der Knotengrad erhöht sich dadurch nur um den additiven Term MaxPeers 1. Beim Routing kann nun immer der Nachbarpeer mit der niedrigsten Latenz gewählt werden 4. Zusätzlich zur Latenzoptimierung wird die Robustheit erhöht, da nun, statt nur einem Peer, MaxPeers Peers eine Kopie des Datums bereitstellen. Außerdem verringert sich der Netzwerkdurchmesser, da mehr Peers das Netzwerk betreten müssen, bis ein Rechteck unterteilt wird. So besteht ein CAN mit n Peers nur noch aus n MaxP eers Rechtecken. Eine weitere Möglichkeit, die Latenzzeiten zu reduzieren, ist, die Netzwerkstruktur an die topologische Struktur des Internets anzupassen. Dies ist allerdings zur Zeit nicht trivial, da es schwierig ist, Ortsinformationen über z.b. die IP-Adresse herauszufinden. 3.5 Zusammenfassung Die Entwicklung des Content-Adressable Network war in der Weiterentwicklung der P2P- Netzwerke ein großer Schritt nach vorne. Zum ersten Mal wurde das Konzept der Distributed Hash Tables in einem P2P-Netzwerk verwendet und so konnte garantiert werden, dass ein Datum, das im Netzwerk vorhanden ist, auch gefunden wird. Zudem ist das CAN sehr gut skalierbar, da der Knotengrad konstant und unabhängig von der Anzahl der teilnehmenden 4 Die Latenz im Internet kann über ICMP Echo Requests ermittelt werden.

78 70 Andreas Vogelsang Peers ist und der Netzwerkdurchmesser bei einem 2-dimensionalen CAN mit n Teilnehmern nur bei O( n) liegt. Mit Hilfe von Verbesserungen kann die durchschnittliche Pfadlänge sogar auf O(log n) verringert werden. Allerdings ist dann der Knotengrad nicht mehr unabhängig von der Anzahl der Teilnehmer [7]. Trotzdem konnte sich das CAN in der Praxis nicht durchsetzen, da kurze Zeit später mit Chord [9] und Pastry [10] P2P-Netzwerke vorgestellt wurden, die noch bessere Werte bezüglich Knotengrad und Routing Zeit aufwiesen. Ein weiterer Nachteil, den alle P2P-Netzwerke haben, in denen Daten mittels einer Hash Funktion zufällig verteilt werden, ist, dass eine bestehende Ordnung auf den Daten (z.b. eine lexikographische Ordnung nach Dateinamen) nicht erhalten bleibt. Bereichsanfragen sind dadurch nicht sehr effizient. Auf diese Problemstellung wird im zugehörigen Seminar eingegangen. Literaturverzeichnis 1. Bittorrent.org (2006) Bittorrent Protocol Specification Baset SA, Schulzrinne H (2004) An analysis of the skype peer-to-peer internal telephony protocol Clarke I, Sandberg O, Wiley B, Hong TW (2000) Freenet: A distributed anonymous information storage and retrieval system. In: International Workshop on Design Issues in Anonymity and Unobservability ipoque GmbH (2007) Internetstudie Die Auswirkungen von P2P-Filesharing, Voice over IP, Skype, Joost, Instant Messaging, One-Click Hosting und Mediastreaming wie YouTube auf das Internet Mahlmann P, Schindelhauer C (2007) Peer-to-Peer-Netzwerke. Springer, Berlin Heidelberg New York 6. Clip2 (2001) The Gnutella Protocol Specification v Ratnasamy S, Francis P, Handley M, Karp R, Shenker S (2001) A scalable content-adressable network In: Computer Communication Review. Volume 31., Dept. of Elec. Eng. and Comp. Sci., University of California, Berkeley Mahlmann P, Schindelhauer C (2004) Algorithmen für Peer-to-Peer-Netzwerke, Vorlesungsskript, Universität Paderborn Stoica I, Morris R, Karger D, Kaashoek F, Balakrishnan H. (2001) Chord: A scalable Peer-to-Peer lookup service for internet applications. In: Guerin R, ed.:proceedings of the ACM SIGCOMM 2001 Conference (SIGCOMM-01). Volume 31, 4 of Computer Communication Review., New York, ACM Press Plaxtron CG, Rajaraman R, Richa A (1997) Accessing nearby copies of replicated objects in a distributed environment. In: 9th Annual Symposium om Parallel Algorithms and Architectures (SPAA 97), New York, Association for Computer Machinery

79 Eine Einführung in kinetische Datenstrukturen Peter Kling Universität Paderborn Zusammenfassung. Zu vielen Problemen gibt es heutzutage effiziente Algorithmen, die diese lösen und dem Nutzer bestimmte Attribute wie z.b das nächste Paar einer Punktemenge im Raum berechnen. In modernen Anwendungen müssen solche statischen Probleme im Allgemeinen nicht nur einmal gelöst werden. Vielmehr werden sie in kontinuierliche Problemstellungen übertragen, indem die gegebene Problematik über die Zeit animiert wird. Diese kontinuierliche Problemstellung wirft neue Fragen auf, wie z.b. die Häufigkeit einer notwendigen Neuberechnung solcher Attribute. Die hier vorgestellte Idee der kinetischen Datenstrukturen versucht ein allgemeines Konzept aufzubauen, um diesem Übergang von einer statischen in eine kontinuierliche Situation gerecht zu werden. 1 Einführung Motivation Aufbau Unterschiede zum klassischen Ansatz Kinetische Datenstrukturen Grundaufbau Begriffe und Definitionen Anwendung kinetischer Datenstrukturen Davenport-Schinzel Sequenzen Definitionen und Begriffe Verbindung zu kinetischen Prioritätswarteschlangen Fazit und Ausblick Literaturverzeichnis Einführung Dieses Kapitel soll dem Leser eine Idee davon geben, was kinetische Datenstrukturen prinzipiell darstellen und deren Nutzen motivieren. Anschließend wird der Aufbau dieser Arbeit erläutert.

80 72 Peter Kling 1.1 Motivation Die Modellierung realer Probleme erfordert häufig kontinuierliche Modelle. Diese enthalten ihrer Natur nach eine überabzählbare Menge an Informationen. Als Anwender ist man aber meist nur an einigen wenigen Attributen interessiert. So möchte man bei der Simulation eines Autorennens beispielsweise die aktuelle Position der einzelnen Fahrer, deren Geschwindigkeit oder den Erstplatzierten kennen. Wie man an diesem einfachen Beispiel bereits sieht, können solche Attribute ganz unterschiedlicher Natur sein. Während die Geschwindigkeit der einzelnen Fahrer kontinuierlich von der Zeit abhängt, ist das Attribut Erstplatzierter während der gesamten Simulation nur endlich vielen Änderungen unterworfen. Es ist also diskret. Insbesondere bei diskreten Attributen kann man den Effekt der zeitlichen Kohärenz 1 ausnutzen. Kinetische Datenstrukturen stellen ein Konzept dar, bestimmte Attribute solch kontinuierlicher Modelle zu berechnen und während der betrachteten Zeitspanne aufrecht zu erhalten. Obwohl sich der Ansatz dabei auf diskrete Attribute konzentriert, ist zu bedenken, dass man kontinuierliche Attribute oft durch eine diskrete Beschreibung ausdrücken kann. So kann die Bahn eines sich bewegenden Objektes beispielsweise durch Trajektorien 2 analytisch beschrieben werden. Diese Trajektorien können diskret angegeben werden (siehe Abbildung 1). Eine Änderung der Trajektorie kann dann über eine kinetische Datenstruktur als diskretes Attribut verwaltet werden. y x Abb. 1. Kontinuierliche Objektbahn als diskretes Attribut (Funktionsgleichung): τ : R R 2, (sin(t), cos(t)). t 1.2 Aufbau Vor einer formalen Einführung der Begrifflichkeit, werde ich in Abschnitt 2 zunächst eine kurze Erläuterung eines klassischen Lösungsansatzes geben und diesen mit der Idee kinetischer Datenstrukturen vergleichen. In Abschnitt 3 folgt die formale Einführung, welche anschließend in Abschnitt 4 anhand eines Beispiels vertieft wird. Abschnitt 5 stellt einige wichtige Begriffe und Ergebnisse zur Verfügung, welche in der Analyse des Beispiels 1 Zeitliche Kohärenz im Diskreten beschreibt den Effekt, dass ein Attribut zu einem Großteil der Simulation seinen Wert nicht ändert. 2 Bahnkurven

81 Eine Einführung in kinetische Datenstrukturen 73 gebraucht werden, allerdings nicht spezifisch für kinetische Datenstrukturen sind. Abschließend folgt in Abschnitt 6 eine kurze Zusammenfassung der Ergebnisse sowie ein Ausblick auf fortgeschrittenere Anwendungen. 2 Unterschiede zum klassischen Ansatz Ein typisches Einsatzgebiet kinetischer Datenstrukturen stellt die Simulation kontinuierlicher Systeme dar. Jedoch gibt es natürlich auch einen klassischen Ansatz zur Simulation solcher Systeme. Im Folgenden sollen beide Ansätze verglichen werden. Außerdem wird der Unterschied zwischen kinetischen und dynamischen Datenstrukturen erläutert werden. Klassische Simulation Der klassische Ansatz ein System zu simulieren, welches zeitlichen Veränderungen ausgesetzt ist, basiert auf einer einfachen Diskretisierung der Zeit sowie auf der Annahme, dass bei kleiner Diskretisierung eine starke zeitliche Kohärenz vorliegt. Wir betrachten als Beispiel ein System sich in der Ebene bewegender Objekte (vgl. Abbildung 2). Die Objekte bewegen sich mit konstanter Geschwindigkeit in verschiedene Richtungen. Wir können die Position der Objekte zu einem beliebigen Zeitpunkt anhand dieser Daten und einer gegebenen Ausgangslage bestimmen. Nun wählt man eine globale Zeiteinheit t, welche die Granularität der Simulation bestimmt. Nach jeder vergangenen Zeiteinheit werden die Positionen der Objekte neu berechnet. Wie in Abbildung 2 zu sehen ist, kann es dabei zu einer Kollision kommen. In diesem Fall müssen die Bewegungsvektoren neu berechnet werden. Die Genauigkeit der Simulation hängt hierbei stark von der Wahl der Zeiteinheit ab: je größer man t wählt, desto geringer wird die zeitliche Kohärenz. Man übersieht bestimmte Systemänderungen (vgl. Abbildung 3). Eine zu kleine Wahl führt dazu, dass ein Großteil der Simulationszeit für unwichtige Berechnungen verschwendet wird. y y x x Abb. 2. Bei richtiger Wahl von t kommt es zur Kollision.

82 74 Peter Kling y y x x Abb. 3. Wählt man t zu groß, wird die Kollision übersehen. Bedenkt man, dass in vielen Simulationen die Trajektorien von Objekten und deren Zusammenwirkung durch Differentialgleichungen gegeben sind, zeigt sich ein Vorteil dieser Art der Simulation: Differentialgleichungen müssen im Allgemeinen numerisch gelöst werden, was durch eine feine Diskretisierung der Zeit geschieht. Die Feinheit dieser Diskretisierung kann nun natürlich auch als globale Zeiteinheit genutzt werden. Kinetische Simulation Eine Simulation mit Hilfe einer kinetischen Datenstruktur verfolgt einen lokaleren Ansatz. Im klassischen Ansatz wird durch die global gegebene Zeiteinheit jedes Objekt gleich behandelt. Man stelle sich eine Szene mit einer Schildkröte und einer Gewehrkugel vor. Die Gewehrkugel soll eine Fensterscheibe zerschlagen. Es stellt sich die Frage nach der Wahl von t. Die schnelle Gewehrkugel benötigt offenbar ein sehr kleines t bei zu großer Wahl würde sie durch die Fensterscheibe hindurch fliegen, ohne diese zu zerstören. Ein kleines t bedeutet aber unnötig viel Simulationsaufwand für die langsame Schildkröte. Im Grunde hat man bei der numerischen Lösung von Differentialgleichungen das selbe Problem. Deshalb werden hier adaptive Verfahren genutzt, die versuchen die Größe der Zeiteinheit an die aktuelle Situation anzupassen. Kinetische Datenstrukturen bieten einen ähnlichen Ansatz, arbeiten allerdings ereignisbasiert. Statt eine globale Zeiteinheit festzulegen und nach jedem Zeitschritt alle betrachteten Attribute auf Änderungen zu überprüfen, wird eine Ereignis-Warteschlange erstellt. Diese enthält Ereignisse in der Zukunft, die es abzuarbeiten gilt und welche wiederum neue Ereignisse auslösen können. Ein Ereignis tritt ein, wenn sich ein Attribut ändert. Die Leistung kinetischer Datenstrukturen besteht hierbei in der effizienten Verwaltung und Aufrechterhaltung der dazu notwendigen Datenstrukturen. Es ist wichtig zu bemerken, dass an dieser Stelle eine schwerwiegende und weitreichende Voraussetzung an das Anwendungsgebiet gestellt wird. Die zu berechnenden also interessanten Ereignisse liegen in der Zukunft. Die Berechnung der Eintrittspunkte solcher Ereignisse ist im Allgemeinen nicht trivial, oft sogar nicht möglich. Eine Möglichkeit mit

83 Eine Einführung in kinetische Datenstrukturen 75 solchen Situationen dennoch umzugehen, besteht darin geeignete Approximationen zu verwenden. Kinetik vs. Dynamik Kinetik und Dynamik sind zwei eng zusammenhängende Begriffe. Umso wichtiger ist es, sich klar zu machen wo der Unterschied zwischen kinetischen und dynamischen Datenstrukturen liegt. Während kinetische Datenstrukturen helfen sollen, bestimmte Attribute eines Systems über eine zeitliche Veränderung aufrecht zu erhalten, befassen sich dynamische Datenstrukturen mit der Problematik einen gegebene Datensatz an eine Veränderung des Systems anzupassen. Typische Beispiele für dynamische Datenstrukturen sind sortierte Folgen, welche die Sortierung beim Einfügen oder Entfernen eines Elementes aufrecht erhalten. Der Unterschied wird besonders deutlich, wenn man kinetische Datenstrukturen betrachtet, die zusätzlich dynamische Eigenschaften haben. Neben der allgemeinen zeitlichen Veränderung der Attribute eines Systems können hier Objekte das System betreten oder verlassen. In Abschnitt 3.2 wird der Begriff (δ, n, m)-szenario eingeführt werden, in dem derartige dynamische Effekte eine Rolle spielen. Auch in der Analyse des Kinetic Tournament in Abschnitt 4 werden dynamische Effekte anhand solcher (δ, n, m)-szenarien berücksichtigt werden. Für eine genauere Beschreibung sei hier auf die Begriffserklärungen in Abschnitt 3.2 verwiesen. 3 Kinetische Datenstrukturen Es soll nun eine formalere Definition kinetischer Datenstrukturen gegeben werden. Dazu wird zunächst der grundlegende Aufbau einer kinetischen Datenstruktur erläutert sowie ein Überblick über den Ablauf einer Simulation anhand einer kinetischen Datenstruktur gegeben. Anschließend werden einige Begriffe definiert und teilweise an Beispielen näher erläutert. 3.1 Grundaufbau Kinetische Datenstrukturen sollen also ausgewählte diskrete Attribute in einem kontinuierlichen System aufrecht erhalten. Für ein gegebenes Attribut, welches in der kinetischen Datenstruktur verwaltet werden soll, besteht das grundsätzliche Verfahren der Kinetisierung im wesentlichen aus folgenden Schritten: 1. Betrachte einen (statischen) Algorithmus zur Berechnung des Attributes. 2. Umwandlung des Algorithmus in einen Gültigkeitsbeweis für das Attribut. 3. Animieren des Beweises. Der letzte Punkt enthält den Kerngedanken kinetischer Datenstrukturen: es reicht nicht, einen Beweis dafür zu haben, dass ein aktueller Attributwert korrekt ist. Vielmehr muss erkannt werden, wann so ein Beweis fehlschlägt (also sich das betrachtete Attribut verändert hat 3 ) und der Beweis muss an die sich veränderten Verhältnisse angepasst werden. Die Kunst 3 Oder besser noch: wann es fehlschlagen wird!

84 76 Peter Kling besteht gerade darin, Beweise zu finden, mit denen man diese beiden Kriterien effizient erfüllen kann 4. Eine Kinetische Datenstruktur bietet dem Benutzer zwei fundamentale Operationen zum Zugriff auf die verwalteten Daten: Die zwei wesentlichen strukturellen Komponenten einer kinetischen Datenstruktur sind die Gültigkeitsbeweise der Attribute sowie die Ereigniswarteschlange. Nach der Erstellung des Gültigkeitsbeweises welcher aus sogenannten Zertifikaten besteht wird berechnet, wann und aus welchem Grund er als nächstes Fehlschlagen wird. Diese Ereignisse werden in der Ereigniswarteschlange verwaltet und nach und nach abgearbeitet. Dabei kann ein Ereignis wiederum neue Ereignisse auslösen. Der Ablauf ist in Abbildung 4 verdeutlicht. query Die query-operation dient der Rückgabe eines bestimmten Attributes. update Die update-operation aktualisiert den internen Zustand der kinetischen Datenstruktur. Gültigkeitsbeweis Ereignis Aktualisierung Zertifkat Fehlschlag Beweis Aktualisierung update Attribut Aktualisierung Abb. 4. Ablauf der Simulation mit Hilfe einer kinetischen Datenstruktur. 3.2 Begriffe und Definitionen Gegeben sei ein zu simulierendes System mit einer Objektmenge S. Das System kann zu einem bestimmten Zeitpunkt t R 0 durch eine Funktion π : S V beschrieben werden, die jedem Objekt aus S eine Position im betrachteten Vektorraum V zuordnet (z.b. V = R 2 ). Wir bezeichnen π als Konfiguration und Π := {π π ist Konfiguration} als die Menge aller Konfigurationen. Wir beginnen mit der Definition von Attributen: 4 In diesem Zusammenhang spricht man auch von einem Beweisschema; es handelt sich eher um einen Bauplan für einen Beweis als um einen Beweis selbst.

85 Eine Einführung in kinetische Datenstrukturen 77 Definition 1 (Attribut). Ein Attribut ist eine Funktion, die einer Konfiguration π Π eine kombinatorische Beschreibung zuordnet. Attribute beschreiben also diskrete 5 Eigenschaften des Systems zu einem bestimmten Zeitpunkt. Beispiele für Attribute sind z.b. das nächste Paar oder die konvexe Hülle einer Punktmenge (siehe Abbildung 5). a d c b e Abb. 5. Attribut nächstes Paar : (c, d); Attribut konvexe Hülle : (a, e, b) Um die Gültigkeit von Attributen zu untersuchen, werden sogenannte Zertifikate eingeführt. Sie dienen der Überprüfung bestimmter Eigenschaften für ein k-tupel s S k (k N) von Objekten. Definition 2 (Zertifikat). Zertifikate sind Funktionen z s : Π R und können drei verschiedene Zustände beschreiben. Ein Zertifikat z s : Π R heißt: gültig für eine Konfiguration π Π, falls z s (π) > 0 gilt ungültig für eine Konfiguration π Π, falls z s (π) < 0 gilt degeneriert für eine Konfiguration π Π, falls z s (π) = 0 gilt Man beachte, dass ein Zertifikat immer bezüglich bestimmter Objekte definiert ist. Sie sind die Grundbausteine für die Gültigkeitsbeweise von Attributen. Definition 3 (Gültigkeitsbeweis). Ein Gültigkeitsbeweis L ist eine endliche Menge von Zertifikaten 6. Wir bezeichnen L als gültig für eine Konfiguration π, falls alle z L gültig in π sind. Ist ein z L ungültig (degeneriert), so bezeichnen wir ganz L als ungültig (degeneriert). Gültigkeitsbeweise dienen der Zertifizierung von Attributen. Sie machen also eine Aussage über die Gültigkeit eines Attributwertes. Es gibt zwei verschiedene Arten von Gültigkeitsbeweisen. Zu deren Erläuterung wird allerdings zunächst folgender Begriff benötigt: Definition 4 (Szenario). Ein Szenario (π t ) t [0,1] ist ein Weg 7 im Konfigurationsraum Π. 5 Diskret in dem Sinne, dass sich die kombinatorische Beschreibung während der Simulation nur endlich oft ändert. 6 Man kann L auch als Funktion Π R d auffassen, wobei d die Anzahl der Zertifikate des Gültigkeitsbeweises beschreibt. 7 Ein Weg ist eine auf einem geschlossenen Intervall (hier [0, 1]) definierte stetige Abbildung.

86 78 Peter Kling Ein Szenario beschreibt also stetige Bewegungen der Objekte. Man sagt nun ein Gültigkeitsbeweis L zertifiziert ein Attribut A in einer Konfiguration π: stark, falls π Π : L gültig für π A(π) = A(π ). schwach, falls für alle Szenarien (π t ) t [0,1] mit π 0 = π und L ist gültig für alle π t gilt: A(π t ) = A(π) t [0, 1]. In beiden Fällen muss L auch gültig für die Konfiguration π sein. Anschaulich lassen sich diese Begriffe anhand von Abbildung 6 erklären. Wir bezeichnen die Menge M L = {π Π L ist gültig für π} als die Menge der von L induzierten Konfigurationen. Abb. 6. Die markierten Bereiche stellen die durch L induzierten Konfigurationen dar. Starke Zertifizierung bedeutet, dass A in allen von L induzierten Konfigurationen den selben Wert annimmt, also auf ganz M L konstant ist. Schwache Zertifizierung hingegen benötigt nur, dass A auf einem 8 wegzusammenhängenden Teilgebiet von M L konstant ist. Im Verlauf der Simulation kann es theoretisch vorkommen, dass mehrere Ereignisse gleichzeitig eintreffen. Dies erschwert Analyse und Implementierung, da das Verhalten in diesem Fall undefiniert ist. Deshalb wollen wir nur Konfigurationen betrachten, die in allgemeiner Lage sind: Definition 5. Wir sagen eine Konfiguration befindet sich in in allgemeiner Lage, wenn in dieser Konfiguration höchstens eines der betrachteten Zertifikate degeneriert ist. Degenerierte Zustände von Zertifikaten sind gerade die interessanten Momente. Hier kann sich der Wert eines bestimmten Attributes ändern. Durch die Beschränkung auf diese Art von Konfigurationen 9 kann Mehrdeutigkeit vermieden werden. Ein weiterer zentraler Begriff ist der des Beweisschemas: 8 Und zwar auf dem, das die Konfiguration π enthält. 9 Diese Annahme ist durchaus vertretbar, da in einem kontinuierlichen System bereits eine infinitesimale Änderung ausreichen wird, um die degenerierten Zertifikate zu trennen.

87 Eine Einführung in kinetische Datenstrukturen 79 Definition 6 (Beweisschema). Ein Beweisschema für ein Attribut A weißt allen Konfigurationen in allgemeiner Lage einen Gültigkeitsbeweis zu, der A in der jeweiligen Konfiguration zertifiziert (stark oder schwach). Ein Beweisschema erlaubt es uns also Gültigkeitsbeweise für Attribute und Konfigurationen zu erstellen. Die nächsten beiden Begriffe sind zentrale Gesichtspunkte in der Analyse kinetischer Datenstrukturen, da sie gewisse Aspekte der Effizienz eben dieser beschreiben. Definition 7 (Lokalität). Die Lokalität eines Beweisschemas beschreibt die maximale Anzahl an Zertifikaten, an denen ein beliebiges Objekt in einem Gültigkeitsbeweis des Schemas beteiligt ist. Mit diesem Begriff kann der Aufwand beschrieben werden, der nötig ist um den Zustand der kinetischen Datenstruktur an die Änderung einer Trajektorie 10 anzupassen. Ist L die Lokalität des verwendeten Beweisschemas und beschreibt c die Kosten ein Element aus der Ereigniswarteschlange zu entfernen und hinzuzufügen, so ist dieser Aufwand gegeben durch O(cL). Definition 8 (Antwortzeit). Beschreibt die worst-case Berechnungszeit, um ein Ereignis aus der Ereigniswarteschlange vollständig zu bearbeiten. Dies umfasst insbesondere die Anpassung des aktuellen Gültigkeitsbeweises und die nötigen Aktualisierungen in der Ereigniswarteschlange selbst. Im Hinblick auf die Analyse kinetischer Datenstrukturen ist es notwendig, die Szenarien, insbesondere die Art der zugelassenen Trajektorien, genauer zu beschreiben. Wir werden uns deshalb in der Analyse auf folgende Szenarien-Klassen einschränken: Definition 9 ((δ, n)-szenario). Ein Szenario (π t ) t [0,1] bezüglich n Objekten, so dass die Trajektorie t π t (s) eines Objektes s ein Vektor von Polynomen in t vom Grade höchstens δ ist, heißt (δ, n)-szenario. Definition 10 ((δ, n, m)-szenario). (δ, n, m)-szenarien beschreiben ein dynamisches Szenario, d.h. die beteiligten Objekte bewegen sich nicht nur, sondern es können auch Objekte hinzugefügt oder entfernt werden. Zur Modellierung erweitern wir den Vektorraum V um ein Sondersymbol ω. Ein Objekt s mit π(s) = ω in einer Konfiguration π wird als nicht sichtbar betrachtet. Ein Szenario (π t ) t [0,1] auf einer Objektmenge S mit Positionen in R {ω} ist ein (δ, n, m)-szenario, falls: s S ist γ s : t π t (s) auf allen Intervallen I [0, 1] mit ω / γ s (I) ein Polynom vom Grade höchstens δ s S {I [0, 1] I ist maximales Intervall mit ω / γ s(i)} = m {s S π t (s) ω} n t [0, 1] In einem (δ, n, m)-szenario dürfen also maximal n Objekte gleichzeitig sichtbar sein, und es gibt insgesamt m verschiedene Bewegungsabschnitte, auf denen die Trajektorien Polynome sind. In der Analyse gehen wir bei (δ, n, m)-szenarien davon aus, dass m = S 10 z.b. nach einer Kollision zweier Objekte

88 80 Peter Kling gilt, also m der Anzahl aller betrachteten Objekte entspricht. Damit ist jedes Objekt in genau einem Zeitintervall sichtbar 11. Anhand dieser Typen von Szenarien kann man die Effizienz einer kinetischen Datenstruktur analysieren. Darunter verstehen wir die gesamten Berechnungskosten, welche bei der Simulation eines gegebenen Szenarios anfallen. 4 Anwendung kinetischer Datenstrukturen Es soll nun eine einfache eindimensionale Anwendung für kinetische Datenstrukturen untersucht werden. Wir betrachten für eine endliche Menge S von reellen Zahlen das Maximum- Attribut. Ausgehend von einem statischen Lösungsansatz konstruieren wir eine kinetische Variante, die das Maximum der Menge S über zeitliche Änderungen hinweg aufrecht erhält. Eine solche kinetische Datenstruktur bezeichnen wir als kinetische Prioritätswarteschlange. Die hier vorgestellte kinetische Prioritätswarteschlange heißt Kinetic Tournament. Kinetic Tournament Ausgangspunkt ist ein rekursiver Algorithmus zur Berechnung des Maximums (siehe Algorithmus 6). Die Ausgangsmenge S wird in zwei in etwa gleich große Hälften geteilt, auf denen rekursiv das Maximum bestimmt wird. Die Ergebnisse werden schließlich verglichen und das größere von beiden zurück geliefert. Algorithmus 6 RecursiveMaximum(S = (s 1, s 2,..., s n )) 1: if n = 1 then 2: return s 1 3: else 4: k = n 2 5: m 1 = RecursiveMaximum(s 1,..., s k ) 6: m 2 = RecursiveMaximum(s k+1,..., s n) 7: return max(m1, m2) Wir wollen zunächst ein geeignetes Beweisschema aus diesem Algorithmus extrahieren. Dazu stellen wir den Ablauf des Algorithmus in Form eines Turnierbaumes dar (siehe Abbildung 7). Um die Rundungsoperation in Zeile 4 in der Analyse zu vermeiden, füllen wir die Objektmenge S mit dem Sentinel solange auf, bis S eine Zweierpotenz ist. So ein Turnierbaum beschreibt für eine gegebene Objektmenge, wie die einzelnen Vergleiche im Algorithmus (Zeile 7) jeweils ausfallen. Jeder innere Knoten zusammen mit seinen zwei Kindern entspricht dabei genau einem Aufruf von Zeile 7 und je tiefer im Baum der Knoten liegt, desto größer ist die Rekursionstiefe des zugehörigen Aufrufes. Das Ergebnis des Vergleichs der beiden Kinderknoten wird im Vaterknoten gespeichert. Die Wurzel des Baumes stellt schließlich das Maximum der Objektmenge dar. Ein Turnierbaum kann nun offensichtlich als Gültigkeitsbeweis für die kinetische Prioritätswarteschlange benutzt werden. Die einzelnen Zertifikate entsprechen den inneren Knoten 11 Dies vereinfacht die Analyse, ohne tatsächlich eine Einschränkung darzustellen: schließlich kann man einfach verschiedene Objekte identifizieren und so auch Objekte betrachten, welche mehrmals auftauchen und wieder verschwinden.

89 Eine Einführung in kinetische Datenstrukturen 81 b b c a b c - Abb. 7. Ein Turnierbaum (mit Sentinel) für S = {a, b, c} und a < b, c < b. des Baumes, genauer gesagt dem Vergleich der beiden Kinder so eines Knotens. Zusammen beschreiben diese inneren Knoten das Maximum offensichtlich eindeutig, es handelt sich hierbei also um Gültigkeitsbeweise mit starker Zertifizierung (vgl. Abschnitt 3.2). Es ist zu bemerken, dass der Turnierbaum innerhalb eines Szenarios immer der gleiche ist; verschiedene Gültigkeitsbeweise innerhalb eines Szenarios unterscheiden sich nur im Inhalt der Knoten. Die beschriebene Konstruktion des Turnierbaumes ergibt ein Beweisschema, erlaubt sie es doch für jede Konfiguration (in allgemeiner Lage) einen entsprechenden Gültigkeitsbeweis anzugeben. Die darauf basierende kinetische Datenstruktur wollen wir im Folgenden als Kinetic Tournament bezeichnen. Nun können wir bereits zwei einfache Ergebnisse festhalten: Lemma 1. Das oben beschriebene Beweisschema hat Lokalität O(log(n)) und Größe 12 O(n). Beweis. Bei einem Turnierbaum handelt es sich offenbar um einen ausgeglichenen binären Baum mit O(n) Blättern und Höhe log(n). Die Zertifikate eines beliebigen Gültigkeitsbeweises, also eines Turnierbaumes, sind gerade dessen inneren Knoten. Die Anzahl an Knoten eines ausgeglichenen binären Baumes ist O(n), folglich ist auch die Größe des Beweisschemas linear in n. Jedes Objekt o S ist durch ein Blatt des Turnierbaumes gegeben. Die Zertifikate, an denen dieses Objekt beteiligt ist, sind gerade alle Zertifikate auf dem Pfad vom zugehörigen Blatt zur Wurzel, für die das Objekt das Maximum darstellt. Die Länge dieses Pfades ist durch die Höhe des Baumes beschränkt. Folglich ist die Lokalität O(log(n)). Die Größe des Beweisschemas liefert uns gleichzeitig die maximale Anzahl an Elementen, die in der Ereigniswarteschlange verwaltet werden müssen. Ein Ereignis kann schließlich nur durch den Fehlschlag eines Zertifikates ausgelöst werden. Insbesondere erhalten wir folgendes Ergebnis: Korollar 1. Die Größe der Ereigniswarteschlange ist linear in n. Insbesondere benötigt das Hinzufügen bzw. Entfernen eines Ereignisses in die Ereigniswarteschlange Aufwand O(log(n)). 12 Die Größe eines Beweisschemas ist die maximale Anzahl an Zertifikaten in einem Gültigkeitsbeweis des Beweisschemas.

90 82 Peter Kling Die Effizienz einer mit diesem Beweisschema ausgestattete kinetische Datenstruktur soll im Folgenden anhand eines (δ, n, m)-szenarios analysiert werden. Falls ein Objekt unsichtbar wird, ersetzen wir es im Baum durch den Sentinel. Wird ein Objekt sichtbar, ersetzen wir ein beliebiges Blatt mit Inhalt durch das Objekt 13. Zunächst untersuchen wir die Antwortzeit dieser Datenstruktur. Lemma 2. Kinetic Tournament hat Antwortzeit O(log 2 (n)). Beweis. Ein Ereignis bedeutet das Fehlschlagen von genau einem Zertifikat (Erinnerung: wir betrachten Konfigurationen in allgemeiner Lage). Das heißt, dass sich das Ergebnis des Vergleichs am zugehörigen inneren Knoten v möglicherweise verändert hat. Das neue Maximum muss im Turnierbaum weiter nach oben propagiert werden. Insbesondere müssen nur Knoten auf dem Pfad von v zur Wurzel aktualisiert werden. Die Anzahl der Aktualisierungen liegt also in O(log(n)). Jeder solchen Aktualisierung entspricht das Entfernen und Hinzufügen je eines Ereignisses in die Ereigniswarteschlange, was wiederum Zeit O(log(n)) benötigt (Korollar 1). Zusammen ergibt sich die Antwortzeit zu O(log 2 (n)). Nun wollen wir die Effizienz des Kinetic Tournament untersuchen. Wir greifen dazu auf die Davenport-Schinzel Sequenzen zurück. Für den geneigten Leser enthält Abschnitt 5 die nötigen Definitionen sowie einige wichtige Ergebnisse, die im Folgenden benutzt werden. Zum Verständnis sollte man insbesondere Definition 13 sowie Korollar 3 beachten. Theorem 1. Kinetic Tournament hat in einem (δ, n, m)-szenario Effizienz O(λ δ+2 (m) log 2 (n)). Beweis. Wir müssen die gesamten anfallenden Berechnungskosten für das betrachtete Szenario abschätzen. Das Eintreten eines Ereignisses führt zu der Aktualisierung des derzeitigen Gültigkeitsbeweises. Wie im Beweis von Lemma 2 gezeigt wurde, bedeutet eine solche Aktualisierung die Änderung von (möglicherweise mehreren) Zertifikaten. Betrachtet man den Turnierbaum, entspricht eine solche Zertifikatänderung dem Wechsel des Inhaltes an einem inneren Knoten. Jede solche Zertifikatänderung bewirkt wiederum die Entfernung und Hinzufügung eines Ereignisses in der Ereigniswarteschlange. Es wird nun gezeigt, dass die Anzahl µ der Änderungen in allen Knoten des Baumes durch λ δ+2 (m) log(n) beschränkt ist. Dies liefert schließlich zusammen mit Korollar 1 die Behauptung. Sei dazu zunächst v ein beliebiger Knoten des Turnierbaumes T und bezeichne T v den in v gewurzelten Teilbaum von T. Mit µ v wollen wir die Anzahl der Änderungen des Inhaltes von v während des Szenarios bezeichnen (es gilt also µ = v T µ v). Es bezeichne S v S die Teilmenge der betrachteten Objekte, die während des gegebenen Szenarios in T v auftauchen. Setze außerdem n v = S v. Betrachtet man das Szenario eingeschränkt auf den Baum T v und die zugehörige Objektmenge, stellt der Inhalt des Knotens v zu jedem Zeitpunkt das Maximum des eingeschränkten Szenarios dar. Nun liefert Korollar 3 aus Abschnitt 5.2 die Abschätzung: µ v < λ δ+2 (n v ) (1) 13 So ein Blatt existiert hier immer, da der Baum in einem (δ, n, m)-szenario maximal n Blätter mit Wert haben kann, und wir die restlichen Blätter anfangs mit Sentinels aufgefüllt haben.

91 Eine Einführung in kinetische Datenstrukturen 83 Bezeichnet L i die Menge aller Knoten der Höhe i im Baum T, so gilt offensichtlich v L i n v = m 14. Zusammen mit Gleichung (1) und Lemma 3 (aus Abschnitt 5.1) liefert dies folgende Abschätzung für die Anzahl der Änderungen in allen Knoten der Höhe i: v L i µ v < v L i λ δ+2 (n v ) λ δ+2 (m) (2) Summation über alle log(n) Ebenen des Turnierbaumes liefert damit µ log(n) λ δ+2 (m). Zusammen mit den Kosten einer Zertifikatänderung (siehe Korollar 1) liegt die Effizienz damit schließlich in O(λ δ+2 (m) log 2 (n)). 5 Davenport-Schinzel Sequenzen Die Abschätzungen in der Analyse des Kinetic Tournament (siehe Abschnitt 4) machen Gebrauch von den sogenannten Davenport-Schinzel Sequenzen. Obwohl diese nicht spezifisch für kinetische Datenstrukturen sind, sollen sie der Vollständigkeit halber hier kurz vorgestellt und erläutert werden. Für eine detailliertere Untersuchung sei auf [1] verwiesen. 5.1 Definitionen und Begriffe Bevor die Davenport-Schinzel Sequenzen eingeführt werden können, benötigen wir zunächst folgenden Begriff: Definition 11. Sei σ = (σ 1, σ 2,..., σ m ) eine endliche Folge in Z. Dann heißt σ nicht wiederholend, falls σ i σ i+1 1 i < m. Nun kann eine Davenport-Schinzel Sequenz wie folgt definiert werden: Definition 12. Seien n, s N und σ = (σ 1, σ 2,..., σ m ) eine endliche Folge von natürlichen Zahlen mit σ i {1, 2,..., n} 1 i m. Dann heißt σ eine (n, s)-davenport-schinzel Sequenz, falls jede sich nicht-wiederholende Teilfolge von σ bestehend aus maximal zwei unterschiedlichen Zahlen höchstens die Länge s + 1 besitzt. Es mag zunächst fraglich erscheinen, inwiefern dieser Begriff bei einer Abschätzung im Zusammenhang mit der kinetischen Prioritätswarteschlange behilflich sein kann. Tatsächlich ist es weniger die Davenport-Schinzel Sequenz an sich, die hier von Interesse ist. Vielmehr interessiert uns, wie lang eine solche Sequenz bei gegebenen Parametern höchstens werden kann. Definition 13. Es bezeichne λ s (n) die Länge einer längsten (n, s)-davenport-schinzel Sequenz. Bevor der Zusammenhang mit der kinetischen Prioritätswarteschlange erläutert wird, soll noch folgendes Ergebnis festgehalten werden: 14 Ein Objekt wird genau für ein Zeitintervall sichtbar und kann von dem Blatt in dem es erscheint nur nach oben wandern. Betrachtet man benachbarte Teilbäume, kann ein Objekt insbesondere nicht den Teilbaum wechseln.

92 84 Peter Kling Lemma 3. Seien s, n, m N. Dann gilt: λ s (n) + λ s (m) λ s (n + m) Beweis. Man betrachtet dazu zwei Davenport-Schinzel Sequenzen die gerade Länge λ s (n) bzw. λ s (m) haben. Addition von n auf alle Komponenten der zweiten Folge und Konkatenation beider Folgen liefert eine (n+m, s)-davenport-schinzel Sequenz der Länge λ s (n)+λ s (m). Es folgt die Behauptung. 5.2 Verbindung zu kinetischen Prioritätswarteschlangen Die Abschätzungen aus Kapitel 4, welche auf die Davenport-Schinzel Sequenzen zurück greifen, schätzen ab wie oft bei einer gegebenen Familie (f i ) n i=1 von Polynomfunktionen15 die Funktion, die das Maximum darstellt, wechseln kann. Dieser Abschnitt soll aufzeigen, wo genau in der Betrachtung der kinetischen Prioritätswarteschlange aus Kapitel 4 die Davenport-Schinzel Sequenzen ein Rolle spielen. Definition 14. Sei (f i ) i I eine Familie von Funktionen der Form f i : R d R (d N, I Indexmenge). Dann heißt F := sup i I (f i ) die obere Kontur (engl.: upper envelope) der Funktionenfamilie 16. Wir interessieren uns insbesondere für den Fall einer endlichen Indexmenge (also I = {1, 2,..., n} für ein n N) und dass alle f i Polynome in einer Variablen vom Grade höchstens δ N sind. Diese Situation liegt in einem einfachen eindimensionalen (δ, n)-szenario (vgl. Abschnitt 3.2) vor: die Trajektorien der einzelnen Objekte entsprechen den Funktionen f i (vgl. Abbildung 8). Die obere Kontur der Trajektorien enthält offensichtlich die Information, welches Objekt zu welchem Zeitpunkt das Maximum darstellt. Vernachlässigt man die Zeiten, zu denen ein Wechsel stattfindet, kann die obere Kontur als endliche Indexsequenz codiert werden: die Folge gibt den Index der Funktion an, welche gerade das Maximum darstellt. Wie sich heraus stellt, ist so eine Indexsequenz für n Funktionen vom Höchstgrad δ gerade eine (n, δ)-davenport-schinzel Sequenz. Lemma 4. Sei (f i ) n i=1 eine endliche Familie von n Funktionen wobei die Funktionen f i : R R Polynome vom Grade höchstens δ seien. Weiterhin sei σ = (σ 1, σ 2,..., σ r ) r N die Indexsequenz zur oberen Kontur von (f i ) n i=1. Dann ist σ eine (n, δ)-davenport-schinzel Sequenz. Beweis. Sei σ eine beliebige, sich nicht wiederholende Teilfolge von σ bestehend aus maximal zwei unterschiedlichen Zahlen i und j. Es ist zu zeigen: σ hat höchstens Länge δ + 1. Für i = j ist die Aussage trivial (da σ nicht wiederholend ist). Sei also i j. Betrachte die zu den Indizes gehörenden Funktionen f i und f j. Beides sind Polynome und haben höchstens Grad δ, d.h. f i f j hat auch höchstens Grad δ und damit maximal δ Nullstellen. Folglich wechselt die Funktion, die max(f i, f j ) darstellt, höchstens δ-mal. Insbesondere können f i und f j in der oberen Kontur maximal δ-mal wechseln. D.h. σ hat höchstens die Länge δ Jede Funktion f i entspricht dabei gerade der Trajektorie eines Objektes. 16 Analog kann die untere Kontur (engl.: lower envelope) definiert werden.

93 Eine Einführung in kinetische Datenstrukturen 85 R f1 obere Kontur f2 f3 f4 0 1 Zeit Abb. 8. Funktionenfamilie (Trajektorien) mit oberer Kontur. Zugehörige Indexsequenz: (1, 2, 4) Damit stellt nun λ δ (n) als maximale Länge einer (n, δ)-davenport-schinzel Sequenz insbesondere eine obere Schranke für die Anzahl der möglichen Änderungen des Maximums in einem (δ, n)-szenario für kinetische Prioritätswarteschlangen dar. Korollar 2. In einer kinetischen Prioritätswarteschlange ist die Anzahl der Änderungen des Maximums in einem (δ, n)-szenario durch λ δ (n) beschränkt. Für den etwas komplizierteren Fall eines (δ, n, m)-szenarios kann ein ähnliches Resultat erziehlt werden: Korollar 3. In einer kinetischen Prioritätswarteschlange ist die Anzahl der Änderungen des Maximums in einem (δ, n, m)-szenario durch λ δ+2 (m) beschränkt. Lemma 4 lässt sich nicht direkt auf diesen Fall übertragen. Probleme macht insbesondere die Tatsache, dass die Funktionen hier nur stückweise stetig sind. Folgende Beobachtungen helfen allerdings ein analoges Lemma zu beweisen, aus dem direkt Korollar 3 folgt: Es sind genau m Trajektorien f i : R R {ω} (1 i m) zu betrachten. Jede Trajektorie f i ist auf genau einem Intervall I ungleich ω (die Zeitspanne, in der das zugehörige Objekt sichtbar ist). Je zwei Trajektorien f i, f j (i j) schneiden sich maximal δ-mal. Zusätzlich gibt es zwei weitere Stellen, an denen sich die obere Kontur hinsichtlich f i und f j ändern kann: der Zeitpunkt, zu dem die zweite Funktion sichtbar wird und der Zeitpunkt, zu dem die erste der beiden Funktionen wieder unsichtbar wird. Insgesamt hat man also höchstens δ + 2 viele Stellen, an denen die Funktion, die max(f i, f j ) darstellt, wechseln kann. Da der entsprechende Beweis mit diesen Beobachtungen analog zu dem von Lemma 4 geführt werden kann, wird hier auf ihn verzichtet.

94 86 Peter Kling 6 Fazit und Ausblick Ich habe in dieser Arbeit den Begriff der kinetischen Datenstruktur eingeführt und an einem eindimensionalen Beispiel der kinetischen Prioritätswarteschlange vorgestellt. Die vorgestellten Ergebnisse basieren dabei auf einer Arbeit von Julien Basch [2]. Gänzlich ausgelassen wurden bisher Beispiele höherer Dimension. Ein Beispiel für zweidimensionale Anwendungen sind z.b. die konvexe Hülle oder das nächste Paar einer Punktmenge in der Ebene (vgl. auch Abbildung 5). Einen detaillierteren Einblick in das Thema sowie eine Analyse solch höher dimensionaler Beispiele kann in [3] gefunden werden. Kinetische Datenstrukturen versprechen eine effiziente Möglichkeit viele (geometrische) Probleme in veränderlichen Systemen zu lösen. Die ereignisbasierte Arbeitsweise hat gegenüber der klassischen zeitbasierten Simulation den Vorteil, dass der Tradeoff zwischen Effizienz und Genauigkeit bei weitem nicht so stark ausgeprägt ist. Allerdings stellen kinetische Datenstrukturen auch hohe Anforderungen an das Anwendungsgebiet. So müssen für die hier beschriebenen Anwendungen die Trajektorien der Objekte im Voraus bekannt sein. Auch dürfen diese um eine aussagekräftige Analyse durchführen zu können nicht von beliebiger Gestallt sein, sondern sollten polynominell in dem Zeitparameter sein. Es soll aber nicht unerwähnt bleiben, dass man auch diese Probleme mit kinetischen Datenstrukturen adressieren kann. So können kompliziertere Trajektorien z.b. durch Spline-Interpolation (siehe [5]) stückweise durch Polynome beschrieben werden. Sind die Trajektorien nicht bekannt, kann versucht werden durch Extrapolation Schätzungen für zukünftige Ereignisse zu bestimmen. Tatsächlich handelt es sich bei dem vorgestellten Konzept nicht um ein rein theoretisches. So enthält beispielsweise die Bibliothek CGAL 17 Implementierungen kinetischer Datenstrukturen für einige ein- bis dreidimensionale Probleme. Eine Beschreibung und Beispielanwendungen können in [4] gefunden werden. Literaturverzeichnis 1. Pankaj K. Agarwal and Micha Sharir (1995) Davenport-Schinzel sequences and their geometric applications. Technical Report DUKE-TR , Department of Computer Science, Duke University 2. Julien Basch and Leonidas J. Guibas (1999) Kinetic data structures. 3. Sabine Naewe (2007) Kinetische Datenstrukturen für zweidimensionale Probleme. Seminararbeit, Universität Paderborn 4. Daniel Russel (2007) Kinetic data structures. In CGAL Editorial Board, editor, CGAL User and Reference Manual. 3.3 edition 5. Hans R. Schwarz and Norbert Koeckler (2004) Numerische Mathematik, Seiten , 5. überarbeitete Auflage Teuber 6. Cgal. Computational Geometry Algorithms Library Computational Geometry Algorithms Library, siehe [6].

95 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie Linda Röhrkohl Universität Paderborn linda@campus.uni-paderborn.de Zusammenfassung. Das Steinerbaumproblem ist ein klassisches N P-vollständiges Problem der Graphentheorie. In dieser Ausarbeitung wird dieses Problem erläutert und eine vollständige Komplexitätsanalyse durchgeführt. Anschließend werden Spezialfälle des Steinerbaumproblems, allesamt bekannte graphentheoretische Probleme, motiviert und Algorithmen zu ihrer Lösung präsentiert. Desweiteren werden zwei Algorithmen untersucht, mit denen sich das Steinerbaumproblem exakt lösen lässt. Da diese Algorithmen für die meisten Probleminstanzen exponentielle Laufzeit besitzen, wird abschließend ein Approximationsalgorithmus mit Güte 2 vorgestellt. Durch wiederholende, grundlegende Definitionen, soll es auch den Lesern, die sich als Amateure auf dem Gebiet der theoretischen Informatik betrachten, möglich sein dem vermittelten Inhalt einfach zu folgen. 1 Einleitung Graphentheoretische Defintionen Das Steinerbaumproblem Die Komplexität des Steinerbaumproblems Spezialfälle des Steinerbaumproblems Das Problem des kürzesten Weges Minimale Spannbäume Exakte Algorithmen Der Enumerations-Algorithmus Die Idee des Dreyfus-Wagner Algorithmus Approximationsalgorithmen Ein einfacher Algortihmus mit Approximationsgüte Verbesserung der Laufzeit Offene Fragen - Ein Ausblick Literaturverzeichnis Einleitung Das Steinerbaumproblem ist ein Problem der Graphentheorie. Es besitzt jedoch viele praktische Anwendungsbereiche, wie z.b. die Netzwerktheorie oder die Modernisierung von Streckennetzen.

96 88 Linda Röhrkohl Diese Ausarbeitung ist angelehnt an die Kapitel 1 bis 6 von [1]. Zur ersten Veranschaulichung des Steinerbaumproblems kann man als Beispiel den dreispurigen Ausbau eines vorhandenen zweispurigen Autobahnnetzes nennen. Da es aus Kostengründen nicht möglich ist alle Autobahnen dreispurig umzubauen, macht die Regierung die Einschränkung, dass es nur möglich sein solle, von jeder Großstadt in jede andere Großstadt über dreispurige Autobahnen zu gelangen. Für die Straßenplaner gilt es somit, die Verbindungen im Autobahnnetz zu identifizieren, über die man alle Großstädte erreichen kann und die alles in allem eine minimale Gesamtlänge besitzen. Denn nur so können die Kosten für das gesamte Projekt minimiert werden. Betrachtet man den Bereich der Netzwerktechnik, so kann man sich vorstellen, dass es verschiedene Teilnehmer gibt, die über ein Netzwerk miteinander kommunizieren wollen. Teilweise sind die Teilnehmer direkt miteinander vernetzt, es gibt aber auch Kreuzungspunkte in denen Leitungen von verschiedenen Teilnehmer zusammentreffen. Jeder Leitungabschnitt hat eine individuelle Übertragungszeit. Die Teilnehmer können Nachrichten, die sie von anderen Teilnehmern empfangen an andere Teilnehmer weiterleiten. Um die schnellste Kommunikation aller Teilnehmer untereinander zu ermöglichen, ist es nötig das Teilnetz zu finden, an dem alle Teilnehmer angeschlossen sind und das eine minimale Gesamtübertragungszeit unter allen möglichen Teilnetzen besitzt. 2 Graphentheoretische Defintionen Zunächst ist es nötig einige Begriffsklärungen vorzunehmen. In dieser Ausarbeitung werden stets ungerichtete Graphen betrachtet. Wird im Folgenden von einer Kante (x, y) oder einer Weglänge p(x, y) gesprochen, so impliziert dieses stets, dass auch die Kante (y,x) bzw. die Weglänge p(y,x) gemeint ist. Außerdem wird zwischen Graphen G = (V, E) und Netzwerken N = (V, E, l) unterschieden. Als Netzwerke werden hierbei gewichtete Graphen mit nichtnegativer Gewichtsfunktion l : E(N) R 0 bezeichnet. Ein Baum ist ein zusammenhängender, kreisfreier Graph. Gibt es einen Baum, der alle Knoten eines Graphen umfasst, so wird dieser Spannbaum genannt. Für zwei Knoten x und y bezeichnet p(x, y) stets die Länge des kürzesten Weges von x nach y. 3 Das Steinerbaumproblem Formalisiert man die in der Einleitung vorgestellten Problembeschreibungen, so gelangt man zu folgendem Ergebnis: Das Steinerbaumproblem behandelt die Fragestellung des Findens eines minimalen Teilgraphen zu einem Graphen G = (V, E), der alle Knoten k K einer Terminalmenge K V beinhaltet. Definition 1 (Steinerbaum). Ein Teilgraph T von G heißt Steinerbaum für K (K V (T )), wenn T ein Baum ist, der alle Knoten aus K enthält, sodass alle Blätter von T Knoten aus K sind. Knoten aus K heißen Terminale und Knoten aus V (T ) \ K heißen Steinerpunkte von T.

97 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 89 Betrachtet man die Problemstellung als Optimierungsproblem, so gilt es den Steinerbaum mit minimalem Gewicht zu finden. In ungewichteten Graphen gilt es somit den Steinerbaum mit minimaler Kantenzahl zu identifizieren, was zu folgender Problemdefintion führt: Definition 2 (Minimales Steinerbaumproblem in Graphen). Gegeben: Ein zusammenhängender Graph G = (V, E) und eine Menge von Terminalen (K V ). Gesucht: Ein Steinerbaum T für K so, dass E(T ) = min{ E(T ) T ist ein Steinerbaum für K in G}. Betrachtet man hingegen Netzwerke, so minimiert man nicht die Kantenanzahl, sondern das Gesamtgewicht des Steinerbaums. Dieses spiegelt die folgende Problemdefinition wieder: Definition 3 (Minimales Steinerbaumproblem in Netzwerken). Gegeben: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Menge von Terminalen (K V ). Gesucht: Ein Steinerbaum T für K so, dass l(t ) = min{l(t ) T ist ein Steinerbaum für K in N}. Bei diesen Definitionen sollte auffallen, dass das Steinerbaumproblem in Graphen ein Spezialfall des Steinerbaumproblems in Netzwerken ist. Wählt man nämlich l(e) = 1 für alle e E, so kann man einfach eine Probleminstanz des Steinerbaumproblems in Graphen in eine Instanz für das Steinerbaumproblem in Netzwerken transformieren. 4 Die Komplexität des Steinerbaumproblems Die Untersuchung der Komplexität des Steinerbaumproblems erfordert, dass das Optimierungsproblem in ein Entscheidungsproblem transformiert wird. Dazu wird die Problemstellung in der Weise abgeändert, dass nicht mehr eine maximale oder minimale Lösung gesucht wird, sondern entschieden werden soll, ob es eine Lösung gibt, die eine entsprechende Schranke einhält. Für die Formulierung des Steinerbaumproblems in Graphen als Entscheidungsproblem ergibt sich dann die folgende Definiton: Definition 4 (Steinerbaumproblem in Graphen). Gegeben: Ein zusammenhängender Graph G=(V,E), eine Menge von Terminalen (K V ) und eine ganze Zahl B. Frage: Existiert ein Steinerbaum T für K mit E(T ) B? Zunächst werden nun die nötigen Definitionen und Grundlagen, die für eine Komplexitätsanalyse nötig sind, wiederholt, wobei von einer vorherigen Kenntnis der Leser ausgegangen wird. Ein grundlegendes Entscheidungsproblem ist das Satisfiability-Problem, das wie folgt definiert ist:

98 90 Linda Röhrkohl Definition 5 (Satisfiability). Gegeben: Eine boolsche Formel F in konjuktiver Normalform. Frage: Gibt es eine gültige Variablenbelegung, die F erfüllt? Betrachtet man nicht beliebige Formeln in konjunktiver Normalform, sondern beschränkt man die Anzahl Literale einer Klausel, so ergibt sich das ksat-problem. Definition 6 (k-satisfiability(ksat)). Gegeben: Eine boolsche Formel F in konjuktiver Normalform, bei der jede Klausel maximal k Literale besitzt. Frage: Gibt es eine gültige Variablenbelegung, die F erfüllt? In der Komplexitätstheorie geht es darum, den zur Lösung eines Entscheidungsproblems minimal benötigten Ressourcenbedarf zu bestimmen. Ressourcen können hierbei beispielsweise Laufzeit oder Speicherbedarf sein. Die Klassen P und N P fassen beispielsweise die Probleme zusammen, die in polynomieller Zeit entschieden werden können. In P sind die Probleme, die durch deterministische Turingmaschinen, in N P die, die durch nichtdeterministische Turingmaschinen in polynomieller Zeit entschieden werden können. Für ein Entscheidungsproblem Π = (I, Sol) ( mit I ist die Menge der Instanzen, die in polynomieller Zeit entscheidbar sind und Sol, die Menge der Entscheideungen die für diese Instanzen getroffen werden) bedeutet dies, dass es in N P ist, genau dann, wenn 1. die Größe der Lösung einer Instanz polynomiell abhängig ist von der Größe der Instanz selber. Es existiert also ein Polynom p mit x p( I ) I I und x Sol(I). 2. ein Algorithmus A und ein Polynom q existieren so, dass für alle I I gilt a) Wenn Sol(I), dann gibt es ein x 0 Sol(I), sodass A die Eingabe (I, x 0 ) in Zeit q( I ) akzeptiert. b) Wenn Sol(I) =, dann verwirft A für jedes x Σ die Eingabe (I, x) in Zeit q( I ). Um die Komplexität zu analysieren wird zudem das Mittel der polynomiellen Reduktion benötigt. Definition 7. Ein Entscheidungsproblem Π = (I, Sol) heißt polynomiell auf ein anderes Entscheidungsproblem Π = (I, Sol ) reduzierbar, Π p Π, falls es eine Funktion f : I I gibt, die in polynomieller Zeit berechenbar ist und für die gilt I I : Sol(I) Sol (f(i)) Die polynomielle Reduktion macht es nun möglich, die schwierigsten Probleme in N P zu beschreiben. Definition 8. Ein Entscheidungsproblem Π ist N P-vollständig genau dann, wenn Π N P und Π N P : Π p Π. Im Jahre 1971 zeigte der kanadische Wissenschaftler Stephen Cook, dass Satisfiability in N P ist und sich auf alle anderen Probleme in N P reduzieren lässt [2]. Hiermit bewies er das Theorem 1. Theorem 1. Satisfiability ist N P-vollständig.

99 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 91 Mittels dieses fundamentalen Satzes ist es nun möglich die N P-Vollständigkeit vieler Entscheidungsprobleme durch polynomielle Reduktion auf SAT zu zeigen. Denn wenn sich alle Probleme in N P polynomiell auf SAT reduzieren lassen und gezeigt werden kann, dass sich SAT auf ein anderes Problem polynomiell reduzieren lässt, so folgt aus der Transitivität der polynomiellen Reduktion, dass sich alle Problem in N P auf dieses Problem polynomiell reduzieren lassen. Korollar 1. 3SAT ist N P-vollständig. Beweis. 3SAT ist offensichtlich in N P, denn für eine gegebene Variablenbelegung ist es einfach zu entscheiden, ob sie eine Formel in konjunktiver Normalform erfüllt oder nicht. SAT lässt sich einfach polynomiell auf 3SAT reduzieren, denn jede Boolsche Formel F in konjunktiver Normalform lässt sich in eine Formel F 3 mit 3 Literalen pro Klausel umstellen. Dieses funktioniert wie folgt: Jede Klausel C = (l 1... l k ) mit k > 3 in F ersetze durch die Klauseln C 3 = (l 1 l 2 y 1 ) (y 1 l 3 y 2 )... ((y k 3 l k 1 l k ) in F 3. F 3 ist so genau dann erfüllt, wenn F erfüllt ist. Zur Zeit ist kein Algorithmus bekannt, der jede Instanz des Steinerbaumproblems in polynomieller Zeit löst. Dieses ist, da allgemein angenommen wird, dass P N P gilt, nicht verwunderlich, denn: Theorem 2. Das Steinerbaumproblem in Graphen ist N P-vollständig. Beweis. Es ist offensichtlich, dass das Steinerbaumproblem in N P liegt, denn es ist trivial einen Algorithmus anzugeben, der prüft ob eine gegebene Lösung zulässig ist und die geforderte Schranke erfüllt. Somit gilt es nun, die zweite Bedingung für N P-Vollständigkeit zu beweisen: Das Steinerbaumproblem ist schwerer als alle anderen Probleme in N P. Dazu reduzieren wir 3SAT auf das Steinerbaumproblem. Seien x 1,..., x n die Variablen und K 1,..., K m die Klauseln einer zufälligen 3SAT -Instanz F. Es ist also nötig einen Graphen G = (V, E), eine Terminalmenge K und eine Grenze B so zu konstruieren, dass G genau dann einen Steinerbaum T für K beinhaltet, der maximal Länge B besitzt, wenn die gegebene 3SAT -Instanz erfüllbar ist. G wird wie folgt aufgebaut: Seien u und v zwei Knoten, die über einen Literal-Pfad P(siehe Abbildung 1) miteinander Abb. 1. Transformation von 3SAT in das Steinerbaumproblem: Der Literal-Pfad [1, S.52] verbunden sind. Dieser Pfad besitzt als Knoten die Literale aus F in negierter und unnegierter Form. Es ist über den Pfad P nur möglich von u nach v zu gelangen, wenn für

100 92 Linda Röhrkohl jedes Literal aus F der negierte oder der unnegierte Knoten ein Mal passiert wird. Für jede Klausel K i von F sei C i ein Knoten, der über Pfade zu allen Literalen verbunden ist, die in K i vorkommen. Dieses wird in Abbildung 2 illustriert. Jeder dieser Pfade erhält die Länge t = 2n + 1. Die Terminalmenge ist K = {u, v} {C 1,..., C m } und B = 2n + tm. Abb. 2. Die Graphenkonstruktion für die Klausel K i = x 2 x j x n. Die gestrichelten Linien stellen Pfade der Länge t = 2n + 1 von C i zu den entsprechenden Knoten des Literal-Pfads dar. [1, S.52] Es sind nun zwei Richtungen zu zeigen. 3SAT-Instanz F ist erfüllbar = Es gibt einen Steinerbaum T in G mit Länge B: Ist F erfüllbar, dann besteht der Steinerbaum zunächst aus einem (u, v)-pfad P, der eine erfüllende Variablenbelegung repräsentiert. Ist x i in F wahr, dann ist x i P, sonst ist x i P. Der (u, v)-pfad hat somit die Länge 2n. Jeder Klauselknoten C i, (1 i m), kann mit P über einen Pfad der Länge t verbunden werden. Somit erhält man einen Steinerbaum der Länge 2n + tm = B; Es gibt einen Steinerbaum T in G mit Länge B = es gibt eine erfüllende Variablenbelegung für die 3SAT-Instanz: Jede Klausel C i muss offensichtlich mit dem Literal-Pfad verbunden werden. Annahme: Es gibt eine Klausel C i0, die mit dem Literal-Pfad über mindestens zwei ihrer Pfade verbunden ist. Dann gilt aber E(T ) (m + 1)t = 2n mt > B. Dies ist ein Widerspruch und die getroffene Annahme kann nicht gelten. Somit müssen u und v über den Literal-Pfad miteinander verbunden sein was mindestens 2n Kanten bedeutet. Da jede Klausel einen Pfad mit Gewicht t benötigt um C i mit dem Literal-Pfad zu verbinden, muss der Literal-Pfad genau 2n Kanten beinhalten. Somit repräsentiert der (u, v)-pfad eine erfüllende Variablenbelegung. Da die Konstruktion des Graphen offensichtlich in polynomieller Zeit erfolgen kann gilt

101 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 93 3SAT p Steinerbaumproblem in Graphen. 5 Spezialfälle des Steinerbaumproblems In diesem Kapitel werden zwei Spezialfälle des Steinerbaumproblems in Bezug auf die besondere Kardinalität der Terminalmenge vorgestellt. Beide Spezialfälle sind berühmte Probleme der Graphentheorie. Ist N = (V, E, l) ein Netzwerk und K V die Terminalmenge, dann entspricht das Steinerbaumproblem im Fall von K = 2, also z.b. K = {s, t}, dem Problem des Findens des kürzesten Weges von s nach t in N. Gilt hingegen K = V, d.h. alle Knoten des Netzwerks sind auch Terminale, so ist das Problem äquivalent mit der Bestimmung eines minimalen Spannbaumes für N. Beide Problemstellungen und die bekanntesten Algorithmen zu ihrer Lösung werden im Folgenden vorgestellt. 5.1 Das Problem des kürzesten Weges Beim Problem des kürzesten Weges betrachtet man ein Netzwerk N = (V, E, l) und zwei Knoten s, t V. Es gilt einen kürzesten Weg von s nach t in G zu bestimmen. Der Algorithmus nach Dijkstra Ein Algorithmmus zur Lösung des Problems des kürzesten Weges wurde im Jahr 1959 von Edsger W. Dijkstra entwickelt. [3] Die Idee des Algorithmus ist die Folgende: Die Knotenmenge V lässt sich in jeder Runde, die der Algorithmus durchläuft, in drei disjunkte Teilmengen aufsplitten. Die erste Menge, im Folgenden mit W bezeichnet, enthält die Knoten die vom Startknoten s erreichbar sind und deren kürzeste Distanz von s bereits bestimmt wurde. Die zweite Menge fasst die Knoten x V \W zusammen, die über eine Kante e=(w,x) von einem Knoten w W erreichbar sind. Dieses sind die Knoten um die der kürzester Pfad sukzessive erweitert wird. In der dritten Menge sind die Knoten, die weder zur ersten noch zur zweiten Menge gehören. Die Funktion d : V (N) N gibt die jeweils aktuelle minimale Distanz des Knoten v von s an. Die Funktion π : V (N) V (N) gibt den Vorgängerknoten des Knotens v an über den er auf dem kürzesten Weg von s erreicht wird. Bei Initialisierung erhält jeder Knoten v V \s die Distanz d[v] = zugewiesen. Es gilt d[s] = 0 und π[s] = nil. So lange wie der Zielknoten t nicht in W ist, also kein kürzester Weg von s nach t gefunden wurde, nimmt der Algorithmus den Knoten x aus V \ W, der die kürzeste Entfernung d[x] besitzt und fügt ihn zu W hinzu. Für alle Nachbarn y dieses Knotens, die nicht bereits in W sind, wird geprüft, ob ihre Entfernung d[y] durch den Weg über x und die Nutzung der Kante (x, y) E verringert werden kann. Ist dieses der Fall, so wird ihre Distanz d[y] und ihr Vorgänger π[y] entsprechend geändert. Theorem 3. Dijkstras Algorithmus ist korrekt und kann mit Laufzeit O(m + n log n) implementiert werden.

102 94 Linda Röhrkohl Algorithmus 7 DIJKSTRAS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und zwei Knoten s, t V. Ausgabe: Ein kürzester (s,t)-pfad in N. {Initialisierung} W := ; d[s]:=0; π[s] :=nil; for all v V \{s} do d[v] = while t / W do Wähle x 0 V \ W mit d[x 0] = min{d[v] v V \ W }; W := W {x 0} for all v Γ (x 0) (V \ W ) do if d[v] > d[x 0] + l(x 0, v) then d[v] = d[x 0] + l(x 0, v) π[v] := x 0 Beweis. Um die Korrektheit zu zeigen werden folgende Schleifeninvarianten gewählt, die nach jeder Iteration der while-schleife gelten: 1. Für alle v W ist d[v] die Länge eines kürzesten (s, v)-pfades und es existiert (wenn s v) ein kürzester (s, v)-pfad, der mit der Kante (π[v], v) endet. 2. Für alle v V \ W, mit d[v] <, ist d[v] die Länge eines kürzesten (s,v)-pfades im Netzwerk N[W {v}], dass durch die Knotenmenge W {v} induziert wird. Es existiert ein kürzester (s,v)-pfad, der mit der Kante (π[v], v) endet. Trivialerweise gelten 1. und 2. nach der Initialisierung. Somit reicht es zu zeigen, dass, wenn 1. und 2. zu Beginn einer Iteration der while-schleife gelten, sie auch am Ende der Iteration gelten. Aus diesem Grunde betrachte man den Knoten x 0 der zu W hinzugefügt wird. Nach Invariante 2. existiert ein (s, x 0 )-Pfad P in N[W {v}], der mit (π[v], v) endet und der Länge l(p ) = d[x 0 ] besitzt. Sei P ein beliebiger (s, x 0 )-Pfad, der nicht vollständig in N[W {x 0 }] liegt. Dann enthält P einen Knoten y / W {x 0 }. Aufgrund der Wahl von x 0 als Knoten mit minimalem d[v] und der Tatsache, dass alle Kantenlängen nichtnegativ sind, kann man folgern, dass l(p ) = d[x 0 ] d[y] l(p ). Somit gilt 1. für die neue Menge W {x 0 }. Die d-werte von Knoten werden in der for-schleife nur geändert werden, wenn man den Knoten über einen kürzeren Pfad, der über x 0 führt erreichen kann. Dann werden die d-werte dieser Knoten genau auf diesen kürzere Pfadlänge geändert und x 0 der entsprechende Vorgänger. Hiermit folgt direkt, dass 2. ebenso gilt. Betrachtet man die Laufzeit so stellt man direkt fest, dass die Wahl des x 0 der zeitaufwändigste Schritt des Algortihmus ist. Sie ist abhängig von der Implementierung. Speichert man die d-werte in einem Array so dauert die Suche nach dem besten x 0 Zeit von O(n). Da die while-schleife bis zu (n 1)-mal durchlaufen wird, würde für diese Verwaltung der d-werte eine Laufzeit von O(n 2 ) folgen. Eine bessere Laufzeit erreicht man, wenn man eine Priority Queue als Speicherstruktur für die d-werte nutzt. Verwendet man beispielsweise einen Fibonacci Heap, wie er in [4] vorgestellt wird, erreicht man eine Laufzeit von O(m + n log n). Die Initialisierung benötig Zeit O(n). Dann werden maximal n 1 Extract-Min Operationen zur Findung des x 0 benötigt und maximal m Decrease-Key Operationen. Die Veränderung der Werte der Nachbarknoten kann in Zeit O(m) geschehen, da jede Kante maximal zweimal betrachtet wird.

103 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 95 Anmerkung 1. Ändert man die Terminierungsbedingung der while-schleife von t / W zu W V so berechnet Dijkstras Algorithmus die kürzeste Distanz des Knotens s zu allen anderen Knoten innerhalb der gleichen Laufzeitbeschränkung. Es gilt somit offensichtlich das folgende Theorem. Theorem 4. Sei N=(V,E,l) ein Netzwerk und s V. Dann kann man kürzeste Wege von s zu allen Knoten v V in Zeit O(m + n log n) berechnen. 5.2 Minimale Spannbäume Betrachtet man ein Netzwerk N = (V, E, l), so besteht das Problem des minimalen Spannbaums für N darin, einen Baum T in N zu finden, der alle Knoten v V beinhaltet, für den also gilt V (T ) = V und der dabei minimales Gewicht besitzt. Für T muss folglich gelten: e E(T ) l(e) ist minimal. Der Algorithmus von Jarnik und Prim Ein Algorithmus zur Lösung dieses Problems wurde von Jarnik und Prim entwickelt. [5] Die Idee dieses Algorithmus ist ähnlich der, des Algortihmus von Dijkstra zur Berechnung des kürzesten Weges. Im Algorithmus wird zunächst ein beliebiger Knoten s V ausgewählt und dem Spannbaum T hinzugefügt. Alle Knoten, die zum Spannbaum gehören werden in der Menge W zusammgengefasst. Die Menge F E enthält die Kanten von N, die den Spannbaum T bilden. Die Funktion d : V (N) N gibt die Distanz des Knoten v zu einem Knoten aus W zum jeweiligen Zeitpunkt des Algorithmus an. Die Funktion π : V (N) V (N) gibt den Vorgängerknoten des Knotens v an, über den er beim Aufbau des minimalen Spannbaums von einem Knoten aus W erreicht wird. In jeder Runde wird der Knoten x 0 V \ W zu W hinzugefügt, der die kürzeste Distanz von einem Knoten w W besitzt. Die Kante, über die der Knoten erreicht wird, wird in F ergänzt. So fährt der Algorithmus fort bis alle Knoten aus V in W enthalten sind und somit zum Spannbaum gehören. Algorithmus 8 JARNIK-PRIM ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l). Ausgabe: Ein minimaler Spannbaum T=(V,F) für N. {Initialisierung} Wähle beliebiges s V W := ; F := ; d[s] := 0; π[s] :=nil; for all v V \{s} do d[v] = while W V do Wähle x 0 V \ W mit d[x 0] = min{d[v] v V \ W }; W := W {x 0}; F := F {(x 0, π[x 0])}; for all v Γ (x 0) (V \ W ) do if d[v] > l(x 0, v) then d[v] = l(x 0, v) π[v] := x 0

104 96 Linda Röhrkohl Theorem 5. Der Jarnik-Prim Algortihmus ist korrekt und kann mit Laufzeit O(m+n log n) implementiert werden. Beweis. Die Korrektheit des Algorithmus zeigen wir mittels drei Schleifeninvarianten, die nach jeder Iteration der while-schleife gelten: 1. Die Kanten in F bilden einen Spannbaum für die Knoten in W 2. Für alle v V \ W gilt und d[v] = min{l(x, v) x W und (x, v) E} d[v] = l(π[v], v). Der Wert d[v] repräsentiert also die Länge der kürzesten Kante, die v mit den Knoten in W verbindet und (π[v], v) ist eine solche Kante. 3. Es existiert ein minimaler Spannbaum T = (V, F ) mit F F. Trivialerweise gelten nach der Initialisierung. Nun nehmen wir an, dass zu Beginn einer Interation gelten, dann kann man einfach sehen, dass 1. und 2. auch am Ende der Iteration mit neuer Menge W gelten. Der Beweis verläuft analog zum Beweise von Dijkstras Algorithmus. Um 3. zu zeigen sei T = (V, F ) ein minimaler Spannbaum, der den (alten) Spannbaum F beinhaltet. Der Fall, dass (x 0, π[x 0 ]) in F enthalten ist, ist trivial. Ist dieses nicht der Fall, dann existiert ein Pfad P in T der π[x 0 ] und x 0 verbindet. Da π[x 0 ] in W ist und x 0 nicht, muss der Pfad P mindestens eine Kante (y,z) enthalten bei der gilt y W und z / W. Aufgrund der Wahl von x 0 und Invariante 2 weiss man, dass l(π[x 0 ], x 0 ) = d[x 0 ] d[z] l(y, z). Sei nun F := (F \ {(y, z)}) {(π[x 0 ], x 0 )}. Dann ist T = (V, F ) ein Spannbaum der Länge l( T ) = l(t ) l(y, z) + l(π[x 0 ], x 0 ) l(t ). Dann ist T ein minimaler Spannbaum und F beinhaltet, wie behauptet, die neue Menge F := F {(π[x 0 ], x 0 )}. Somit ist der Algorithmus korrekt. Die Zeitkomplexität von O(m + n log n) erreicht man wenn man als Speicherstruktur für die d-werte Fibonacci-Heaps verwendet. Dann dauert die Initialisierung Zeit von O(n). In jeder Iteration der while-schleife wird zur Bestimmung des x 0 eine Extract-Min-Operation und maximal m Decrease-Key-Operationen durchgeführt. Da es maximal n 1 Durchläufe der Schleife gibt, ergibt sich eine Gesamtlaufzeit von O(m + n log n). Die Idee des Algorithmus von Kruskal Einen anderen Ansatz zur Lösung des Problems liefert der Algortihmus von Kruskal. [6] Dieser Algorithmus funktioniert nach der Greedy-Strategie. Alle Kanten e E werden ensprechend ihres Gewichts l(e) austeigend sortiert. Der Algorithmus prüft in jeder Iteration für die Kante, die unter den verbleibenden Kanten minimales Gewicht hat, ob ihr Hinzufügen zu F einen Kreis in T ergeben würde. Ist dieses der Fall, so wird die Kante verworfen, andernfalls wird sie zu F hinzugefügt. Kruskals Algorithmus kann so implementiert werden, dass seine Laufzeit durch die Zeit, die für das Sortieren der Kanten benötigt wird, dominiert wird. Das Sortiern ist in Lauzeit O(m log n) möglich. Auf den Korrektheitsbeweis wird an dieser Stelle verzichtet.

105 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 97 Algorithmus 9 KRUSKALS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l). Ausgabe: Ein minimaler Spannbaum T=(V,F) für N. {Initialisierung} Sortiere die Kanten so, dass l(e 1)... l(e m). Sei F :=. {Aufbau des Spannbaums} for i := 1 to m do if (V, F {e i}) ist kreisfrei then F := F {e i}. 6 Exakte Algorithmen Im letzten Abschnitt wurde gezeigt, dass es für Spezialfälle der Terminalmenge K Algortihmen gibt, die das Steinerbaumproblem in Netzwerken exakt und in polynomieller Laufzeit lösen. In diesem Abschnitt werden nun Algorithmen vorgestellt, die das Steinerbaumproblem exakt lösen. Ihre Laufzeit ist im Allgemeinen exponentiell. Sie kann aber auch polynomiell sein, wenn entweder davon ausgegangen werden kann, dass die die Anzahl der Nicht-Terminale V K oder die Anzahl der Terminale K konstant ist. Die erste Idee für einen solchen exakten Algorithmus ist sehr einfach: Zähle alle Teilmengen E E der Kanten von N auf, prüfe ob sie einen Steinerbaum für K bilden und behalte die Menge, die den kleinsten Baum bildet. Dieser Algortihmus ist offensichtlich korrekt, aber natürlich nicht sonderlich effizient. Seine Laufzeit ist sogar exponentiell abhängig von der Anzahl der Kanten E. Die Algorithmen, die im Folgenden vorgestellt werden, funktionieren nach ähnlichen Prinzipien, sind allerdings deutlich effizienter. 6.1 Der Enumerations-Algorithmus Betrachtet man das Steinerbaumproblem für Netzwerke, so kann es nach Definition in einem Steinerbaum für K in N bis zu V \ K Steinerpunkte, also Knoten v V \ K geben. Da alle Blätter von T Terminale sind lässt sich die Anzahl Steinerpunkte, die einen Grad von mindestens 3 haben und somit einen Kreuzungspunkt in T bilden, beschränken. Diese Tatsache wird der im Folgenden beschriebene Enumerations-Algortihmus ausnutzen.[7] [8] Lemma 1. Ein Steinerbaum T für eine Terminalmenge K mit K = k beinhaltet maximal k 2 Steinerpunkte mit Grad von mindestens 3. Beweis. Sei s 2 die Anzahl Steinerpunkte in T, die einen Grad 2 haben und s 3 die Anzahl Steinerpunkte, die einen Grad von mindestens 3 haben. Die Anzahl der Knoten des Steinerbaums ergibt sich somit als V (T ) = k + s 2 + s 3. Hiermit und aus der Tatsache, dass T ein Baum ist, folgt für die Summe der Knotengrade aller Knoten von T d T (v) = 2 E(T ) = 2( V (T ) 1) = 2(k + s 2 + s 3 1). v V (T )

106 98 Linda Röhrkohl Aus der Defintion von s 2 und s 3 folgt andererseits d T (v) = v V (T ) v K }{{} k d T (v) + Durch Gleichsetzung folgt somit s 3 k 2. v V (T )\K } {{ } 2s 2 +3s 3 d T (v) k + 2s 2 + 3s 3. Es seien nun u und w zwei Kreuzungspunkte in T, also zwei Knoten mit Grad von mindestens 3, die über einen Pfad P miteinander verbunden sind. Da T ein minimaler Steinerbaum ist folgt, dass P ein kürzester (u,w)-pfad ist, wenn alle Knoten auf P den Grad 2 besitzten und keine Terminale sind. Die Steinerpunkte mit Grad 2 eines minimalen Steinerbaum liegen folglich immer auf einem kürzesten Weg von einem Terminal zu einem anderen Terminal, von einem Terminal zu einem Kreuzungspunkt, oder von einem Kreuzungspunkt zu einem Kreuzungspunkt in T. Das sogenannte (vollständige) Distanz-Netzwerk von N, D(N) = (V, E D, l D ), definiert für jedes Knotenpaar u, v V die kürzeste Distanz voneinander. Es ist also definiert als E D = V V und l D (u, v) = p(u, v), mit p(u, v) ist die Länge des kürzesten Pfades von u nach v in N. Das Distanznetzwerk kann in polynomieller Zeit berechnet werden, indem beispielsweise der Algorithmus von Dijkstra für jeden Knoten v V einmal ausgeführt wird. Aus den bisherigen Ergebnissen gelangt man zu der Aussage, dass sich der minimale Steinerbaum T für N einfach in polynomieller Zeit berechnen lässt, wenn man die Menge seiner Kreuzungspunkte S kennt. In diesem Fall bestimmt man zunächst das vollständige Distanznetzwerk D(N). In dem Teilnetzwerk von D(N), dass von den Knoten K S induziert wird, berechnet man einen minimalen Spannbaum T Sp. Dieser beinhalt alle Terminale K und alle Kreuzungspunkte des minimalen Steinerbaums. Um letztendlich den minimalen Steinerbaum zu bekommen müssen die Kanten e = (u, v) E(T Sp ), die schließlich den kürzesten Pfad von u nach v repräsentieren, noch durch den tatsächlichen kürzesten Weg von u nach v in N ersetzt werden. Der Enumerations-Algorithmus nutzt nun die Tatsache, dass die Anzahl der Kreuzungspunkte S durch den Wert k 2 beschränkt ist und führt die Berechnung des minimalen Spannbaums für alle entsprechenden Kreuzungspunktemengen durch. Der kleinste minimale Spannbaum wird schließlich in den zugehörigen minimalen Steinerbaum T transformiert. Algorithmus 10 ENUMERATIONS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N = (V, E, l) und eine Terminalmenge K V. Ausgabe: Ein minimaler Steinerbaum T für N. 1: Berechne das Distanz-Netzwerk D(N) = (V, E D, l D) und speichere für jede Kante (u, v) E D den kürzesten (u, v)-pfad in N. 2: Berechne für alle S V \ K mit S k 2 einen minimalen Spannbaum T Sp für das Teilnetzwerk von D(N), das von K S induziert wird. 3: Transformiere den kleinsten der Spannbäume T Sp, die in Schritt 2 berechnet wurden, in einen Steinerbaum T in N.

107 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 99 Theorem 6. Der Enumerations-Algorithmus berechnet einen minimalen Steinerbaum. Er kann so implementiert werden, dass seine Laufzeit beschränkt ist von O(n 2 log n + nm + min{n k 2, 2 n k } k 2 ). Beweis. Die Korrektheit des Algorithmus folgt unmittelbar aus den zuvor gemachten Bemerkungen. Die Laufzeit ergibt sich aus den einzelnen Schritten. Schritt 1, die Berechnung des Distanz-Netzwerks, kann in Zeit O(n 2 log n + nm) geschehen indem man Dijkstras Algortihmus n mal ausführt. In Schritt 2 berechnet man einen minimalen Spannbaum (mit maximal 2k-2 Knoten) für maximal k 2 ( n k ) i=0 i min{n k 2, 2 n k } verschiedene Mengen K S. Da jede dieser Berechnungen in Zeit O(k 2 ) gemacht werden kann, indem man den Algortihmus von Jarnik und Prim verwendet, dauert Schritt 2 maximal O(min{n k 2, 2 n k } k 2 ) Zeit. In Schritt 3 wird nur noch der kleinste minimale Spannbaum T Sp in einen Steinerbaum transformiert. Da jede Kante des Netzwerks N maximal in einem kürzesten Pfad, also einer Kante in T Sp enthalten sein kann, kann Schritt 3 in Zeit O(m) erledigt werden. Aus diesem Beweis kann man weiterhin folgern, dass die Laufzeit des Algorithmus polynomiell beschränkt in der Größe des Netzwerks ist, wenn man nur Instanzen des Problems betrachtet, in denen die Anzahl der Nicht-Terminale von einer festen Konstante begrenzt ist. Denn so ist es möglich über alle Teilmengen S V \K in polynomieller Zeit zu enumerieren. Korollar 2. Sei C N beliebig, aber fest. Dann berechnet der Enumerations-Algorithmus für alle Netzwerke N = (V, E, l) und Terminalmengen K V mit V \ K C einen minimalen Steinerbaum in Zeit O(n 2 log n + nm). 6.2 Die Idee des Dreyfus-Wagner Algorithmus Nachdem im letzten Abschnitt ein Algorithmus vorgestellt wurde, der das Steinerbaumproblem bei konstanten Nicht-Terminalmengen in polynomieller Zeit optimal löst, wird nun die Idee eines Algorithmus vorgestellt, der bei konstanten Terminalmengen die optimale Lösung in polynomieller Zeit berechnet. Der Dreyfus-Wagner-Algorithmus [9] arbeitet nach dem Prinzip der dynamischen Programmierung. Hierbei berechnet er die Länge eines minimalen Steinerbaums für eine Terminalmenge K, aus den Längen der Steinerbäume für alle echten Teilmengen K von K. Zunächst werden also die Steinerbäume für alle 2-elementigen Teilmengen von K berechnet. Aus diesen Ergebnissen lassen sich die Steinerbäume für alle 3-elementigen Teilmengen berechnen bis schließlich ein minimaler Steinerbaum für die gesamte Terminalmenge K berechnet wird. Im Folgenden sei für X K und v V \ X der Wert s(x {v}) die Länge eines minimalen Steinerbaums für X {v}. s v (X {v}) sei die Länge eines minimalen Steinerbaums für X {v} in dem v mindestens den Grad 2 besitzt. Gibt es einen solchen Steinerbaum nicht, ergibt sich die Länge nach Definition als s v (X {v}) =. Die Werte s(x {v}) und s v (X {v}) können rekursiv berechnet werden, was folgendes Lemma zeigt: Lemma 2. Sei X K, X und v V \ X. Dann ist

108 100 Linda Röhrkohl und s v (X {v}) = min =X X {s(x {v}) + s((x \ X ) {v})} s(x {v}) = min{min{p(v, w) + s(x)}, min {p(v, w) + s w(x {w})}}. w X w V \X Beweis. Um die erste Gleichung zu zeigen, betrachtet man den minimalen Steinerbaum T für eine Teilmenge X von K und einen Knoten v aus V \ X mit Grad von mindestens 2. Die Länge des minimalen Steinerbaums ist somit s v (X {v}). T kann man am Knoten v in zwei disjunkte Steinerbäume trennen, von denen der eine die Knotenmenge X {v} und der andere die Knotenmenge X \ X {v} umfasst. Beide Steinerbäume enthalten v mit Grad 1. Die Länge des gesamten Steinerbaums s v (X {v}) erhält man nun, indem man die Längen der beiden kleineren Steinerbäume addiert. Minimiert man über alle nichtleeren, echten Teilmengen X, so erhält man die erste Gleichung. Dieses wird durch die Abbildung 3 verdeutlicht. Um die 2. Gleichung zu zeigen sei T ein minimaler Steinerbaum für X {v}, bei dem der Abb. 3. Beweis der 1. Gleichung der Dreyfus-Wagner-Rekursion. [1, S.79] Grad von v keiner Beschränkung unterliegt. Für ein Blatt u in T sei P u der längste Pfad in T, der in u beginnt und auf dem alle inneren Knoten den Grad 2 besitzen und zudem nicht in K liegen. Es sind nun 3 Fälle zu unterscheiden. Minimiert man über alle 3 Fälle, erhält man die Gültigkeit von Gleichung 2. Fall 1: v hat Grad von mindestens 2. Dann ist s(x {v}) = s v (X {v}). Dieser Fall wird durch Wahl von w = v eingeschlossen. Fall 2: v ist ein Blatt in T und P v endet in einem Knoten w X. Dann ist T die Vereinigung eines minimalen Steinerbaums für X und eines kürzesten (v, w)-pfades. Also gilt s(x {v}) = p(v, w) + s(x). Fall 3: v ist ein Blatt in T und P v endet in einem Knoten w / X. Dann hat w einen Grad von mindestens 3. Also ist T in diesem Fall die Vereinigung eines minimalen Steienerbaums für X {w} in dem w mindenstens den Grad 2 besitzt und einem kürzesten (v, w)-pfad. Also gilt s(x {v}) = p(v, w) + s w (X {w}). Diese 3 Fälle werden durch Abbildung 4 illustriert.

109 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 101 Abb. 4. Beweis der 2. Gleichung der Dreyfus-Wagner-Rekursion. [1, S.79] Der Dreyfus-Wagner-Algorithmus berechnet mit der Rekursionsformel von Lemma 2 die Länge eines minimalen Steinerbaums. Diese ergibt sich für ein beliebiges v K als s(k) = s((k \ {v}) v). Algorithmus 11 DREYFUS-WAGNER ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K V. Ausgabe: Die Länge eines minimalen Steinerbaum T für K {Initialisierung} for all v, w V do berechne p(v,w); for all {x, y} K do s({x, y}) := p(x, y); {Rekursionsausführung analog zu Lemma 2} for i := 2 to k 1 do for all X K mit X = i und alle v V \ X do s v(x {v}) = min X X{s(X {v}) + s((x \ X ) {v})} for all X K mit X = i und alle v V \ X do s(x {v}) = min{min w X{p(v, w) + s(x)}, min w V \X {p(v, w) + s w(x {w})}} Theorem 7. Der Dreyfus-Wagner Algorithmus berechnet die Länge eines minimalen Steinerbaums in O(3 k n + 2 k n 2 + n 2 log n + nm)schritten. Beweis. Die Korrektheit des Algorithmus folgt durch Lemma 2. Die Laufzeit ergibt sich durch n-malige Ausführung von Dijkstras Algorithmus (O(n 2 log n + nm)) und die Anzahl Berechnungen in der ersten und zweiten Rekursionsgleichung. Die Anzahl der Berechnungen der ersten Rekursionsformel ist abhängig von den Möglichkeiten v, X und X zu wählen. Da jedes Terminal zu genau einer der Mengen X, X \ X und K \ X gehört, sind sie begrenzt durch O(3 k n). Anhand der Anzahl Möglichkeiten X und v zu wählen ergibt sich, dass die zweite Rekursionsformel für O(2 k n) Tupel ausgeführt werden muss. Da für jedes Tupel n Berechnungen nötig sind führt dieses zum Summanden O(2 k n 2 ). Möchte man nicht nur die Länge eines minimalen Steinerbaums berechnen, sondern den Steinerbaum an sich, so muss man neben den Längenberechnungen auch die Knoten und Kanten speichern, für die sich die entsprechenden Längen ergeben und sie am Schluss zu einem Steinerbaum zusammenfügen. Die Lösungsidee, des Dreyfus-Wagner-Algorithmus sollte nun erkannt sein. Es ergibt sich für ihn abschließend folgendes Korollar: Korollar 3. Sei C N beliebig, aber fest. Dann berechenet der Dreyfus-Wagner-Algorithmus für alle Netzwerke N=(V,E,l) und Terminalmengen K V mit K C einen minimalen Steinerbaum in Zeit O(n 2 log n + nm).

110 102 Linda Röhrkohl 7 Approximationsalgorithmen Da das Steinerbaumproblem N P-vollständig ist, ist es solange nicht möglich einen polynomiellen Algorithmus zu finden, der das Problem exakt löst, wie nicht P = N P bewiesen wurde. Auch kann besonders in praktischen Anwendungen nicht immer vorausgesetzt werden, dass die Kardinalität der Terminalmenge bzw. der Nichtterminalmenge konstant ist und die Instanz des zugrundeliegenden Netzwerks hinreichend klein ist um einen der vorgestellten exakten Algorithmen zur Lösung des Problems in Betracht zu ziehen. Um dennoch in polynomieller Zeit an gute Lösungen des Problems zu gelangen verwendet man sogenannte Approximationsalgorithmen. Approximationsalgorithmen sollen nicht zwingend die optimale Lösung liefern, sondern eine Lösung, die möglichst einen Wert besitzt, der nah am Optimum liegt. Die Qualität eines Approximationsalgorithmus wird durch die Approximationsgüte angegeben. Die Approximationsgüte eines Approximationsalgorithmus gibt an, um wieviel schlechter eine Lösung des Algortihmus maximal, im Vergleich zur optimalen Lösung des Problems ist. Das Maximum wird hierbei über alle Instanzen des Problems bestimmt. Bezeichnet l opt (I) den Wert einer optimalen Lösung für eine Instanz Iund l(i), der Wert der Lösung, die der Algorithmus für die Instanz I bestimmt, dann ist die Approximationsgüte g für ein Minimierungsproblem definiert durch g = max{ l(i) I ist Instanz des P roblems}. l opt (I) Im Fall des Steinerbaumproblems ist die Approximationsgüte definiert durch den maximalen Quotienten der Länge des Steinerbaums, den der Algorithmus ermittelt und der Länge des minimalen Steinerbaums. Hierbei werden alle Instanzen des Steinerbaumproblems betrachtet. 7.1 Ein einfacher Algortihmus mit Approximationsgüte 2 In diesem Abschnitt wird ein Approximationsalgorithmus für das Steinerbaumproblem mit Approximationsgüte 2 vorgestellt. Dieser Algorithmus liefert also im schlechtesten Fall einen Steinerbaum, der doppelt so lang wie der minimale Steinerbaum ist. Um diese Approximationsgüte zu erreichen nutzt der Algorithmus einen Zusammenhang der Länge des minimalen Steinerbaum mit der Länge des minimalen Spannbaums für K im zugehörigen vollständigen Distanznetzwerk N D = (K, E D, l D ). Dieser Zusammenhang wird durch das folgende Lemma wiedergespiegelt: Lemma 3. Sei N = (V, E, l; K) ein Steinerbaumproblem. Dann erfüllt jeder minimale Spannbaum T im vollständigen Distanz-Netzwerk N D = (K, E D, l D ) l D (T ) (2 2 k ) smt(n), mit k = K ist die Kardinalität der Terminalmenge und smt(n), die Länge des minimalen Steinerbaums für K in N.

111 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 103 Beweis. Sei T opt ein minimaler Steinerbaum in N. Betrachtet man T opt im Gesamtnetzwerk eingebettet und den Weg W um T opt herum (wie in Abbilung 5), dann passiert man auf W jedes Terminal mindestens einmal und läuft zweimal entlang jeder Kante. Die Länge von W ist somit doppelt so groß wie die Länge von T opt, also l(w ) = 2 smt(n). Sei t die Anzahl Blätter von T opt, dann gibt es in W t k Pfade zwischen aufeinander- Abb. 5. Illustration des Beweises des Lemma. Der Weg W besteht aus den Pfaden 1-2, 2-3,...,7-8 und 8-1. Um den Weg W zu erhalten entfernt man den Pfad von 7 nach 8. [1, S.88] folgenden Blättern in T opt. Entfernt man den längsten dieser Pfade, so ist die Länge des verbleibenden Wegs l(w ) maximal (1 1 t )-mal so groß wie l(w ). Dieses ist der Fall, wenn alle t Pfade die gleiche Länge besitzen. Nun ist offensichtlich, dass man indem man dem Weg W folgt einen Spannbaum für K in N D konstruiert, der sogar ein Pfad ist. Die Länge dieses Spannbaum ist maximal l(w ). Da t k gilt, folgt somit l D (T ) l(w ) (1 1 k ) l(w ) = (1 1 k ) 2smt(N) = (2 2 k ) smt(n). Da ein minimaler Spannbaum nach Theorem 5 in polynomieller Zeit berechenbar ist und ein minimaler Spannbaum im vollständigen Distanznetzwerk einen minimalen Steinerbaum mit Güte 2 approximiert, kann man diesen Spannbaum dazu nutzen einen Steinerbaum zu konstruieren, der maximal zweimal so lang ist wie der minimale Steinerbaum für dieses Netzwerk. Auf diese Weise berechnet der folgende MSP-Algorithmus [10] einen approximierten Steinerbaum. Das Beispiel in Abbildung 6 illustriert die verschiedenen Schritte des Algorithmus. Außerdem macht es deutlich, dass die Schritte 4 und 5 für die Probleminstanzen benötigt werden bei denen das Teilnetzwerk N[T D ] nicht kreisfrei ist. Um aus N[T D ] einem Steinerbaum zu erzeugen muss folglich mindestens noch eine Kante entfernt werden. Aus diesem Grund berechnet man in Schritt 4 erneut einen minimalen Spannbaum. Besitzt dieser Blätter, die keine Terminale sind, sind die Kanten zu ihnen für einen Steinerbaum ebenfalls unnötig und werden daher entfernt. Theorem 8. Sei N = (V, E, l; K) ein Netzwerk. Dann berechnet der MST-Algorithmus in polynomieller Zeit einen Steinerbaum S K für N so, dass gilt l(s K ) (2 2 k ) smt(n).

112 104 Linda Röhrkohl Algorithmus 12 MSP-ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K V. Ausgabe: Ein minimaler Steinerbaum S K für N. 1: Berechne das Distanz-Netzwerk N D = (K, E D, l D) und speichere für jede Kante (u, v) E D den kürzesten (u,v)-pfad in N. 2: Berechne einen minimalen Spannbaum T D in N D. 3: Transformiere T D in ein Teilnetzwerk N[T D] von N indem jede Kante von T D durch den entsprechenden kürzesten Pfad in N ersetzt wird. 4: Berechne einen minimalen Spannbaum T für das Teilnetzwerk N[T D]. 5: Transformiere T in einen Steinerbaum S K für N, indem nach und nach die Blätter aus T entfernt werden, die keine Terminale sind. Abb. 6. Illustration der verschieden Schritte des MST-Algorithmus. [1, S.90] Beweis. Aufgrund von Lemma 3 gilt l(t D ) (2 2 k ) smt(n). Da l(t D) in Schritt 3 unverändert bleibt, T D in Schritt 4 höchstens zu T verkleinert wird und T in Schritt 5 ebenfalls höchtens noch zu S K verkleinert wird, gilt l(t D ) l(t ) l(s K ). Somit ist auch die Länge des approximierten Steinerbaum S K höchstens (2 2 k )-mal so groß wie es der minimale Steinerbaum ist. Die Laufzeitanalyse des Algorithmus zeigt dass die Berechnung des Distanz-Netzwerks N D der zeitaufwendigste Schritt ist, denn hierzu muss für alle k Terminale die Berechnung der kürzesten Wege zu allen anderen Knoten erfolgen, was jeweils maximal Zeit von O(n log n+ m) benötigt. Die Berechnung der Spannbäume ist jeweils in Zeit O(n log n + m) möglich. Für den Worst-Case k = V erhält man für den MSP-Algorithmus also eine Laufzeit von O(n 2 log n + nm). 7.2 Verbesserung der Laufzeit Um die Laufzeit des MSP-Algorithmus zu verbessern, muss man den zeitaufwendigsten Schritt, die Berechnung des vollständigen Distanznetzwerks überdenken. Hierzu schlug der deutsche Informatiker Kurt Mehlhorn im Jahre 1988 vor, statt des vollständigen, ein neuartiges Distanznetzwerk ND = (K, E D, l D ) zu verwenden.[11] In diesem Netzwerk sollen alle Knoten v V in verschiedene Komponenten aufgeteilt werden. Jedes

113 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 105 Terminal s K entspricht einer Gruppe Ψ(s). Alle anderen Knoten v V \ K gehören zu der Gruppe des Terminals zu dem sie die minimale Distanz p(s, v) besitzen. Haben sie zu mehreren Terminalen die gleiche minimale Distanz, so werden sie einer beliebigen dieser Gruppen zugeordnet. ED beinhaltet genau dann eine Kante zwischen zwei Komponentenknoten, wenn es in E eine Kante gibt, die zwei Knoten aus den beiden Komponenten miteinander verbindet. In ED sind sozusagen die Kreuzungskanten zweier Komponenten. Das Gewicht einer Kante ist der minimale Wert eines Pfades über den zwei Terminale miteinander verbunden werden können. Formal bedeutet dies: (x, y) E D N D = (K, E D, l D) mit (u, v) E mit u Ψ(x) und v Ψ(y), l D(x, y) = min{p(x, u) + l(u, v) + p(v, y) u Ψ(x), v Ψ(y), (u, v) E}. Ein solches Neztwerk lässt sich schnell berechnen. Man fügt in das ursprüngliche Netzwerk N einen Knoten s 0 ein, den man mit allen Terminalen s K über eine Kante mit Gewicht 0 verbindet. Dann berechnet man mit einer Ausführung von Dijkstras Algorithmus die kürzesten Wege von s 0 zu allen Knoten v V. Der erste Knoten, der auf dem kürzesten Weg von s 0 zu v passiert wird, ist offensichtlich das Terminal s, zu dem v die kürzeste Distanz besitzt und in dessen Gruppe Ψ(s) v somit gehört. Die Pfadlängen p(s, v) aller Knoten zu den entsprechenden Terminalen werden durch die Ausführung von Dijkstras Algorithmus automatisch mit berechnet, denn sie entsprechen der kürzesten Pfadlänge p(s 0, v). Die Berechnung von ED und l D ist anschließend einfach und kann im Vergleich zur Berechnung der Komponenten vernachlässigt werden. Es ergibt sich also für die Berechnung des Netzwerkes ND die Laufzeit O(n log n + m) durch einmaliges Ausführen von Dijkstras Algorithmus. Mehlhorn bewies anschließend, dass jeder minimale Spannbaum in ND auch in minimaler Spannbaum in N D ist. Transformiert man diesen Spannbaum anschließend in den Teilgraphen von N, erhält man einen Steinerbaum für K in N, der der gleichen Approximationsgüte wie der MSP-Algorithmus genügt, aber nur eine Laufzeit O(n log n + m) benötigt. Mehlhorns Algorithmus sieht folgendermaßen aus: Algorithmus 13 MEHLHORNS-ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K V. Ausgabe: Ein minimaler Steinerbaum S M für N. 1: Berechne das Distanz-Netzwerk N D = (K, E D, l D). 2: Berechne einen minimalen Spannbaum T D in N D. 3: Transformiere T D in einen Steinerbaum S M := N[T D] für N, indem jede Kante von T D durch den entsprechenden Pfad in N ersetzt wird. 8 Offene Fragen - Ein Ausblick In dieser Arbeit wurde das klassische Steinerbaumproblem ausführlich untersucht. Komplexität, Spezialfälle und Lösungsansätze wurden betrachtet. Es wurden sowohl exakte als

114 106 Linda Röhrkohl auch approximative Lösungsansätze vorgestellt, doch es sind sicherlich auch noch Fragestellungen unbeachtet geblieben. Sind die exakten Lösungsansätze für einen Einsatz in der Praxis überhaupt zu verwenden, oder ist es unrealistisch anzunehmen dass die Terminalmenge oder die Nichtterminalmenge konstant bleibt? Gibt es Approximationsalgorithmen, die eine bessere Güte als 2 besitzen? Wie berechnet man Steinerbäume in Netzwerken, in denen sich die Strukturen ständig verändern können? Hier wären beispielsweise Computernetze zu nennen, in denen Computer die Terminale und Router die Nicht-Terminale bilden können und in denen die Computer sich am Netz an- und abmelden können. Alles dieses sind Fragen, mit denen sich die Forschung bereits befasst hat und auf die in einer Vielzahl von Papern eingegangen wird. Unter anderem waren dieses auch Fragen aus dem Gebiet der dynamischen Steinerbäume, die die Seminarausarbeitung betrachtet. Literaturverzeichnis 1. Prömel H. J., Steger A. (2002) The Steiner Tree Problem. A Tour through Graphs, Algorithms, and Complexity. Vieweg, Braunschweig/Wiesbaden 2. Cook S. A. (1971) The complexity of theorem-proving procedure. In: 3rd Annual Symposium on Foundations of Computer Science: Dijkstra E. (1959) A note on two problems in connexion with graphs. In: Numerische Mathematik 1, Springer, Berlin Heidelberg New York, Fredman M., Tarjan R. (1987) Fibonacci heaps and ther uses in improved network optimization algorithms. J. ACM 34: Prim R. (1957) Shortest connection networks and some generalizations. Bell Systems Technical Journal 36: Kruskal J. (1956) On the shortest spanning subtree of a graph and the traveling salesman problem. Proceedings of the American Mathematical Society 7: Hakimi S. (1971) Steiner s problem in graphs and its applications. Networks Vol. 1, Nr.2: Lawler E. (1976) Combinatorial Optimization: Networks and Matroids. Holt, Rinehart and Winston, New York 9. Dreyfus S., Wagner R. (1972) The Steiner problem in graphs. Networks Vol. 1: Kou L., Markowsky G., Berman, L. (1981) A fast algorithm for Steiner trees. Acta Inform. 15: Mehlhorn K. (1988) A faster approximation algorithm for the Steiner problem in graphs. Inform. Process. Lett 27:

115 Aspektgraphen und Verdeckung Michael Kruse Universität Paderborn Zusammenfassung. In dieser Ausarbeitung wird eine Repräsentation eines Objektes oder einer ganzen Szene einer 3D-Computergrafik vorgestellt, der so genannte Aspektgraph. Ein Aspektgraph beschreibt Eigenschaften der Szene, die von der Position des Betrachters abhängig ist. Die zu wählenden Eigenschaften sind von Anwendung abhängig. Die hier gewählte Eigenschaft ist die Sichtbarkeit von Elementen der Szene von der Betrachterposition aus gesehen. Dazu werden zwei Algorithmen vorgestellt. Zum einen die naive Herangehensweise und zum Anderen der Algorithmus von Plantinga und Dyer aus der Veröffentlichung [1]. Zum besseren Verständnis werden bei Algorithmen zuerst auf 2D-Grafiken mit orthographischer Projektion angewandt, um sie dann auf 3D-Grafiken in orthographischer und perspektivischer Projektion zu verallgemeinern. Für alle Fälle wird die Größenkomplexität der nötigen Strukturen und die Zeitkomplexität beider Algorithmen gezeigt. 1 Anwendungen und Definition Einleitung Beispielanwendungen Definitionen Verdeckung D-Rendering Perspektivische Projektion Ereignisse Orthographische Projektion Der naive Algorithmus Der Algorithmus von Plantinga und Dyer D-Rendering Ereignisse Orthographische Projektion Perspektivische Projektion Maximale Größe eines Aspektgraphen Minimale Größe eines Aspektgraphen Der naive Algorithmus Der Algorithmus von Plantinga und Dyer Fazit Literaturverzeichnis

116 108 Michael Kruse 1 Anwendungen und Definition 1.1 Einleitung Das Informatik-Fachgebiet Computergrafik beschäftigt sich mit dem Abbilden von 3D- Objekten oder 3D-Szenen auf eine 2D-Bildfläche (Projektion). Je nachdem in welcher Position sich ein Betrachter relativ zum Objekt befindet, hat das Objekt eine andere Darstellung. In dieser Ausarbeitung wird die Darstellung eines Objektes zumeist auf die topologische Erscheinung von einem bestimmten Sichtpunkt, auch Aspekt genannt, reduziert. Ein Aspektgraph speichert die Darstellungen eines Objektes oder einer Szene und welche ineinander übergehen können. Eine weitere Datenstruktur namens VSP beschreibt, wann sich der Aspekt ändert. Unter anderem können diese Informationen dazu genutzt werden, alle sichtbaren Elemente der Szene zu bestimmen. Dies ist der Schwerpunkt dieser Ausarbeitung. 1.2 Beispielanwendungen Objekterkennung in Bildern Auf einer Rastergrafik ist ein Objekt abgebildet, z.b. auf einer Fotografie. Ein Computerprogramm, welchem möglichst viele Ansichten (bzw. Aspekte) dieses Objektes bekannt sind, kann das abgebildete Objekt mit den bekannten Aspekten vergleichen. Bei genügender Ähnlichkeit gilt das Objekt als erkannt. Billboarding Ein Billboard ist ein 2D-Bild innerhalb einer 3D-Computergrafik. Die Normale des Billboards ist dabei immer zum Betrachter gerichtet, so dass das Objekt von allen Seiten gleich aussieht. In älteren Computerspielen wurde dies z.b. für Bäume genutzt. Statt immer das gleiche Bild darzustellen kann es der Perspektive des Betrachters angepasst werden. Dazu kann das passende Bild im zugehörigen Aspektgraphen abgespeichert und bei der zugehörigen Ansicht verwendet werden. Diese Technik wurde bereits beim PC-Spiel Wolfenstein 3D[2] eingesetzt (Abb. 1). Auf dem linken Bild ist je ein Soldat von vorne und hinten abgebildet. Dies sind vordefinierte 2D-Grafiken. Die Grafik wird ausgetauscht, wenn sich der Sichtwinkel ändert (rechtes Bild). Abb. 1: Screenshots aus dem PC-Spiel Wolfenstein 3D[2] Als Aspektgraph modelliert würde eine Grafik für jeden Knoten des Aspektgraphens erstellt werden. Einer Kante wird gefolgt und damit die Grafik des Billboards ausgetauscht, wenn der andere Aspekt dem aktuellen Aspekt ähnlicher ist.

117 Aspektgraphen und Verdeckung 109 In Wolfenstein 3D wurden sicherlich keine Aspektgraphen genutzt, sondern die Differenz zwischen der Sichtrichtung der Spielers und der des Soldaten. Daher kann sich die Grafik ändern, wenn sich der Spieler nur dreht. Occlusion-Culling Culling bezeichnet das Entfernen von Elementen aus 3D-Szenen, die nicht auf der Projektion erscheinen. Occlusion-Culling (eng. Occlusion = Verdeckung) dementsprechend das Entfernen von Elementen, die von weiteren Elementen verdeckt werden und daher nicht auf der Projektion erscheinen. In der Computergrafik sind mit Elementen normalerweise ganze Objekte gemeint, die vollständig oder gar nicht aus der Szene entfernt werden. Ein Aspektgraph kann die sichtbaren Elemente für jede Betrachterposition speichern, es werden dann nur diese Elemente gerendert. 1.3 Definitionen Definition 1 (Aspektgraph). Ein Aspektgraph ist ein ungerichteter Graph G = (V, E), in dem die Knoten v V einen Aspekt einer Szene oder eines Objekts entsprechen und die Kanten e E die möglichen Übergänge zwischen diesen. Zur Verdeutlichung ein Beispiel: Gegeben sei ein Würfel (Abb. 2). Von diesem gibt es 3 Projektionen: Mit einer sichtbaren Seite (A), mit zwei sichtbaren Seiten (B) und mit drei sichtbaren Seiten (C). A B C Abb. 2: Ausgewählte Aspekte eines Würfels Der Aspektgraph zu diesen Ansichten besteht aus drei Knoten, für jede Ansicht eine (Abb. 2). Angenommen, die Projektion kann nicht direkt über eine Ecke des Würfels wechseln, so dass 2 Flächen auf einmal sichtbar werden, sondern nur indirekt über die Kanten des Würfels. Unter dieser Voraussetzung sieht der Aspektgraph wie in Abb. 3 aus. Abb. 3: Aspektgraph der 3 Ansichten von Abb. 2 2 Verdeckung Im Folgenden sollen die sichtbaren Objektmerkmale (Ecken, Kanten, Seitenflächen, Polyeder) zu jeder Betrachterposition im Aspektgraphen gespeichert werden. Die Bestimmung

118 110 Michael Kruse soll dabei genau sein, d.h. zu jeder Betrachterposition soll genau ermittelt werden können, welche Merkmale sichtbar sind und welche nicht. Dies soll nun näher definiert werden. Definition 2 (Objektraum, Bildraum, Sichtraum). Die Eingabe besteht aus ein oder mehreren Objekten (Szene) im Objektraum. Diese sollen in den Bildraum niedrigerer Dimension abgebildet werden. Als weiterer Eingabeparameter dient die Position des Betrachters (eng. Viewpoint) im Sichtraum (eng. Viewpoint Space). Definition 3 (Labeled Image Structure Graph (LISG)). Der Labeled Image Structure Graph (aus [4]) ist eine Darstellung der Abbildung im Bildraum als Graph G LISG = (V LISG, E LISG ). Eine Ecke des Objekts erscheint im LISG, wenn er in der Abbildung sichtbar ist. Ecken werden so miteinander durch Kanten verbunden, wie sie im Bildraum sichtbar sind. Sollten sich zwei Kanten im Bildraum schneiden, wird als Schnittpunkt ein neuer Knoten eingeführt. Dieser wird T-Junction genannt. Ecken, Kanten und Seitenflächen im Objektraum können Bezeichner (eng. label) gegeben werden, die dann auch im LISG erscheinen. Da der LISG nach Definition ein Graph ist, haben die Ecken keine Koordinaten im Bildraum, er beschreibt nur die Struktur. Die Bezeichner können aber sicherstellen, dass Elemente aus dem Objektraum im LISG identifiziert werden können. Es kann zwischen zwei Typen von LISGs unterschieden werden: der transparente LISG und der verdeckende LISG (eng. opaque LISG). Im transparenten LISG sind alle Seitenflächen durchsichtig und daher sind alle Ecken und Kanten des Objektraumes zu sehen (Abb. 4). Bildraum LISG Abb. 4: Transparente Abbildungen Bei dem verdeckenden LISG werden die Seitenflächen mit berücksichtigt (Abb. 5). Ecken werden durch Flächen entweder ganz oder gar nicht verdeckt. Kanten können auch nur teilweise verdeckt werden. An den Schnittpunkten zwischen verdeckter Kante und verdeckender Fläche entsteht dabei ein neuer Knoten, denn eine Kante eines Graphen kann nicht an einer anderen Kante enden. Dieser neuer Knoten, der keine Abbildung einer Ecke des Objektes ist, wird T-Junction genannt.

119 Aspektgraphen und Verdeckung 111 T-Junction Bildraum LISG Abb. 5: Verdeckende Abbildungen Für die Betrachtung von Sichtbarkeit ist nur der Teil der Topologie eines Objektes im Bildraum interessant, der die sichtbare Struktur an einer Betrachterposition bestimmt. In den folgenden Abschnitten wird ein Aspekt durch die zugehörige Topologie bestimmt. Für diesen Zweck wird die Äquivalenz zweier Topologien (bzw. Aspekte) wie folgt definiert: Definition 4 (Äquivalenz von Topologien im Bildraum). Zwei Topologien sind äquivalent, wenn die zugehörigen LISGs isomorph sind. Haben Ecken und Kanten Bezeichnungen, so muss der zugehörige Isomorphismus auch zwischen den Ecken und Kanten mit den gleichen Bezeichnern abbilden. Ein Aspektgraph beinhaltet nicht, wann eine Änderung der Betrachterposition eine Änderung des Aspektes zur Folge hat. Diesen Zweck erfüllt die folgende Struktur. Definition 5 (Viewpoint Space Partition (VSP)). Ein Viewpoint Space Partition ist eine Partitionierung des Sichtraumes in maximal große Regionen in denen die Topologie äquivalent sind. Regionen sind zusammenhängend, d.h. zwei maximale Regionen mit äquivalenter Topologie, die aber nicht zusammenhängend sind, bleiben zwei unterschiedliche Regionen. Der VSP ist zum Aspektgraphen dual, d.h. die Partitionen (bzw. Regionen) des VSP sind die Ecken des Aspektgraphen und umgekehrt, denn innerhalb einer Region ist immer derselbe Aspekt zu sehen. 3 2D-Rendering Der zweidimensionale Objektraum ist einfacher zu verstehen als der dreidimensionale, deshalb sollen die Konzepte zuerst im zweidimensionalen Raum gezeigt und dann auf den dreidimensionalen übertragen werden. 3.1 Perspektivische Projektion Bei der perspektivischen Projektion (oder auch Zentralprojektion) ist der Objektraum auch der Sichtraum, da sich der Betrachter in der Szene befindet. Da der Objektraum bereits zweidimensional ist, muss der Bildraum eindimensional sein. Die Projektionsfläche soll ein

120 112 Michael Kruse Kreis um den Betrachter sein, somit hat er eine Rundumsicht. Die Bildkoordinate ist eine Bogenlänge auf dem Projektionskreis, also ein Winkel. Dimensionen Koordinaten Objektraum 2D (x, y) Sichtraum 2D (u, v) Bildraum 1D (α) Tabelle 1: Kenndaten perspektivischer 2D-zu-1D-Projektion 3.2 Ereignisse Der Übergang von einer Region des VSP zu einer anderen wird (nach [5]) Ereignis genannt. Wenn der Betrachter die Position wechselt, ist das Ereignis, dass sich der Aspekt (bzw. die Topologie) ändert. Der Bereich des VSP, in der sich der Aspekt ändert, wird auch kritische Region genannt. Im zweidimensionalen Raum bedeutet ein Ereignis, dass zwei Ecken im transparenten LISG ihre Position tauschen, zu sehen in Abb. 6. Es wird daher VV-Ereignis (VV für eng. Vertex-Vertex) genannt. Im mittleren LISG sind beide Ecken an der gleichen Position, im verdeckenden LISG wäre nur eine Ecke (im Beispiel B ) zu sehen, die die andere verdeckt. Danach wird die Ecke A durch eine Kante verdeckt, in der Abbildung angedeutet durch ausgrauen. A B AB B A Abb. 6: Überquerung einer kritischen Region Werden eine oder beide Ecken durch eine weitere Kanten verdeckt, so gibt es zwar eine (pseudo-)kritische Region, aber kein Ereignis, da die Topologien äquivalent sind. Das Ereignis selbst wird verdeckt. Kritische Regionen, dessen Sichtbarkeit noch nicht geprüft wurde, werden auch potenzielle kritische Regionen genannt. Als weiteres Beispiel ändert der Betrachter in Abb. 7a seine Position wie in Abb. 7b. Abb. 8 zeigt die zugehörigen Projektionen einer solchen Szene. Die Knoten aus dem Objektraum sind teilweise beschriftet. Daraus resultieren die zugehörigen LISGs in Abb. 9, die eindimensional angeordnet sind. Von der einen zur anderen Position erscheinen gleich zwei neue Ecken, die vorher verdeckt waren, d.h. es wurden gleich mehrere kritische Regionen überquert.

121 Aspektgraphen und Verdeckung 113 B A A C (a) Abb. 7: 2D-Objektraum (b) A A BC Abb. 8: Rendering durch Wolfenstein 3D[2] A Abb. 9: LISGs A B C Der VSP der gesamten Szene lässt sich berechnen. Zu der Arbeit [3] gehört ein Programm, welches den VSP für den zweidimensionalen perspektivischen Fall berechnen kann. Abbildung 10 zeigt den berechneten VSP des vorigen Beispiels. Die gelben Strecken sind die Kanten des Objektraumes und die schwarze Linien stellen die potentiellen kritischen Regionen dar. In Regionen mit gleicher Färbung sind die gleiche Anzahl Kanten sichtbar. Je heller die Farbe, desto mehr sichtbare Kanten. Abb. 10: 2D-VSP erstellt mit dem Programm aspect.jar [3]

122 114 Michael Kruse 3.3 Orthographische Projektion Bei der orthographischen Projektion (oder auch Parallelprojektion) befindet sich der Betrachter anschaulich unendlich weit von der Szene entfernt, so dass alle Sichtlinien parallel verlaufen. Zur Angabe der Betrachterposition reicht daher der Winkel dieser Sichtlinien. Dieser kann entweder als Bogenlänge (θ) oder als normierter Vektor (a, b) = (cos θ, sin θ) angegeben werden. Durch die Normierung bleibt der dadurch definierte Raum eindimensional. Das hat den Vorteil, dass für weitere Berechnungen keine trigonometrischen Funktionen beachtet werden müssen. Die Projektionsfläche ist ein Kreis mit unendlichem Radius, der die gesamte Szene umschließt. Dimensionen Koordinaten Objektraum 2D (x, y) Sichtraum 1D (θ) oder (u, v) mit (u, v) = 1 Bildraum 1D (s) Tabelle 2: Kenndaten orthographischer 2D-zu-1D-Projektion Abb. 11a zeigt die kritischen Regionen eines Objektes. Gestrichelte Linien deuten verdeckte Ereignisse an. Abb. 11b zeigt den VSP auf dem unendlich weit entfernten Projektionskreis. Eine vereinfachte Version ist Abb. 12. (a) (b) Abb. 11: Objekt unter orthographischer Projektion Abbildung 12a zeigt ein einfaches Beispielobjekt mit nur zwei Kanten. Die Linien zeigen die kritischen Regionen. In Abb. 12b ist der VSP mit seinen Regionen eingezeichnet.

123 Aspektgraphen und Verdeckung 115 A A C B C B (a) (b) Abb. 12: Einfaches Objekt unter orthogonaler Projektion 3.4 Der naive Algorithmus Der VSP und der Aspektgraph einer Szene soll nun berechnet werden. Dafür soll zuerst ein einfacher Ansatz verwendet werden. Algorithmus 14 Naiver Algorithmus zur Berechnung des Aspektgraphen unter orthogonaler 2D-Projektion for jede Kombination (e 1, e 2) zweier Ecken do Bestimme die Linie durch beide Punkte Bestimme die beiden Schnittpunkte der Linie auf dem Projektionskreis Sortiere alle Schnittpunkte nach ihrer Koordinate for jede Region r zwischen zwei aufeinander folgenden Schnittpunkten do Erstelle den LISG für einen Punkt innerhalb der Region r Füge einen neuen Knoten v mit diesem LISG dem Aspektgraphen hinzu for alle Knoten v und v, dessen Regionen nebeneinander liegen do if die LISGs von v und v sind äquivalent then Vereinige beide Knoten else Verbinde v und v durch eine Ecke return den Aspektgraphen Theorem 1 (Laufzeit des naiven 2D-Algorithmus). Die Laufzeit des Algorithmus 14 beträgt O(n 4 ) Beweis. Es gibt m = n(n 1) 2 Kombinationen zweier Ecken und die doppelte Anzahl von Schnittpunkten mit der Projektionsfläche sowie Regionen zwischen diesen, also O(n 2 ). Ein Vergleichssortierer sortiert diese in O(m log m) = O(n 2 log n 2 ). Die Laufzeit für das Erstellen des LISG mit Bestimmung der Verdeckung eines Elementes mit allen anderen beträgt O(n 2 ) ( hidden line removal-algorithmus), für alle Regionen zusammen also O(mn 2 ) = O(n 4 ).

124 116 Michael Kruse Jede Region hat genau 2 Nachbarregionen und das Vergleichen benötigt nur lineare Laufzeit, sofern alle Ecken eindeutige Bezeichner haben. Das Vergleichen aller Nachbarregionen benötigt also O(mn) = O(n 3 ). Der höchste Aufwand beträgt damit O(n 4 ). 3.5 Der Algorithmus von Plantinga und Dyer Hier soll ein Algorithmus mit besserer Laufzeit als der in Abschnitt 3.4 gezeigt werden, wie er in [1] für 3D vorgestellt wurde. Der Trick dabei ist, den Aspektgraphen vor dem VSP zu berechnen. Dafür wird ein neuer Raum eingeführt, der so genannte Aspektraum. Bei der orthogonalen 2D-Projektion kann so eine Laufzeit von O(n 3 ) (statt O(n 4 )) für die Berechnung des VSP erreicht werden. Definition 6 (Der Aspektraum (ASP)). Der Aspektraum ist das kartesische Produkt aus Sichtraum V und Bildraum I. Ein Element belegt einen Punkt des Aspektraumes (v, i) V I, wenn es aus der Betrachterposition v V an der Position i I des Bildes sichtbar ist. Bei der zweidimensionalen orthographischen Projektion haben sowohl Sichtraum als auch der Bildraum eine Dimension von eins. Folglich hat der Aspektraum zwei Dimensionen. Ein Punkt im Aspektraumes soll mit (θ) (s) = (θ, s) beschrieben werden. Abbildung 13 zeigt die LISGs (vertikal ausgerichtet) des Objektes von Abb. 12 in 45 - Schritten. Die vertikale Achse zeigt demnach den Bildraum und die horizontale Achse den Sichtraum. Die Verläufe der Ecken A (rot), B (blau) und C (Olivfarben) sind linear approximiert. Hervorzuheben ist, dass B zwischen 135 und 180 sowie A zwischen 270 und 315 verdeckt wird. A C B Abb. 13: Die LISGs von Abb. 12 Wie man nicht schwer erkennen kann handelt es sich bei A um eine cos-kurve und bei B um eine ( sin)-kurve. Kennzeichnet man nicht die Ecken, sondern die Kanten im Aspektraum, so ergeben sich Flächen wie in Abb. 14. Die Kante CA ist rot und die Kante CB blau markiert. θ

125 Aspektgraphen und Verdeckung 117 Abb. 14: Der Aspektraum zu Abb. 12 Aus dieser Beobachtung lässt sich ein Algorithmus bauen. Für dreidimensionales Rendering werden in Abschnitt 4.7 ein paar mehr Details erläutert. Algorithmus 15 Berechnung des Aspektraumes für orthogonale 2D-Projektion for jede Kante e im Objektraum do A Fläche von e im Aspektraum for jede bereits vorhandene Fläche B im Aspektraum do if A verdeckt B then B B \ A if A wird von B verdeckt then A A \ B (und aktualisiere A im Aspektraum) Füge B zum Aspektraum hinzu Es soll nun die Größe des Aspektraumes bestimmt werden. Bei den Position der Ecken im Aspektraum handelt es sich immer um Sinuskurven mit unterschiedlichen Phasen (Winkel zum Ursprung) und Amplituden (Entfernung zum Ursprung). Zwei solcher Kurven haben maximal 2 Schnittpunkte. Angenommen, das Objekt habe O(n) Ecken (und Kanten), dann haben diese bis zu O(n 2 ) Schnittpunkte im Aspektgraphen. Da dieser außerdem planar ist, gibt es auch nur höchstens O(n 2 ) Kanten und Regionen, was damit die Obergrenze der Komplexität des Aspektgraphen darstellt. Das Kombinieren zweier Aspekträume benötigt O(nm), wobei m und n die Größe er beiden Aspekträume sind. Das sukzessive Hinzufügen von Aspekträumen der Größe O(n) zum gemeinsamen Aspektraum der Größe O(n 2 ) benötigt eine amortisierte Laufzeit von O(n 3 ). Um auch den VSP zu bestimmen reicht es aus, die Bildkoordinate i wegzulassen (Abb. 15). Der verbliebene Raum ist eindimensional und die Ecken müssen höchstens noch

126 118 Michael Kruse nach ihrer Sichtraumkoordinate sortiert werden, was O(n 2 log n 2 ) benötigt. Jedes maximale Intervall zwischen diesen Ecken ergeben genau einen Knoten im Aspektgraphen. Abb. 15: Vom Aspektraum zum VSP unter Weglassung der Bildkoordinate 4 3D-Rendering Das 2D-Rendering-Kapitel wurde zur Veranschaulichung eingeschoben. In diesem Kapitel soll es um das normale Projizieren von 3D-Szenen auf eine 2D-Projektionsfläche gehen. Dabei gibt es ein paar Unterschiede, wie die Natur von Ereignissen. 4.1 Ereignisse Im dreidimensionalen gibt es 2 Ereignistypen. Zum einen gibt es die Möglichkeit, dass ein Element hinter einer Seitenfläche verschwindet oder auftaucht, der Beginn oder das Ende eines verdeckenden Polygons wird durch eine Kante beschränkt. Nur Ecken kommen für das andere Element in Frage da sie den Beginn oder das Ende der anderen Elemente markieren. Deshalb wird dieses EV-Ereignis ( EV für eng. edge-vertex) genannt. Zu Beachten ist, dass es keine Rolle spielt, auf welcher Seite der Kante oder Ecke sich die Seitenfläche befindet, in jedem Fall wird ein Ereignis erzeugt. Abbildung 16 illustriert davon ein paar Möglichkeiten. Die erzeugte potenzielle kritische Region ist eine Ebene durch die Kante und die Ecke, in den Abbildungen blau-transparent angedeutet.

127 Aspektgraphen und Verdeckung 119 Abb. 16: Ausprägungen von EV-Ereignissen Der zweite Typ sind die EEE-Ereignisse ( EEE für eng. edge-edge-edge). Dabei führt die Sichtlinie an drei unterschiedlichen Kanten vorbei, die sich vom Betrachter aus gesehen in einem Punkt schneiden (Abb. 18a und 17b). Der LISG ändert sich an dieser Stelle, weil sich ein oder mehrere T-Junctions auf andere Kanten verschieben (Abb. 17 (a) und (c)). Es spielt auch hier prinzipiell keine Rolle, auf welche Seite der Kanten die Seitenfläche zu sehen ist. (a) (b) Abb. 17: Ein EEE-Ereignis aus der Betrachterperspektive Es soll nun die kritische Region bestimmt werden, welche durch ein EEE-Ereignis erzeugt wird. Seien 3 Kanten gegeben. Kante 1 verbindet die Punkte p 11 und p 12, Kante 2 die Punkte p 21 und p 22, Kante 3 die Punkte p 31, p 32. Die Sichtlinie schneidet jede dieser Kanten. Sei nun p ein Punkt auf der ersten Kante, die die Sichtlinie kreuzt (Gleichung 1, Abb. 18b zeigt drei solcher Sichtlinien). p =p 11 + s(p 12 p 11 ) (1) (c) (a) (b) (c) Abb. 18: EEE-Ereignis Seien dann n 2 und n 3 die Normalen zweier Ebenen, die jeweils den Punkt p und die Kante p 21 p 22 bzw. p 31 p 32 enthalten (Gleichung 2). n 2 =(p 21 p) (p 21 p 22 ) n 3 =(p 31 p) (p 31 p 32 ) (2) Die Schnittlinie dieser beiden Ebenen entspricht der gesuchten Sichtlinie, die den Punkt p enthält sowie die beiden anderen Kanten kreuzt. Der Richtungsvektor ergibt sich durch

128 120 Michael Kruse das Kreuzprodukt beider Normalen (Gleichung 3). Als Ortsvektor eignet sich der Punkt p. Die sich ergebende Geradengleichung 4 ist linear abhängig von t und quadratisch von s. Interpretiert man diese als Parameter eine bivarianten Funktion, so erhält man die Formel für die Fläche der (potentiellen) kritischen Region. q =p + td =p 11 + s(p 12 p 11 ) d =n 2 n 3 (3) + t(((p 21 (p 11 + s(p 12 p 11 ))) (p 21 p 22 )) ((p 31 (p 11 + s(p 12 p 11 ))) (p 31 p 32 ))) =f(t, s) Damit sind die Regionen des VSP nicht unbedingt Polyeder, die durch gerade Flächen begrenzt werden. Abbildung 18c zeigt die kritische Region für das gegebene Beispiel grautransparent. Wie zwei quadratische univariante Funktionen nur höchstens 2 Schnittpunkte haben, so haben zwei bivariante Funktionen nur höchsten 2 (quadratische) Schnittkurven. Dadurch, dass es zwei Schnittkurven und -punkte geben kann, ändert sich jedoch nicht die Methodik der Berechnung des VSP oder Aspektgraphen. Die asymptotische Laufzeit für die Berechnung bleibt gleich. Zur Vereinfachung werden daher in den folgenden Abschnitten Begriffe verwendet, die eigentlich nur auf Polytope zutreffen. Man kann ein EV-Ereignis auch als Spezialfall des EEE-Ereignisses ansehen: Wenn sich zwei der Kanten eines EEE-Ereignisses in einem Punkt schneiden, so entsteht dort eine Ecke. Zusammen mit der dritten Kante bildet diese das EV-Ereignis. Deshalb genügt die Betrachtung das EEE-Ereignisses. 4.2 Orthographische Projektion Für die orthographische 3D-zu-2D-Projektion (3D-Parallelprojektion) werden für den Sichtraum zwei Winkel für die Sichtlinien benötigt, z.b. θ für die XZ-Achse und ϕ für die XY- Achse. Alternativ kann ein normierter Richtungsvektor der Sichtrichtung angegeben werden. Der Bildraum bleibt jedoch durch zwei kartesische Koordinaten bestimmt. Anschaulich ist der Sichtraum eine Sphäre mit unendlichem Durchmesser um die Szene im Objektraum. Die Projektionsfläche und damit der Bildraum ist eine Ebene, die die Sphäre am gewählten Sichtpunkt tangiert. Dimensionen Koordinaten Objektraum 3D (x, y, z) Sichtraum 2D (θ, ϕ) oder (u, v, w) mit (u, v, w) = 1 Bildraum 2D (s, t) Abb. 19: Kenndaten orthographischer 3D-zu-2D-Projektion Abbildung 20 zeigt einen gerenderten Tetraeder, seinen VSP auf der Projektionsphäre und den zugehörigen Aspektgraph. Regionen des VSP und Knoten des Aspektgraphen sind grün markiert, wenn 3 Seitenflächen zu sehen sind, blau bei 2 Seitenflächen und grün bei nur einer sichtbaren Seitenfläche. (4)

129 Aspektgraphen und Verdeckung 121 Objektraum VSP Aspektgraph Abb. 20: Ein Tetraeder unter orthographischer Projektion 4.3 Perspektivische Projektion Analog kann man die perspektivische 3D-zu-3D-Projektion (3D-Zentralprojektion) betrachten. Der Sichtraum ist eine Position des Betrachters innerhalb des Objektraumes und somit dreidimensional. Die Projektionsfläche soll eine Sphäre um den Betrachter sein, daher kann ein Punkt im Bildraum mit zwei Winkeln angegeben werden. Dimensionen Koordinaten Objektraum 3D (x, y, z) Sichtraum 3D (u, v, w) Bildraum 2D (α, β) Abb. 21: Kenndaten perspektivischer 3D-zu-2D-Projektion 4.4 Maximale Größe eines Aspektgraphen Sei eine Szene oder ein Objekt mit v Ecken, e Kanten und a Flächen gegeben und sei n = max {v, e, a}. Allgemeiner beschrieben handelt es sich einfach um ein Objekt der Größe O(n). Weiterhin soll angenommen werden, dass bei Schnitten immer der Normalfall zutrifft. Sonderfälle wie parallele Geraden und Flächen sowie dass zwei Geraden oder Flächen identisch fallen werden ausgeblendet. Zwei Geraden haben immer einen Schnittpunkt und zwei Flächen immer eine Schnittgerade um Sonderfälle nicht einzeln behandeln zu müssen. Sie gelten als well-behaved[4]. Theorem 2 (Maximale Größe bei orthographischer Projektion). Der Aspektgraph hat bei orthographischer 3D-Projektion maximal O(n 6 ) Ecken und Kanten, wobei n die Anzahl der Ecken, Kanten und Flächen der abgebildeten Objekts ist. Beweis. Die Größe des VSP hängt primär von der Anzahl der Ereignisse ab. Für den allgemeineren Fall der EEE-Ereignisse müssen 3 Ecken kombiniert werden. Es gibt O(n 3 ) solcher Kombinationen, die zusammen ein EEE-Ereignis erzeugen können. Dies sind die potentiellen kritischen Regionen in Form von quadratischen Flächen. Abgebildet auf den Sichtraum die unendlich große Sphäre um das Objekt werden diese auf quadratische Kurven abgebildet (die Schnittmenge mit dieser Sphäre). Zwei quadratische Kurven haben maximal 2 Schnittpunkte und somit gibt es insgesamt O(2n 3 n 3 ) = O(n 6 )

130 122 Michael Kruse Schnittpunkte aller Kombinationen zweier Kurven. Da der dadurch entstandene Graph von Schnittpunkten und verbindende Kurven planar ist, gibt es auch höchstens O(n 6 ) Kanten und Regionen. Damit hat auch der Aspektgraph eine Größe von O(n 6 ), denn dieser ist zum VSP dual. Theorem 3 (Maximale Größe bei perspektivischer Projektion). Der Aspektgraph hat bei perspektivischer 3D-Projektion maximal O(n 9 ) Ecken und Kanten, wobei n die Anzahl der Ecken, Kanten und Flächen des abgebildeten Objektes ist. Beweis. Auch hier gibt es O(n 3 ) Kombinationen dreier Kanten und somit O(n 3 ) EEE- Ereignisse. Im dreidimensionalen Raum werden drei Ebenen benötigt, um einen Schnittpunkt zu erzeugen. Zwei quadratische Flächen haben bis zu zwei Schnittkurven. Mit einer weiteren quadratischen Fläche haben diese Kurven je bis zu 2 Schnittpunkte. Somit gibt es O(4(n 3 ) 3 ) = O(n 9 ) Schnittpunkte mit allen Kombinationen dreier EEE-Ereignisse. Man betrachte nun eine einzelne kritische Region eines EEE-Ereignisses. Alle anderen O(n 3 ) kritischen Regionen bilden O(n 3 ) Schnittkurven auf der einzelnen kritischen Region. Wie bei der orthographischen Projektion bilden diese einen planaren Graph mit O(n 6 ) Ecken (die Schnittpunkte der Kurven), Kanten und Flächen. Alle O(n 3 ) haben dann zusammen O(n 3 ) O(n 6 ) = O(n 9 ) Ecken, Kanten und Flächen. Jede Fläche hat auf beiden Seiten eine räumliche Region ( Zelle). Mit den O(n 9 ) Flächen gibt es also höchstens O(2n 9 ) = O(n 9 ) Zellen im VSP. Wegen der Dualität ist auch der Aspektgraph von der Größenordnung O(n 9 ). Sollte man für jeden Knoten des Aspektgraphen auch speichern, welche Flächen sichtbar sind (z.b. den LISG), so erhöht sich der Speicherbedarf für jeden Knoten entsprechend um O(n) oder O(log n)[4]. 4.5 Minimale Größe eines Aspektgraphen In diesem Abschnitt soll gezeigt werden, dass Szenen mit dieser Komplexität auch wirklich gibt (und eigentlich auch der Regelfall ist). Theorem 4 (Worst-Case-Größe bei orthographischer Projektion). Die Worst-Case- Komplexität eines Aspektgraphen bei orthographischer Projektion ist Ω(n 6 ) Beweis. Gegeben sei folgendes Objekt: n vertikale Streifen mit gleicher Breite (rot in der Abbildung 22a) und davor n horizontale Streifen (grün), welche ein Gitter bilden. Die vertikalen Streifen sind dabei leicht gedreht, so dass sie nicht ganz orthogonal zu den horizontalen Streifen sind. Weiter davor befinden sich wiederum n vertikale Streifen (grau) mit kleineren Sichtschlitzen. Diese sollen gerade so groß sein, dass eine vollständige Kante der leicht gekippten vertikalen Streifen zu sehen ist, aber es kann niemals das Gitter durch zwei Schlitze gleichzeitig beobachtet werden. Die Ausdehnung der Streifen nach hinten sei vernachlässigbar. Die Kanten der vertikalen Streifen, der horizontalen Streifen und der Sichtschlitze können sich von bestimmten Positionen des Betrachters aus scheinbar in einem Punkt schneiden, was zuvor EEE-Ereignis genannt wurde. Bewegt sich nun der Betrachter in horizontaler Richtung, so bekommt er folgende EEE-Ereignisse mit: Das Gitter hat (n 1) 2 Löcher mit jeweils 4 Ecken. Mit jedem Sichtschlitz schneidet sich jede dieser Ecken an den den Seitenkanten des Schlitzes zwei mal. Einmal beim Auftauchen vor einem Streifen und ein

131 Aspektgraphen und Verdeckung 123 weiteres mal beim verdeckt werden durch den nächsten Streifen. Da es n 1 Sichtschlitze gibt, ändert sich der LISG 2(n 1) 3 = Θ(n 3 ) mal, da jedesmal T-Junctions erscheinen oder verschwinden. Stellt man bei orthogonaler Projektion zwei solcher Streifenmuster nebeneinander, eines davon um 90 gedreht (Abb. 22a), so schneiden sich alle vertikalen kritischen Regionen des einen mit den horizontalen kritischen Regionen des anderen. Beide haben Θ(n 3 ) kritische Regionen, so dass es insgesamt Θ(n 6 ) Schnittpunkte und Regionen auf der Projektionssphäre gibt und somit Θ(n 6 ) Knoten im zugehörigen Aspektgraphen. (a) Abb. 22: Beispiele mit maximaler asymptotischer Größe des Aspektgraphen (b) Theorem 5 (Worst-Case-Größe bei perspektivischer Projektion). Die Worst-Case- Komplexität eines Aspektgraphen bei perspektivischer Projektion ist Ω(n 9 ) Beweis. Für die perspektivische Projektion benötigt man 3 solcher Streifenmuster, angeordnet wie in Abbildung 22b. Der Betrachter befindet sich zwischen allen Sichtschlitzen. Er kann sich vertikal, horizontal und nach vorn und hinten bewegen und jedesmal überquert er bis zu Θ(n 3 ) kritische Regionen. Alle kritischen Regionen aller drei Streifenmuster treffen sich in Θ((n 3 ) 3 ) Punkten. Dies entspricht einer Anzahl von Θ(n 9 ) Knoten im Aspektgraphen. 4.6 Der naive Algorithmus Wie für die 2D-Projektion soll hier exemplarisch nur der orthographische Fall behandelt werden. Der perspektivische Fall folgt jedoch dem gleichen Schema.

132 124 Michael Kruse Algorithmus 16 Naiver Algorithmus zur Berechnung des Aspektgraphen unter orthogonaler 3D-Projektion for jede Kombination (e 1, e 2, e 3) dreier Kanten do Berechne kritische Region Berechne Schnittkurve mit der Projektionssphäre for jede Kombination (g 1, g 2) zweier Kurven auf der Projektionsfläche do Finde Schnittpunkt(e) zwischen g 1 und g 2 Verbinde Punkt(e) mit den bisher gefundenen Nachbarpunkten Mit einem Graphensuchalgorithmus finde alle Regionen im Graphen for jede gefundene Region r do Erstelle den LISG für einen Punkt innerhalb der Region r Füge einen neuen Knoten v mit diesem LISG dem Aspektgraphen hinzu Füge eine Kante mit jedem Knoten einer Nachbarregion hinzu for jeden Nachbarknoten v do if die LISGs von v und v sind äquivalent then Vereinige beide Knoten break for Theorem 6 (Laufzeit des naiven 3D-Algorithmus). Die Laufzeit des Algorithmus 16 ist O(n 10 ) unter orthographischer Projektion. Beweis. Die erste for-schleife wird m = O(n 3 )-mal durchlaufen, da es so viele Kombinationen dreier Kanten gibt. Projiziert auf die Projektionssphäre ergeben dies m Kurven. Jede Kurve kann jede andere bis zu vier mal schneiden, so dass es q = O(4m 2 ) = O(n 6 ) Schnittpunkte gibt. Ein Graphensuchalgorithmus kann alle Regionen in linearer Laufzeit bezüglich q finden. Das Erstellen des LISG mit Verdeckung für an einer Betrachterposition innerhalb einer Region ist mit einem hidden-line-removal-algorithmus in O(n 2 ) möglich. Eine Region kann durch alle O(m) Kurven begrenzt werden und sie von einer anderen Region trennen, so das es O(m) Nachbarregionen gibt. Ein LISG hat O(n) Elemente, diese miteinander auf Äquivalenz zu vergleichen kostet O(n) für jede Nachbarregion. Die letzte äußere Schleife hat also eine Laufzeit von q(o(n 2 ) + mo(n)) = O(n 6 (n 2 + n 3 n)) = O(n 10 ). Verfolgt man das gleiche Schema für den perspektivischen Fall, so erhält man eine Laufzeit von O(n 13 ). Damit ist die Laufzeit in beiden Fällen um das O(n 4 )-fache größer als die Ausgabegröße. Dass das auch besser geht zeigt, wie beim 2D-Fall auch, der folgende Algorithmus im nächsten Abschnitt. 4.7 Der Algorithmus von Plantinga und Dyer Wie bei Anwendung auf das 2D-Rendering ist der Trick dabei, den Aspektgraphen vor dem VSP zu berechnen. Dabei werden die Objekte wieder in den Aspektraum übertragen. Dieser ist (θ, ϕ, s, t) für orthogonale und (u, v, w, α, β) für die perspektivische Projektion und somit 4-dimensional (bzw. 5-dimensional). Die orthogonale Projektion besteht im Wesentlichen aus einer Rotation des Objektraumes und dann dem Weglassen der dritten Koordinate. Verdeckungen werden noch nicht berücksichtigt. Stellt man die Sichtrichtung nicht mit zwei Winkeln dar, sondern mit einem Richtungsvektor, ergibt sich die Abbildungsmatrix 5. w ist dabei der normierte Richtungsvektor, v ein normierter zu w orthogonaler Vektor und u = w v. v wird in der Computergraphik auch up-vektor genannt. Er bestimmt die Rotation des Bildes und ist zur Berechnung des LISG nicht von Bedeutung.

133 ( ) s = t ( Aspektgraphen und Verdeckung 125 ) x u y u z x u v x v y v z y (5) w x w y w z z Eine Ecke im Objektraum ergibt übertragen in den Aspektraum einen Grat (2D in orthographischer, 3D bei perspektivischer Projektion), da er ohne Überdeckung von überall sichtbar ist und im Bildraum als ein Punkt (0D) erscheint. Analog ist eine Kante im Objektraum eine Facette (3D in orthographischer, 4D in perspektivischer Projektion) im Aspektraum. Eine Seitenfläche des Objektraumes (die andere Elemente verdecken kann) ist eine volldimensionale Zelle im Aspektraum. Zu den Begriffen Peak, Grat, Facette und Zelle siehe auch Tabelle 3. Auch wenn die Elemente keine Polytope sein müssen, sollen diese Begriffe hier verwendet werden. Dimension 3D-Raum 4D-Raum 5D-Raum 0D Ecke, Punkt Punkt Punkt 1D Kante, Linie Linie, Peak Linie 2D Polygon, Seitenfläche Grat, Polygon Polygon, Peak 3D Polyeder Facette, Polyeder Grat, Polyeder 4D Zelle, Polychor, 4-Polytop Facette, Polychor 5D Zelle, 5-Polytop Tabelle 3: Benennung von Elementen in höherdimensionalen Räumen Der Aspektraum lässt sich berechnen, indem man alle Seitenflächen des Objektraumes konsekutiv dem Aspektraum hinzufügt (Algorithmus 17). Eine Seitenfläche unterteilt den Raum in zwei Halbräume. Elemente im Halbraum hinter der Seitenfläche können verdeckt werden, während Elemente im vorderen Halbraum die Fläche verdecken können (Die Rückseite der Seitenfläche soll durchsichtig sein). Daher müssen die sich im Aspektraum überlappenden Elemente voneinander subtrahiert werden. Die Seitenfläche wird von den von den Elementen im hinteren Halbraum und die Elemente des vorderen Halbraums von der Seitenfläche subtrahiert. Algorithmus 17 Berechnung des Aspektraumes für 3D-Projektion 1: A leerer Aspektraum 2: for jedes Polygon a im Objektraum do 3: B Ausdehnung von a als Polytop des Aspektraumes 4: A vorne A Halbraum auf der Vorderseite von a 5: A hinter A Halbraum auf der Rückseite von a 6: A hinter A hinter \ B 7: B B \ A vorne 8: A A vorne A hinter B 9: return A Die Mengenoperationen sind nicht ganz trivial. Alle Elemente im Aspektraum können durch Facetten beschrieben werden. Alle Zellen werden durch Facetten begrenzt. Facetten sind ihrerseits Repräsentationen von Kanten des Bildraumes. Zwei Facetten schneiden sich in einem Grat und repräsentieren somit einen Punkt. Drei Facetten schneiden sich in einem Peak und entsprechen einem EEE-Ereignis. Vier Facetten schneiden sich in einem

134 126 Michael Kruse Punkt (bzw. Linie) und entsprechen einem Element, welches einen Punkt auf der Bildebene darstellt, der nur bei einem ganz bestimmten Ansichtswinkel zu sehen ist. Im 5D-Raum könnten sich auch fünf Facetten in einem Punkt schneiden. Dies entspräche einem Punkt auf der Bildfläche, welcher nur an einer ganz bestimmten Betrachterposition zu sehen wäre. Wenn es diesen Punkt allerdings gibt, so kann sich der Betrachter auf der Sichtlinie zum Punkt beliebig vor und zurück bewegen, ohne den Punkt aus den Augen zu verlieren, ein Widerspruch. Ein solches Ereignis kann es daher nicht geben. Der Aspektraum hat also O(n) Facetten, O(n 2 ) Grate, O(n 3 ) Peaks und höchstens O(n 4 ) Punkte (bzw. Linien) entsprechend der Anzahl von Kombinationen von Facetten. Wie die zugehörigen EEE-Ereignisse sind die Peaks von den Aspektraumkoordinaten quadratisch abhängig. Entsprechend sind die Punkte (bzw. Linien) Funktionen dritten Grades. Nun kann auch die Laufzeit des Algorithmus bestimmt werden. Theorem 7 (Laufzeit des Algorithmus von Plantinga und Dyer). Die Laufzeit des Algorithmus 16 ist bei orthographischer und perspektivischer Projektion O(n 5 ) Beweis. O(n) Elemente werden konsekutiv dem Aspektraum hinzugefügt. In [6] wird gezeigt, dass die Laufzeit für das Vereinigen zweier Aspekträume O(nm) beträgt, n und m sind die jeweiligen Größen der Aspekträume. Das Vereinigen aller Aspekträume zu einem Aspektraum der Größe O(n 4 ) ist in O(n 5 ) möglich. Aus dem Aspektraum kann auch der VSP bestimmt werden. Wie vorher gezeigt hat der VSP wie auch der Aspektgraph eine Komplexität von Θ(n 6 ) (bzw. Θ(n 9 )), der Aspektraum jedoch nur O(n 4 ). Das resultiert daraus, dass der Aspektraum auf den Sichtraum abgebildet wird indem die Bildkoordinaten entfernt werden. Durch diese Operation kann es deutlich mehr Schnitte zwischen den Elementen geben. Die O(n 3 ) Peaks (Linien) im orthogonalen Aspektraum sind Linien im Sichtraum, die sich in O((n 3 ) 2 ) = O(n 6 ) Punkten schneiden können. Die O(n 4 ) Linien im perspektivischen Aspektraum könnten sich in O((n 4 ) 2 ) = O(n 8 ) Schnittpunkten treffen, aber die O(n 3 ) Peaks (Flächen) in O((n 3 ) 3 ) = O(n 9 ) Punkten. Die die O(n 6 ) (bzw. O(n 9 )) Schnittpunkte im Sichtraum der O(n 3 ) Peaks lassen sich nach [1] mittels binärer Suche in nur O(log n) zum VSP hinzufügen. Das ergibt eine Gesamtlaufzeit von O(n 6 log n) für die orthographische und O(n 9 log n) für die perspektivische Projektion. Um den VSP in den dualen Aspektgraphen zu konvertieren ist nur noch lineare Laufzeit nötig, der jeweilige Aspekt (z.b. der LISG) wurde damit aber noch nicht bestimmt. Dies kann wie beim naiven Algorithmus auch in O(n 2 ) pro Knoten des Aspektgraphen geschehen. 5 Fazit Ein Aspektgraph bietet eine Möglichkeit, Sichtbarkeiten einer Szene in einer Datenstruktur zu speichern. Die Laufzeit und der Speicherplatzbedarf der hier vorgestellten Methode zur genauen Bestimmung der Sichtbarkeit jedes einzelnen Elementes ist zwar polynomiell bezüglich der Anzahl der Elemente in der Szene, für praktische Einsätze in der Computergraphik aber viel zu hoch (vgl. Tabelle 4). Selbst durch den hier vorgestellten Algorithmus von Plantinga und Dyer verbessert sich das nicht wesentlich. Für bestimmte Anwendungen jedoch, wie z.b. Echtzeitgrafik, ist lineare Laufzeit ein Muss. In diesem Anwendungsgebiet

135 Aspektgraphen und Verdeckung 127 ergäbe es jedoch auch keinen Sinn, die Sichtbarkeit auf jede Ecke genau zu Bestimmen. Daher kann man überlegen, wie der Aspektgraph approximiert werden kann. Tabelle 4 fasst die Strukturgrößen und Berechnungslaufzeiten zusammen. Mit dem Zusatz konvex markierte Zeilen treffen auf den Spezialfall mit einem konvexen Polyeder im Objektraum zu. Die Daten sind teilweise aus [1] entnommen. Rendermodus Größe des VSP Naiver Ansatz Erreichbar 2D orthographisch O(n 2 ) O(n 4 ) O(n 3 ) 2D perspektivisch O(n 4 ) O(n 7 ) O(n 4 log n) 3D orthographisch konvex O(n 2 ) O(n 7 ) O(n 2 ) 3D perspektivisch konvex O(n 3 ) O(n 9 ) O(n 3 ) 3D orthographisch O(n 6 ) O(n 10 ) O(n 6 log n) 3D perspektivisch O(n 9 ) O(n 13 ) O(n 9 log n) Tabelle 4: Vergleich der Größe und Berechnungslaufzeit eines VSP Literaturverzeichnis 1. Plantinga WH, Dyer CR (1990) Int J Comput Vision, Volume 5, Number 2: id Software, Apogee Software Ltd (1992) Wolfenstein 3D. 3. Matthias H (2007) Parametrisierte Generierung und automatische Bewertung virtueller Szenen. Diplomarbeit, University of Paderborn, Paderborn Schiffenbauer RD (2001) A survey of aspect graphs. PhD thesis, Polytechnic University of Brooklyn, New York 5. Koendrick JJ, van Doorn AJ (1976) Biological Cybernetics 24: Plantinga WH, Dyer CR (1990) The aspect representation. In: Technical Report 684. University of Wisconsin-Madison, Wisconsin-Madison

136

137 Teil II Seminar

138

139 Cell to Cell Visibility in PVS Systemen André Gärtner Universität Paderborn Zusammenfassung. Um das Sichtbarkeitsproblem in Architekturen zu lösen, werden Räume in Zellen aufgeteilt und über Portale miteinander verbunden. Diese Arbeit erklärt, wie man durch Berechnung von Stabbing Lines, die durch die Portale gelegt werden, die Sichtbarkeit sowie Schatten, der durch lichtblockierende Objekte (z.b. Wände) entsteht, innerhalb der Zellen bestimmt werden kann. Dazu wird eine Methode gezeigt, wie sich das Problem auf den Schnitt von Kanten eines fünfdimensionalen Polytops mit vierdimensionalen Hyperebenen übertragen läßt. Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten. 1 Einleitung Plücker-Koordinaten Berechnung der Stabbing Lines Stabbing von 3D Portal-Sequenzen Penumbra und Antipenumbra Oberflächen und Schneisen Grenz- und innenseitige Schneisen Zweidimensionales Beispiel EEE Schneisen VE Schneisen Containment Funktion Berechnung des Antipenumbra Algorithmus am Beispiel Fazit Literaturverzeichnis Einleitung In der Computergraphik ist ein häufiges Problem, die Sichtbarkeit verschiedener Objekte zu bestimmen. Dies ist z.b. der Fall, wenn man innerhalb einer Szene entscheiden muss, was von einem bestimmten Standpunkt aus sichtbar ist. Die Berechnung, ob ein Objekt von dort aus sichtbar ist, ist zeitaufwendig und daher insbesondere für komplexe Architekturen oder Videospiele, in denen viele Objekte durch Wände verdeckt sind, nur eingeschränkt oder gar

140 132 André Gärtner nicht in Echtzeit möglich. Man versucht daher präventiv die Menge der potentiell sichtbaren Objekte (engl. Potentially Visible Set, PVS) zu bestimmen und alle nicht sichtbaren Objekte auszusortieren, so dass zur Laufzeit nur noch eine kleine Teilmenge aller Objekte gerendert werden muss. Gelöst wurde dieses Problem von Teller und Séquin [5, 6] für den zweidimensionalen Raum. Räume eines Gebäudes werden dabei in Zellen aufgeteilt, die über durchsichtige Portale miteinander verbunden sind. Zwischen einzelnen Zellen besteht genau dann eine Sichtbarkeit, wenn durch eine Sequenz von Portalen eine Gerade (engl. Sightline oder Stabbing line) hindurch gelegt werden kann. Auf diese Weise können nun für jede Zelle die von dort aus sichtbaren Zellen bestimmt werden, so dass die Anzahl der zur Laufzeit zu betrachtende Objekte auf die in diesen Zellen befindlichen Objekte verringert werden kann. Dieses Vorgehen lässt sich auch im dreidimensionalen Raum, durch Suchen einer Stabbing Line, die durch eine Sequenz aus Portalen in der Form konvexer orientierter Polygone verläuft (Abb. 1), anwenden. Übertragen läßt sich das Problem auf den Schnitt der Kanten eines fünfdimensionalen Polytops mit einer vierdimensionalen Hyperebene 1. Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten [3, 6], die die Darstellung einer Geraden des R 3 als Punkt oder Hyperebene des fünfdimensionalen projektiven Raumes ermöglichen. Ein weiterer Anwendungsbereich, der die Suche nach Stabbing Lines ausnutzt, ist die Berechnung von Licht und Schatten, wie sie in einer weiteren Arbeit von Teller [2, 6] beschrieben wird. Versteht man die Stabbing Lines nicht als Sichtlinien sondern als Lichtstrahlen, so kann auf diese Weise berechnet werden, wie viel Licht auf ein Objekt fällt. Je nachdem, ob Lichtstrahlen ganz, teilweise oder gar nicht durch andere Objekte verdeckt werden, befindet sich das Objekt entweder in einem Schatten oder Halbschatten oder aber ist voll erleuchtet. Abb. 1. Stabbing Line durch vier unterschiedliche Polygone 2 Plücker-Koordinaten Zur Darstellung von Punkten im projektiven Raum werden homogene Koordinaten verwendet. Punkte des euklidischen Raums R n werden dazu im projektiven Raum P n durch ein (n + 1)-Tupel beschrieben, indem den n ursprünglichen Koordinaten eine zusätzliche Koordinate w hinzugefügt wird, wobei w eine reele Zahl mit w 0 ist. In der Computer- 1 Eine Hyperebene ist das Äquivalent zu einer Ebene in höher-dimensionale Räumen. Sie teilt diesen Raum in zwei Hälften.

141 Cell to Cell Visibility in PVS Systemen 133 graphik wird zumeist w = 1 gewählt, so dass der Punkt (x, y, z) des R 3 auf (x, y, z, 1) im P 3 abgebildet wird. Ein geordnetes Paar voneinander verschiedener Punkte p = (p x, p y, p z ) und q = (q x, q y, q z ) definiert eine gerichtete Gerade l im R 3. Im projektiven Raum P 3 kann dies als 2 x 4 Matrix dargestellt werden: ( ) px p y p z 1 q x q y q z 1 Durch Plücker-Koordinaten [7] ist es möglich diese Darstellung auf ein 6-Tupel Π l = (π l0, π l1, π l2, π l3, π l4, π l5 ) abzubilden, das diese Gerade ebenfalls eindeutig beschreibt. Dazu werden die Determinanten der sechs 2 x 2 Untermatrizen berechnet und wie folgt den π i zugeordnet: π l0 = p x q y q x p y π l1 = p x q z q x p z π l2 = p x q x π l3 = p x q y q x p y π l4 = p z q z π l5 = q y p y Die Elemente des so entstandene 6-Tupels können als homogene Koordinaten eines Punktes im P 5 (dem Plücker-Raum) aufgefasst werden. Eine Gerade im R 3 entspricht somit einem Punkt im P 5. Durch Permutation der einzelnen Koordinaten erhält man den Vektor (π 4, π 5, π 3, π 0, π 1, π 2 ), mit dem sich eine Hyperebene im R 5 beschreiben lässt, die alle Geraden enthält, die die ursprüngliche Gerade im R 3 schneiden. Die Untersuchung der gegenseitigen Lage zweier Geraden im R 3 lässt sich nun auf die Überprüfung der Lage eines homogenen Punktes (als Repräsentant der einen Gerade) zu einer Hyperebene (als Repräsentant der anderen Gerade) im P 5 zurückführen. Wenn a und b zwei gerichtete Gerade sind, und Π a, Π b die korrespondierenden Plücker Darstellungen, kann eine Relation side(a, b) als permutiertes inneres Produkt definiert werden: Π a Π b = π a0 π b4 + π a1 π b5 + π a2 π b3 + π a4 π b0 + π a5 π b1 + π a3 π b2 Mit Hilfe dieser Relation kann bestimmt werden, wie die beiden Geraden zueinander liegen (Abb. 2). Gilt side(a, b) < 0, so läuft die Gerade b dem Uhrzeigersinn an a vorbei, wenn man auf die Spitze der gerichteten Geraden a schaut. Für side(a, b) > 0 läuft b genau entgegengesetzt an a vorbei (Rechte-Hand-Regel). In beiden Fällen sind die Graden windschief zueinander. Gilt hingegen side(a, b) = 0, so sich beide Geraden koplanar, d.h. sie scheiden sich oder aber sie sind parallel. Jede gerichtete Gerade in 3D-Raum korrespondiert mit einen Punkt im Plücker-Raum, aber nicht umgekehrt. Nur die Punkte Π, die der quadratischen Relation genügen Π Π = 0 korrespondieren zu realen Geraden im 3D-Raum. Bei allen anderen Punkten handelt es um imaginären Gerade (Geraden mit komplexen Koeffizienten).

142 134 André Gärtner Abb. 2. Anordnungen von Geraden im 3D-Raum und ihre Entsprechung im 5D-Raum Abb. 3. Anordnungen von Geraden im 3D-Raum und ihre Entsprechung im P 5 Graphisch kann man sich die Punkte, die die obige quadratische Gleichung erfüllen, als eine 4-dimensionale, durch eine Linie begrenzte Fläche im P 5 (ein so genannten Plücker- Quadrik) vorstellen, oder - in den R 3 übertragen - als einen einschaligen Hyperboloiden (Abb. 3). Im Folgenden wird für die Abbildung einer gerichteten Geraden l des R 3 auf Plücker- Koordinaten die Funktion Π : l Π(l) verwendet. Für die Rückübertragung von Punkten, die auf der Plücker-Quadrik liegen, dient die Funktion L : Π l(π). 3 Berechnung der Stabbing Lines Angenommen, eine Szene besteht aus einer beliebigen Anzahl konvexer orientierter Polygone, die jeweils ein Portal repräsentieren. Insgesamt besitzen diese Polygone n Kanten (auch Generatorkanten genannt). Jede Kante E k mit kɛ1,..., n dieser Polygone ist durch ein Segment einer gerichtete Gerade e k bestimmt. Da die Polygone orientiert sind, kann jede dieser Geraden e k so orientiert werden, dass eine durch die Portal gelegte Stabbing Line s zu jeder dieser Geraden e k im gleichen Verhältnis verlaufen muss (Abb. 4). In einem rechtsgerichteten Koordinatensystem bedeutet dies, dass s die Relation side(s, e k ) 0 mit kɛ1,..., n erfüllen muss. Die zu e k korrespondierende Hyperebene h k ist definiert als: h k = {xɛp 5 : x Π k = 0}

143 Cell to Cell Visibility in PVS Systemen 135 Abb. 4. Verlauf der Stabbing Line s entlang der Kanten eines Polygons Für jede Stabbing Line s mit side(s, e k ) 0 gilt daher S Π k 0, wobei S die Darstellung von s in Plücker-Koordinaten ist. Im P 5 muss sich der Punkt S folglich in oder oberhalb der Hyperebenen h k befinden (Abb. 5). Bezeichnet h + k den durch h k abgeschlossenen Halbraum, dann liegt S innerhalb oder auf der Grenze des konvexen Polytops k h+ k, das durch diese Hyperebenen gebildet wird. Abb. 5. Lage von S = Π(s) zu den Hyperebenen h k Die Oberflächenstruktur eines konvexen Polytops k h+ k (die konvexe Hülle) besitzt eine Worst-Case Komplexität quadratisch zu der Anzahl der definierenden Halbräume [8] und kann durch einen randomisierten Algorithmus in O(n 2 ) berechnet werden [9]. Allerdings ist es nicht ausreichend, einen Punkt innerhalb des durch die Hyperebenen gebildeten Polytops zu finden, da nicht alle Punkte innerhalb dieses Polytops tatsächlich einer Gerade im R 3 entsprechen. Eine solche Gerade existiert genau dann, wenn es einen Punkt x gibt, der sich sowohl innerhalb oder auf der Grenze des konvexen Polytops befindet (x Π k 0, k) und zugleich auch auf einer Plücker-Quadrik liegt (x x = 0). Gesucht ist somit die Schnittmenge der Plücker-Quadrik mit dem durch k h+ k begrenzten Polytop. Diese Menge lässt sich durch die folgende Überlegung weiter einschränken: Existiert eine - durch eine Reihe von Polygonen - durchgehende Gerade, die keine der Polygonkanten berührt, so lässt sich diese Gerade derart verschieben, dass sie zunächst eine Kante, dann zwei, drei und schließlich vier Kanten berührt. Die Menge der so gebildeten Stabbing Lines wird Extremal genannt (dazu mehr in Kapitel 4). Die Anzahl von vier Kanten ergibt sich aus der Tatsache, dass eine Geraden im dreidimensionalen Raum gerade durch die Bestimmung von vier Freiheitsgrade spezifiziert wird.

144 136 André Gärtner So kann eine Gerade z.b. durch Angabe zweier Abschnitte auf zwei vorgegebenen Koordinatenebenen bestimmt werden, wofür jeweils zwei Koordinaten ausreichen. Alternativ können für die Abdeckung der Freiheitsgrade auch vier Geraden (eben die Polygonkanten) verwendet werden, die die gesuchte Gerade scheiden. Diese Gerade verläuft dann entweder durch die Vertices 2 zweier Polygone, durch den Vertex eines Polygons und die windschiefe Kanten zweier anderer Polygone oder aber durch die windschiefen Kanten von vier verschieden Polygonen. Abb. 6. Schnitt einer aus vier Hyperebenen Π k gebildeten fünfdimensionalen Linie L mit dem Plücker- Quadrik Betrachtet man je vier dieser Geraden als Hyperebenen im Plücker-Raum, so spezifiziert ihre Schnittmenge eine Gerade L des fünfdimensionalen Raumes. Die so gebildete Gerade entspricht einer Kante des durch k h+ k begrenzten Polytops. Zur Ermittlung aller extremalen Stabbing Lines reicht es also aus, die Geraden durch die Kanten dieses Polytops mit der entsprechenden Plücker-Quadrik zu schneiden (Abb. 6). Analog zum dreidimensionalen Raum ergeben sich hieraus null, ein, zwei oder unendlich viele Schnittpunkte, die den extremalen Stabbing Lines entsprechen (Abb. 7). Abb. 7. Zwei Schnittgeraden durch vier generische Linien im R 3 Die Berechnung einer durch vier Geraden festgelegten Gerade [4] erfolgt daher in zwei Schritten. Als erstes muss aus allen vier Geraden l k (bzw. ihre entsprechenden Hyperebe- 2 Einzahl: Vertex, ist ein Grundbaustein der polygonalen Modellierung: Zwei Vertices ergeben zusammen die Endpunkte einer Linie, drei Vertices definieren ein Dreieck, usw.

145 Cell to Cell Visibility in PVS Systemen 137 nen) eine Gerade l des fünfdimensionalen Raumes bestimmt werden. Diese Gerade l wird anschließend mit dem Plücker-Quadrik geschnitten, d.h. sie muss die Gleichung l l = 0 erfüllen. Der erste Schritt beruht auf der Singulärwertzerlegung von Matrizen [10, 11]. Diese wird auf eine Matrix M, bestehend aus den vier Hyperebenen Π k, angewendet, die zu vier Polygonkanten l k korrespondieren, um den Kern dieser Matrix zu bestimmen: Π 04 Π 05 Π 03 Π 00 Π 01 Π 02 M = Π 14 Π 15 Π 13 Π 10 Π 11 Π 12 Π 24 Π 25 Π 23 Π 20 Π 21 Π 22 Π 34 Π 35 Π 33 Π 30 Π 31 Π 32 Nach der Anwendung der Singulärwertzerlgung kann M als das Produkt dreier Matrizen als UΣV T geschrieben werden, wobei U eine orthogonale 4x4 Matrix, Σ eine diagonale 4x6 Matrix und V eine 6x6 Matrix ist: σ u 00 π 03 u M = UΣV T = σ π σ u 30 π σ u 50 π 55 Die Werte der Diagonalen von Σ ergeben sich dabei aus den Eigenwerten von M. Die Anzahl der von 0 verschiedenen Zeilen bestimmt dabei den Rang der Matrix. Jede dieser von 0 verschiedenen Zeilen korrespondiert mit einer Spalte in V und bilden in Kombination den Kern der Matrix M. Dieser enthält die Plücker-Koordinaten der Geraden, die die vier Geraden schneiden, aus denen M gebildet wurde. Sind alle Zeilen in Σ von 0 verschieden (d.h. linear unabhängig) dann hat M den Rang 4. Die letzten beiden Zeilen von V bilden dann den Kern von M. Benennt man diese beiden Zeilen mit F und G, dann lässt sich eine Abbildung Λ : P P 5 mit Λ(t) F + tg definieren. Aus der Kern-Eigenschaft geht nun hervor, dass Λ(t) Π k = 0 für 0 k 3 gilt. Da es sich bei Λ um eine injektive Funktion handelt, besteht ein Isomorphismus zwischen P und der Menge aller realen und imaginären Geraden, die durch je vier Polygonkanten spezifizierten sind. Die Menge der tatsächlich vorhandenen Schnittgeraden im R 3 korrespondiert daher mit den Nullstellen der quadratischen Gleichung Λ(t) Λ(t) = 0. Diese lässt sich durch Einsetzen der obigen Definition für Λ nach F F t 2 + 2F Gt + G G = 0 auflösen. Für die Diskriminante d dieser Gleichung ergibt sich (F G) 2 (F F ) (G G). Daraus folgt für d < 0, dass keine Schnittgerade im R 3 existiert. Für d = 0 gibt es genau eine Schnittgerade und für d > 0 zwei. Gilt hingegen (unabhängig von t) (F F ) 2 + (F G) 2 + (G G) 2 = 0, dann gibt es unendlich viele Lösungen für die Gleichung und somit genau so viele Schnittgeraden im R 3. Hat M den Rang 3 (die letzten drei Zeilen von V bilden den Kern von M), dann ergibt sich in diesem Fall Λ(u, v) : P 2 P 5 mit

146 138 André Gärtner Λ(u, v) = uf + vg + H. F, G und H entsprechen dann den letzten drei Zeilen der Matrix V. Auch die hierdurch bestimmten Geraden müssen wieder die quadratische Gleichung Λ Λ = 0 erfüllen. Das Ergebnis dieser Gleichung hängt jetzt jedoch von zwei Parametern ab. Ergeben sich als Lösung zwei Geraden, dann wird die Menge der Schnittgeraden durch zwei ein-parametrige Geradenscharen gebildet. Andernfalls kann die Funktion durch eine einzelne Variable t parametrisiert werden. Daraus ergibt sich dann für u(t) und v(t) die Menge der Schnittgeraden als L(u(t)F + v(t)g + H). Die Bestimmung der Schnittgeraden für Matrizen mit Rang 2 oder 1 erfolgt analog auf der Basis von drei bzw. vier Parametern. 4 Stabbing von 3D Portal-Sequenzen Im vorherigen Kapitel wurde gezeigt, wie man die Lage von Stabbing Lines innerhalb von Portalen berechnet. Nun wird ein Algorithmus vorgestellt, wie man mit Hilfe dieser Stabbing Lines Licht und Schatten berechnen kann. Versteht man die Stabbing Lines nicht als Sichtlinien sondern als Lichtstrahlen, so kann auf diese Weise berechnet werden, wie viel Licht auf ein Objekt fällt. Diese Methode wird sowohl für den 2D als auch für den 3D Fall vorgestellt und analysiert. 4.1 Penumbra und Antipenumbra Angenommen ein Flächenlicht strahlt in einer Szene mit mehrere Occludern 3. Diese Occluder erzeugen einen Schatten und verhindern so, dass Licht bestimmte Regionen in der Szene erreicht. Jeder Punkt in der Szene läßt sich somit im Bezug zur Lichtquelle charakterisieren. Abbildung 8 zeigt ein zweidimensionales Beispiel. Wenn ein Punkt nichts von der Lichtquelle sehen kann, sagt man, dass der Punkt im Umbra (Schatten) liegt. Kann ein Punkt hingegen etwas, aber nicht alles, von der Lichtquelle sehen, sagt man, dass dieser im Penumbra (Halbschatten) liegt. Wenn keins der beiden Situationen zutrifft, wird der Punkt von der ganzen Lichtquelle bestrahlt. Abb. 8. Umbra und Preumbra eines Occluder im 2D-Raum Stellt man sich vor, das die Occluder durch konvexe Portale bzw. transparente Ebenen ersetzt werden, kann man jeden Punkt komplementär charakterisieren. Als Antiumbra 3 Ein Objekt das den Durchfall von Licht teilweise oder komplett verhindert

147 Cell to Cell Visibility in PVS Systemen 139 definiert man den Lichtkegel (auch als Volume bezeichnet), von dem aus die Lichtquelle komplett einsehbar ist (Abb. 9). Für eine gegebene Lichtquelle und eine Menge von Portalen oder Occludern definiert sich Umbra als das räumliche Komplement der Vereinigung von Antiumbra und Antipenumbra. Ähnlich ist Antiumbra das Komplement der Vereinigung von Umbra und Penumbra. Abb. 9. Antiumbra und Antipenumbra durch eine Portal-Sequenz Man möchte nun die beleuchteten Bereiche einer Lichtquelle (im Folgenden immer das erste Portal der Sequenz) innerhalb einer erreichten Zelle durch eine Gerade, die die Sequenz durchdringt, charakterisieren. Die Charakterisierung für den Bereich einer Sequenz mit einem Portal ist trivial. In diesem Fall, ist das Antipenumbra die ganze Halbebene hinter dem Portal, die Nachbarzelle der Quellzelle ist. Durch die Konvexität der Zellen liefert es genau das Volumen der erreichten Zelle. Berechnungen des Antipenumbra für Portalsequenzen mit zwei oder mehr Portalen, beziehen Schnitte zwischen Vertices und Kanten von Portalen mit ein. Es wird im weiteren dieses Kapitels gezeigt, dass dies lineare und quadratische Primitive einschließt um das beleuchtete Volumen korrekt zu beschreiben. In Kapitel 3 wurden die Portale als orientiert dargestellt. In zwei Dimensionen bedeutet das, dass jedes Portal vom Sichtpunkt eines Portal traversierenden Lichtstrahls, ein linkes und rechtes Ende besitzt. Im R 3 bedeutet die Portal-Orientierung, dass das Portal- Polygon, gesehen als eine geordnete Sequenz von Punkten, vom Sichtpunkt eines Betrachters auf die Lichtquelle, im Uhrzeigersinn erscheint. 4.2 Oberflächen und Schneisen Es gibt drei Arten von extremalen Stabbing Lines: Vertex-Vertex Geraden (kurz: VV), Vertex-Edge-Edge Geraden (kurz: VEE) und vierfach Edge Geraden (kurz: 4E). Stellen wir uns vor, dass man eine extremale Stabbing Line (egal von welchem Typ) durch Lockerung von genau einer der vier Freiheitsgrade von der ursprünglichen Position weg schiebt (vgl. Abb. 10). Die Oberfläche, oder Schneise (engl. Swath), die durch die Verschiebung entsteht, ist planar oder gebogen wie eine Schar. Schneisen, wie VE oder EEE Geraden, werden Event Surfaces genannt. Abbildung 10-i zeigt eine extremale VV Stabbing Line, die an vier Kanten A, B, C und D gebunden ist. Durch Lockerung der Beschränkung an C erhält man eine VE Schneise (planar), die über A, B und D gespannt ist. Kommt die Schneise an ein Hindernis (in diesem Fall: Kante E), so terminiert diese als eine VV Gerade, die über A, B, D und E gespannt ist. Abbildung 10-ii zeigt eine extremale 4E Stabbing Line, die an die Kanten A, B, C und D

148 140 André Gärtner Abb. 10. Verschiebung einer Stabbing Line, die im 3D eine planare VE Schneise (i) oder eine quadratische EEE Fläche (ii) generiert gebunden ist. Die Lockerung der Beschränkung an A produziert eine EEE Schneise (Schar), die über B, C und D gespannt ist. In dem Beispiel trifft die Gerade auf die Ecke E und stop als VEE Gerade. Bedenken wir nun die gleiche Situation im 5D-Raum, gegeben durch eine Plücker Transformation (Abb. 11). Extremale Geraden bilden auf einzelne Punkte in Plücker Koordinaten ab und zwar die Schnittpunkte der Kanten bzw. die 1D-Flächen des Polytops k h+ k mit der Plücker-Quadrik. Da Schneisen zur ein-parametrischen Geradenfamilie gehören, korrespondieren diese zu Kurven in Plücker-Koordinaten. Diese Kurven sind die Spuren (engl. Traces) oder Schnittpunkte der 2D-Fläche des Polytops mit der Plücker-Quadrik und daher kegelförmig. Die 3D Schneisen, die zu den 5D kegelförmigen Spuren korrespondieren, nennt man auch extremale Schneisen. Alle Schneisen haben drei Generatorgeraden und somit drei Generatorkanten, die von Elementen der Portal Sequenzen entstehen. Abb. 11. Spuren (Schnittpunkte) von Extremalen auf dem Plücker-Raum 4.3 Grenz- und innenseitige Schneisen Eine 1D-Geradenfamilie kann extremal im 5D sein, solange sie komplett im Antipenumbra liegt (im 3D-Raum). Sobald extremale Stabbing Lines in dem Inneren des Antipenumbra

149 Cell to Cell Visibility in PVS Systemen 141 liegen, sind auch extremale Schneisen im Inneren. Eine extremale Schneise die auf der Grenze des Antipenumbra liegt wird als Grenzschneise (engl. Boundary Swath) definiert. Alle anderen extremalen Schneisen sind innenseitig (engl. internal). Untersuchungen der 2D- Flächen des Polytops k h+ k liefern alle extremalen Schneisen. Es ist dabei wichtig, diese Unterscheidung zwischen Grenzschneisen und innenseitigen Schneisen zu machen. Diese Unterscheidung kann nur lokal gemacht werden, durch Untersuchung der drei Generatorkanten und ihrer Generator-Polygone. Nur durch Berücksichtigung dieser konstanten Anzahl von geometrischer Begrenzungen wird im Folgenden gezeigt, wie man berechnen kann, ob eine Stabbing Line auf beiden Seiten existieren kann. Wenn das der Fall sein sollte, kann die Schneise nichts zu der Antipenumbra Grenze betragen und sie wird als innenseitig klassifiziert. 4.4 Zweidimensionales Beispiel Die Begriffe für Grenz- und innenseitige Schneisen lassen sich am einfachsten am zweidimensionalen Beispiel erklären (Abb. 12). Portale und die Lichtquelle sind Geradensegmente. Die über Kreuz verlaufenden Geraden, die die Portalsequenz durchdringen, enthalten eine extremale Schneise (im 2D ein Geradensegment), wo eine beschränkte Stabbing Line (z.b durch Portal Endpunkte) vorkommen kann. Die dargestellte Fläche hinter dem letzten Portal ist eine konvexe Fläche, die durch die zwei überkreuzenden Kanten und das Portal selbst aufgespannt wird. Diese Kanten sind solange Grenzschneisen im 2D, wie sie den Antipenumbra Bereich von dem unbeleuchteten Bereich voneinander trennen. Die restlichen Kanten sind gültige Stabbing Lines aber innenseitige Schneisen. Abb. 12. Schneisen eines 2D-Beispiels Um dies etwas genauer zu verstehen, stellt man sich eine nicht überkreuzende Kante E vor, die langsam von den begrenzenden Punkten p und q rund herum wegbewegt wird (Abb. 13). Die Grenzpunkte der Portale liegen dabei auf der selben Seite von E. In dem Beispiel wird nun die Gerade um den Punkt p gedreht, die nur ins innere des mittleren Portals wandern kann. Daraus ergibt sich, das die Kante E in dem unteren Bereich des letzten Portals wandert (gestrichelte Linie). Dreht man die Kante E um den Punkt q, so wandert die Kante in den oberen Bereich des letzten Portals (gepunktete Linie). Solange E gültige Stabbing Lines erlaubt (egal ob nach oben oder unten), kann diese keine beleuchteten von nicht-beleuchteten Region separieren. Die Schnittgerade gilt somit als innenseitige Schneise. Betrachten wir jetzt die Situation noch für eine überkreuzende Kante E (Abb. 14). Die Portal Endpunkte p und q liegen also auf der entgegengesetzten Seite von E. Dreht man

150 142 André Gärtner Abb. 13. innenseitige Schneise einer Portalsequenz die Gerade nun um diese Punkte, wandert diese nur in eine Richtung des jeweiligen Portals. Dies liefert nur Geraden auf einer Seite von E (die beinhaltende Seite des Antipenumbra). E wird in diesem Fall Grenzschneise bezeichnet. Abb. 14. Grenzschneise einer Portalsequenz 4.5 EEE Schneisen Im Dreidimensionalen, können innenseitige und Grenzschneisen folgendermaßen unterschieden werden. Angenommen, drei Generatorkanten A, B und C bilden eine Basis für eine EEE-Schneise. Über diese Geraden wird eine Gerade L an den Punkten a, b und c gespannt (Abb. 15-i). An diesen Punkten erheben sich drei Vektoren N a, N b und N c senkrecht zu L und den Generatorkanten. Wichtig ist dabei, dass die Richtung so gewählt wird, dass man ein positives Skalarprodukt mit einem ins Portal gerichteten Vektor erhält. Man sagt, dass drei koplanare Vektoren enthalten (engl. contained) sind, wenn ein anderer Vektor existiert, dessen Skalarprodukt mit allen drei Vektoren strikt positiv ist. Eine Schneise ist innenseitig, genau dann wenn dessen korrespondierende N i enthalten sein können. Angenommen die N i können wie in Abbildung 15 enthalten sein, dann hat ein Vektor ein positives Skalarprodukt mit den N i (zeigend in Richtung des grauen Bereichs wie in Abb. 15-ii), und man teilt die Konfiguration mit einer Ebene, die L und diesen Vektor beinhaltet. Die Spur (Schnitt) der Schneise auf dieser Ebene ist die Stabbing Line L, welche die Teilungsebene in zwei Bereiche L + und L partitioniert (Abb. 15-iii). L kann in winzigen Schritten bewegt werden, z.b. um Punkt a. Das Innere der zwei Portale erlaubt L nur in die Richtung L + zu drehen (gepunktete Stabbing Lines). Analog entstehen die Stabbing Lines

151 Cell to Cell Visibility in PVS Systemen 143 Abb. 15. Eine innenseitige EEE-Schneise (i), herunter geschaut an L (ii) und in Richtung L traversiert (iii) (gestrichelt) im L wenn man um Punkt c dreht. Auf Grund der Tatsache, dass Stabbing Lines in beide Richtungen gehen, kann es keine Grenzschneise sein. Abb. 16. Eine Grenz-EEE-Schneise (i), herunter geschaut an L (ii) und in Richtung L traversiert (iii) Im Vergleich, kann N i in Abbildung 16 nicht enthalten sein. Jeder Vektor hat mit den anderen Vektoren ein negatives Skalarprodukt. Angenommen es gibt ein negatives Skalarprodukt mit N c und man teilt die Konfiguration mit einer Ebene, die L und einen solchen Vektor beinhaltet (Abb. 16-iii). Eine Drehung um den Punkt b generiert Stabbing Lines im L (gepunktet) und so auch eine Drehung um Punkt c. Diese Konfiguration liefert also keine Stabbing Lines im L +. Solange dies für irgendeine Teilungsebene für L zutrifft, ist die Schneise eine Grenzschneise. 4.6 VE Schneisen Angenommen die Schneise ist von Type VE. Dies ist ein Spezialfall einer EEE Konstruktion, in der zwei der drei Kanten involviert sind. Es ist nötig diesen Fall gesondert zu betrachten, da es das einfache Verhalten der Containment-Funktion erklärt (dazu mehr im nächsten Unterkapitel). In Abbildung 17 sind die Generatorkanten A und B gegeben, die die VE Schneise am Vertex v definieren, sowie eine Kante C, die zwei Generator-Polygone P und Q, eine Ebene

152 144 André Gärtner durch C und die Gerade S. Orientiere S so, dass Q über dieser Geraden liegt (S + ). Solange Q konvex ist, ist dieses immer möglich. S teilt den Raum hinter der Ebene von Q in zwei Regionen S + und S. Wenn Stabbing Lines in einer dieser Regionen existieren können, ist die Schneise eine Grenzschneise. Dies ist möglich, genau dann wenn S eine Teilungsebene von P und Q ist bzw. sich Polygon P komplett unter S befindet. Abb. 17. Grenz- (i) und innenseitige (ii) VE-Schneise Angenommen S teilt Polygon P und Q voneinander und man wählt eine Schnittgerade der Schneise, die so wegbewegt wird, dass diese sich vom Schneisen-Vertex v löst, aber noch bei Kante C verbleibt. Der bewegende Linienschnitt mit P kann dann nur unter S liegen (Abb. 17-i). Folglich müssen alle Stabbing Lines den Bereich S + unter der Ebene von Q schneiden. Ähnliches Verhalten ergibt sich, wenn man die Stabbing Line von C ins Innere von Q wegbewegt und weiter an v gebunden bleibt. Die Schneise liefert nur Stabbing Lines im S + und ist somit eine Grenzschneise. Zum Vergleich sei angenommen, das die Ebene S P und Q nicht teilt, so dass die Kanten A und B im S + liegen (Abb. 17-ii). Wieder bewegt man eine Schneise so dass sie vom Vertex v losgelöst kommt, aber bei Kante C bleibt. Wenn die Gerade (gestrichelt) nach A über Ebene S wandert, wird diese sich mit der Region S hinter der Ebene von Q schneiden. Sollte Kante B unter S liegen, würde die Bewegung nach B Stabbing Lines (gepunktet) im S + produzieren. Wenn A und B unter S liegen, liegen die Geraden bei v und schneiden das Innere von Q. Die Schneise liefert Stabbing Lines, die in S und S + liegen und kann somit keine Grenzschneise sein. Sei darauf hingewiesen, dass die drei-vektor Konstruktion für EEE Schneisen auch für diese degenerierte Einstellung einsetzbar ist. 4.7 Containment Funktion Die Containment-Funktion ist ein Kriterium um zwischen Grenz- und innenseitigen Schneisen zu unterscheiden. Dies trifft nur auf eine einzelne Stabbing Line zu, nicht aber auf eine ganze Schneise. Praktischer Weise liefert die Auswertung der Containment-Funktion auf einen Teil der Schneise aber Resultate. Grund dafür ist, dass die Konfiguration der Normalen, die von den Portalkanten ausgehen, erhalten bleiben. Um zu zeigen wieso das so ist, stellt man sich eine Konfiguration von drei koplanaren Vektoren N a, N b und N c vor. Angenommen, die Konfiguration ändert ständig von beinhaltend zu nicht beinhaltend (z.b.

153 Cell to Cell Visibility in PVS Systemen 145 durch Drehung des Vektors N c ) wie in Abbildung 18. An dem Moment wo N c die Grenze (gepunktete Linien) überschreitet, muss N c und einer von N a oder N b antiparallel sein. Abb. 18. Containment und Non-Containment, mit bewegendem N c für feste N a und N b Damit dies in der EEE-Schneisen-Konstruktion passiert, müssen zwei oder drei Generatorkanten koplanar sein. Ähnlich bei einer VE-Schneisen-Konstruktion, muss ein Kantenpaar koplanar sein. Die Generatorkanten sind aber fest, nur die Verschiebungsgeraden variieren. Folglich wird nur durch Verschiebung einer extremalen Geraden entlang einer Schneise eine sich ständig ändernde Vektorkonfiguration generiert. Der Containment des Vektors ist eine konstante Funktion. 5 Berechnung des Antipenumbra Der benötigte rechnerische Mechanismus für die Berechnung des Antipenumbra ist nun vollständig. Folgende Annahmen werden getroffen: Eingabe ist eine Liste von m orientierten Polygonen P 1...P m (gegeben als Liste von n Kanten). Das erste Polygon P 1 ist die Lichtquelle, die restlichen sind Löcher (Portale). Die Polygone sind disjunkt und so geordnet, dass der negative Halbraum definiert durch die Ebene von P i alle Polygone P j, i < j m beinhaltet. Der Algorithmus wandelt jede gerichtete Kante in eine Hyperebene in Plücker-Koordinaten um und ermittelt dann die gemeinsamen Schnitte der sich ergebenden Halbräume, ein konvexes 5D Polytop. Wenn kein Schnitt vorliegt, oder das Polytop keinen Schnitt mit der Plücker-Fläche hat, gibt es kein Antipenumbra. Gibt es Schnitte, wird die Polytop-Struktur nach Spuren von Grenzschneisen (Schnitt von 1D-Flächen (Kanten) und 2D-Flächen (Dreiecke) mit der Plücker-Quadrik) abgesucht (Abb. 11). Diese Spuren sind mit einer Schleife verknüpft, welche mit Komponenten der Antipenumbra-Grenze korrespondieren. Es kann mehrere Schleifen geben, da der Schnitt der Polytop-Grenze mit der Plücker-Quadrik mehrere Komponenten haben kann. Jede Schleife besteht aus wechselnden Polytop-Kanten und -Dreiecken mit der Plücker- Quadrik (vgl. Abb. 19). Jede Kante, die sich mit der Plücker-Fläche schneidet ist ein Dual einer extremalen Stabbing Line im R 3. Der Schnitt zwischen Dreieck und der Plücker- Quadrik ist ein Dual einer extremalen Schneise. Die Vorkommnis von Kanten und Dreiecken auf dem Polytop impliziert so die Adjazenz von korrespondierenden Linien und Schneisen im 3D. Das Übergehen einer Kante von einem Dreieck zum nächsten auf einem Polytop ist äquivalent zum Übergehen von extremalen Stabbing Lines zwischen zwei extremalen

154 146 André Gärtner Abb. 19. Schleife über Polytope-Kanten und -Dreiecke Schneisen im 3D. Folglich kann der Algorithmus von 2D-Fläche zu 2D-Fläche der Polytop- Fläche gehen, nur durch Überquerung der 1D-Flächen Vorkommnisse. Jeder vorgefundene Kegel im 5D impliziert drei Generatorkanten im 3D, die in konstanter Zeit auf Containment untersucht werden (man beachte, das die Containment-Achse, Gerade L in Abb. 16, als Dual irgendeiner Überschneidung der Dreieckskanten mit der Plücker-Quadrik genommen werden kann). Kegel, deren Dual-Kanten enthalten sind, sind Duale von innenseitigen Schneisen (andernfalls sind sie Duale von Grenzschneisen). Sobald die Oberflächenstruktur des Polytops traversiert ist und die Grenzschneisen ermittelt sind, werden diese ausgegeben. Wenn eine Schleife durchlaufen ist, wird die Suche an einer noch ungeprüften Kante fortgesetzt. Jede geschlossene Schleife im 5D dieser Methode, ist das Dual der Grenze einer verbundenen Komponente des Antipenumbra im 3D. Algorithmus 18 Eingabe der gerichteten Kanten E k der Polygone P 1...P m gerichtete Kanten in gerichtete Geraden e k konvertieren e k in Plücker Halbräume h k = Π(e k ) transformieren 5D Polytop k h+ k berechnen 2D-Flächen Schnitte von k h+ k mit der Plücker Oberfläche ermitteln Extremale Schneisen als Grenz- oder innenseitige Schneisen klassifizieren für alle durch DFS gefundene Komponenten des Antipenumbra traversiere Grenz-2D-Flächen von k h+ k bilde jede gefundene Spur auf eine 3D Grenzschneise ab Ausgabe der Schneisen als quadratische Oberfläche 5.1 Algorithmus am Beispiel Um die Komplexität des Algorithmus zu verdeutlichen, wurde dieser von Teller in der Programmiersprache C und FORTRAN-77 auf einer 20-MIP Silicon Superworkstation implementiert. Um die konvexe Hülle von n Hyperebenen im 5D zu berechnen, wurden Algorithmen verwendet, die von Allan Wilks, Allen McIntosh und Michael Hohmeyer geprägt worden sind [2]. Abbildung 20 zeigt eine Menge von Polygonen mit n = 15, wobei das erste Polygon die Lichtquelle darstellt. Die Antipenumbra Berechnung braucht bei zwei CPUs nur wenige Sekunden. Das Polytop k h+ k, entstanden aus 15 Halbräumen im 5D, hat 80 Fassetten, 186 2D-Flächen (Dreiecke) und 200 1D-Flächen (Kanten). Von den 186 Dreiecken werden 78

155 Cell to Cell Visibility in PVS Systemen 147 Abb. 20. Ein Lichtquelle mit drei Portalen (i) und den sich daraus ergebenden VE- (rot), EEE-Schneisen (grün) (ii) Dual-Spuren auf der Plücker-Quadrik induziert und somit auch 78 extremale Schneisen generiert. Von den 78 Schneisen sind 62 innenseitig und 16 grenzend (Abb. 20-ii). Von den 16 Grenzschneisen sind 10 VE- (rot) und 6 EEE-Schneisen (grün). Von den 200 Kanten schneiden 39 den Plücker-Quadrik und liefern die extremalen VV, VEE und 4E Stabbing Lines (Abb. 21). Man beachte, dass die extremalen Stabbing Lines die Form der Antipenumbra- Grenze gestalten. Abb Extremale Stabbing Lines (i) prägen die Antipenumbra-Grenze (ii) 6 Fazit Teller hat gezeigt, dass sich der Schatten - entstehend durch ein Lichtquelle - durch eine Portalsequenz mit n Kanten mit einem erwarteten Aufwand von O(n 2 ) berechnen läßt. Beschrieben wurde das Antipenumbra als ein Volumen begrenzt durch die Regionen von quadratischen und planaren Flächen und gezeigt, dass jede Schneise oder Anteil der Antipenumbra- Grenze im 3D durch einen Schnitt einer fünfdimensionalen konvexen Hülle mit einer vierdimensionalen Fläche, der Plücker-Quadrik, entsteht. Dieser Algorithmus ist an die Berechnung von Aspekt Graphen angelehnt, die Bereiche mit qualitativ unterschiedlichen Sichten einer Lichtquelle in einer Szene trennen. Es wurde eine Implementierung einer Antipenumbra-Berechnung über mehrere Polygonsequenzen demonstriert. Wie Teller beschreibt, wurde der Algorithmus durch ein Sichtbarkeitsprojekt, der statisches und Volumen-basierendes Culling im Dreidimensionalen umfasste, angeregt. Der Aufwand zur Bestimmung des Antipenumbra und somit auch der Stabbing

156 148 André Gärtner Lines lohnt sich insbesondere dann, wenn eine Szene einen Vielzahl verdeckter Objekte aufweist, wie es z.b. auf das Innere von Gebäuden, dicht bebaute Innenstädte oder ähnliches zutrifft. Werden so bereits im Vorhinein für jede Zelle die von dieser aus potentiell sichtbaren Zellen bestimmt, verringert sich der Aufwand für das Culling und Rendering erheblich, da viele Objekte aus nicht sichtbaren Zellen nicht mehr betrachtet werden müssen. Damit die Berechnung des Antipenumbra und Stabbing Lines überhaupt möglich wurde, wurde ein Verfahren gezeigt, mit dem sich der Schnitt von Kanten eines fünfdimensionalen Polytops mit einer vierdimensionalen Hyperebene berechnen läßt. Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten, die die Darstellung von Geraden des R 3 als Punkte oder Hyperebenen des fünfdimensionalen projektiven Raumes ermöglichen. Literaturverzeichnis 1. Seth Teller und Pat Hanrahan, 1993, Global visibility algorithms for illumination computations, International Conference on Computer Graphics and Interactive Techniques, Seiten: Seth J. Teller, 1992, Computing the antipenumbra of an area light source, ACM SIGGRAPH Computer Graphics, Volume 26 - Issue 2, Seiten: Seth J. Teller und Michael E. Hohmeyer, 1992, Stabbing Oriented Convex Polygons in Randomized O(n 2 ) Time, Technischer Bericht, Computer Science Department, U.C. Berkeley. 4. Seth J. Teller und Michael E. Hohmeyer, 1992, Computing the lines piercing four lines, Technischer Bericht, Computer Science Department, U.C. Berkeley. 5. Seth J. Teller und Carlo H. Séquin, 1991, Visibility preprocessing for interactive walkthroughs, ACM SIGGRAPH Computer Graphics, Volume 25 - Issue 4, Seiten: Seth J. Teller, 1992, Visibility Computations in Densely Occluded Polyhedral Environments, Dissertation, Computer Science Department, U.C. Berkeley, Seiten: Jorge Stolfi, 1989, Primitives for computational geometry, Technischer Bericht 36, DEC SRC, Seiten: Branko Grünbaum, 1967, Convex Polytopes, Wiley-Interscience, New York. 9. Kenneth L. Clarkson und Peter W. Shor, 1989, Applications of random sampling in computational geometry II, Discrete Computational Geometry, Seiten: Wikipedia, Begriff: Singulärwertzerlegung, Stand: Jan. 2008, Gene H. Golub und Charles F. Van Loan, 1989, Matrix Computations, John Hopokins University Press.

157 Hohe Verfügbarkeit in skalierbaren verteilten Hashingdateien mit Mirroring Marco Müller Universität Paderborn Zusammenfassung. Heutzutage findet die Datenhaltung in Softwareprojekten nicht mehr nur auf einem Computer statt, sondern ist oftmals in einem Netz aus mehreren Computern verteilt und besteht aus einer großen Anzahl von Daten. Allerdings ist es dann nicht gewährleistet, dass alle Computer des Netzes auch immer verfügbar sind. Mirroring ist ein bekanntes Konzept, um diesem Problem zu begegnen. In dieser Arbeit soll dieses Konzept in das LH*-Schema, ein Hashingverfahren für skalierbare, verteilte Dateien, integriert werden. Dabei sollen Ausfälle von einem oder mehreren Computern so abgefangen werden, dass die Daten trotzdem verfügbar bleiben, ohne dabei die sonstigen Eigenschaften zu verlieren. Die hier vorgestellten Schemata erreichen immer noch sowohl eine ähnliche Zugriffszeit, als auch eine ähnliche Skalierbarkeit wie das LH*-Schema. Der Preis dafür sind ein höherer Speicherbedarf und ein erhöhter Bedarf an Nachrichten zur Kommunikation. Die verschiedenen Schemata haben unterschiedliche Eigenschaften, die sich aus den Anforderungen ergeben. Dies schlägt sich vor allem in den Kosten für die Wiederherstellung nach einem Ausfall nieder. 1 Einleitung Lineares Hashing Das LH*-Schema Clients Server Weitere Eigenschaften des LH*-Schemas Das LH*-Schema mit Mirroring Allgemeine Eigenschaften von LH* mit Mirroring Besonderheiten des SA-Mirrors Besonderheiten des SD-Mirrors Fazit Literaturverzeichnis Einleitung Hashing als eine Möglichkeit, große Datenmengen zu speichern, wird heutzutage in vielen Bereichen der Informatik eingesetzt. Durch die schnellen Zugriffszeiten und den geringen Speicherbedarf, den Hashingverfahren im Gegensatz zu Algorithmen, die Baumstrukturen

158 150 Marco Müller verwenden, besitzen, sind solche Verfahren sehr attraktiv für z.b. die Indexierung von Tabellen in einer Datenbank. Allerdings muss beim statischen Hashing im Vorfeld klar sein, wie groß der Wertebereich zu wählen ist, da es sonst zu vielen Kollisionen kommt und die Zugriffszeit zu sehr erhöht wird. Um diesem Problem entgegenzutreten, wurden dynamische Hashingverfahren entwickelt, die den Wertebereich dynamisch erweitern. Das bekannteste unter ihnen ist das Lineare Hashing [Lit80]. Diese Verfahren operieren auf dem Arbeitsspeicher eines Rechners und lagern, wenn nötig, Teile des Bildbereichs auf Festplatten oder ähnliche Medien aus. Allerdings sind heutzutage die Zugriffszeiten auf eine Festplatte höher als auf den Arbeitsspeicher eines anderen Computers. Demnach ergeben sich Vorteile bezüglich der Zugriffszeit, wenn man Hashingverfahren auf verteilte Systeme oder auf Computercluster ausweitet. Ein Verfahren, dass sich dieser Problemstellung widmet, ist das LH*-Schema [Lit93]. Dieses wird in dieser Arbeit näher beleuchtet. Allerdings gilt es bei der Realisierung von z.b. Software für Banken noch eine Komponente zu beachten: die Verfügbarkeit. In einem verteilten System kann es zu Ausfällen einzelner Knoten kommen, sei es durch Stromausfälle, temporäre Ausfälle von Teilen des Arbeitsspeichers, Wartungsarbeiten oder ähnliches. Das kann dazu führen, dass ein Computer nicht verfügbar ist, auf dem gerade ein Hashwert gespeichert werden soll, bzw. sich ein Hashwert befindet, nach dem gesucht wird. Solche Ausfälle müssen abgefangen werden. In dieser Arbeit soll dazu das Mirroring als zusätzliche Funktion des LH*-Schemas vorgestellt werden. Im folgenden Abschnitt werden die Grundprinzipien des Linearen Hashing, auf dem das LH*-Schema aufbaut, vorgestellt. Die Kapitel 2 und 3 beschäftigen sich dann mit dem LH*- Schema und wie man Mirroring in dieses integrieren kann, ohne seine sonstigen Vorzüge zu verlieren. Abschließend wird ein Fazit gezogen. 1.1 Lineares Hashing Das Lineare Hashing ist die am häufigsten genutzte Möglichkeit des dynamischen Hashings. Es verwendet dabei das verzeichnislose Schema des dynamischen Hashings und erweitert die Hashtabelle in jedem Schritt um lediglich einen Slot. Die zugrunde liegende Datenstruktur bilden sogenannte Tries, eine spezielle Art von Bäumen, bei denen ein Durchlauf dadurch charakterisiert ist, dass an den Kanten jeweils ein Zeichen des Alphabets hinzugenommen wird. Ein Knoten ist durch den Pfad zu ihm kodiert. Eine genauere Beschreibung von Tries findet sich in [Enb88]. Um Lineares Hashing effizient durchführen zu können, müssen bestimmte Anforderungen an die verwendete Hashfunktion gestellt werden. Der Wertebereich der Schlüssel muss dynamisch veränderbar sein. Die am häufigsten genutzte Methode, dies zu erreichen, ist eine binäre Kodierung des Schlüssels. Durch Hinzunahme eines Bits wird der Schlüssel erweitert und der Bildbereich vergrößert. Das Reduzieren des Bildbereich geschieht analog. So wird beispielsweise ein Slot, der zunächst durch den Schlüssel 00 adressiert wird, nach einer Erweiterung des Schlüssels mit dem Schlüssel 000 adressiert. Soll der Bildbereich reduziert werden, so wird ein Bit, analog dem Vergrößern des Bildbereichs, entfernt. Um zu gewährleisten, dass die schon vorhandenen Schlüssel/Werte-Paare weiterhin benutzt werden können und keine neue Berechnung durchgeführt werden muss, werden mehrere Hashfunktionen h i benutzt, die jeweils den Adressraum {0, 1,..., 2 i 1} abdecken, wobei i eine beliebige natürliche Zahl ist. Bei der Gestaltung der Hashfunktionen ist zu beachten, dass

159 Skalierbare verteilte Hashingverfahren mit Mirroring 151 für jeden Hashwert h i (k) immer eine der folgenden Gleichungen gilt: h i (k) = h i 1 (k) h i (k) = h i 1 (k) + 2 i 1 Da alle Schlüssel von der Form h i (k) = b i 1...b 1 b 0 sind, mit b {0, 1}, kann der Adressraum der Schlüssel erweitert werden, ohne dass die bisherigen Werte neu berechnet werden müssen. In der Handhabung gibt es einige Unterschiede zwischen dem verzeichnisorientierten und dem verzeichnislosen Verfahren, auf die ich nicht näher eingehen möchte (vgl. dazu [Enb88]). Für das Lineare Hashing ist nur das verzeichnislose Verfahren relevant. Dazu wird eine Variable, im Folgenden p genannt, eingeführt, die als sogenannter Split-Pointer fungiert. Kommt es zu einem Überlauf, so wird der Slot gesplittet, auf den p gerade zeigt. Dabei ist zu beachten, dass dies nicht notwendigerweise der Slot sein muss, der den Überlauf ausgelöst hat. Auch wird lediglich ein Slot zum Bildbereich hinzugefügt, es findet keine Verdopplung des Bildbereichs statt, wie man es beim Hinzufügen eines Bits erwarten würde. Dadurch wird gewährleistet, dass durch schlechte Wahl der Schlüssel der Bildbereich nicht unnötig groß wird, was bei einem Hinzufügen des zusätzlichen Bits zu allen Slots der Fall wäre. Als Ergebnis wird im Schnitt eine Auslastung von 60% erreicht(vergleiche dazu [Lit80]). Abbildung 1 auf Seite 153 soll die Expansion verdeutlichen. Sei s die Anzahl Slots beim Start der i-ten Expansion. Es gilt: s = 2 i und die momentan genutzte Hashfunktion sei h i (k). w, x, y und z bezeichnen hier sogenannte Überlaufslots, die genutzt werden, wenn ein Slot überläuft, der nicht im nächsten Schritt gesplittet wird. Im Beispiel gibt es vier Slots, demnach sind s = 4, i = 2 und die verwendete Hashfunktion ist h 2 (k). Der Split-Pointer p zeigt auf den Slot 0, da wir uns am Beginn der zweiten Expansionsphase befinden (Beispiel in Abbildung 1, Position (a) ). Nehmen wir nun an, Slot b läuft über. Es wird nach dem letzten Slot (in diesem Fall nach d) ein neuer Slot eingefügt und der Slot, auf den p zeigt, in diesem Fall Slot a, wird auf a und A aufgeteilt. Dann wird p inkrementiert. Um den Überlauf von b abzufangen, wird ein Überlaufslot eingeführt, in diesem Beispiel w, der die Werte, die über die Kapazität des Slots hinausgehen, speichert. Nun ergibt sich das Bild, das Position (b) im Beispiel zeigt. Um zu unterscheiden, ob ein Wert in Slot a oder in Slot A gespeichert werden soll, wird ein zusätzliches Bit benötigt. Nun wird also h i+1 (k) zur Adressierung für diese beiden Slots verwendet. Für alle übrigen Slots wird weiterhin h i (k) verwendet. Im Allgemeinen gilt für die Adressierung der Slots folgender Algorithmus: begin i f h i (k) p then s l o t := h i (k) e l s e s l o t := h i+1 (k) ; i f necessary, chase the o v e r f l o w chain end Listing 1. Adressierung der Slots [Enb88]

160 152 Marco Müller Alle Slots links vom Split-Pointer p werden also mit h i+1 (k) adressiert, alle rechts von p bis zur Grenze s 1 (der letzte Slot, der noch mit i Bits adressierbar ist) werden weiterhin mit h i (k) adressiert. Nun läuft der Slot d über und Slot b, inklusive seines Überlaufslots w, wird aufgeteilt auf b und B. Die Werte, die zum Überlauf von Slot d geführt haben, werden im Überlaufslot x gespeichert. Man erkennt, dass es einen Zusammenhang zwischen dem Slot, auf den p zeigt (derjenige, der gesplittet wird), und dem neuen Slot gibt. Der neue Slot lässt sich immer durch s + p adressieren. Im nächsten Schritt läuft erneut d (bzw. der Überlaufslot x) über, was dazu führt, dass c gesplittet wird und ein zweiter Überlaufslot, hier y, eingeführt werden muss (siehe Position (d) im Beispiel). Im letzten Schritt für diese Expansionsstufe soll Slot B überlaufen. Nun wird d mit seinen beiden Überlaufslots gesplittet. Da nun nach dem Inkrementieren von p gilt: p = s wird p wieder auf 0 gesetzt, was signalisiert, dass dieser Expansionsschritt beendet ist. Für alle Slots wird nun h i+1 (k) zur Adressierung verwendet. Nun wird i inkrementiert, s = 2 i neu berechnet und die Grenze für den nächsten Expansionsschritt (s 1) wird ebenfalls neu berechnet. Dies führt zur Position (e) im Beispiel. p ist wieder bei 0, i hat den Wert 3 und s den Wert 8. Zur Adressierung wird ausschließlich h 3 (k) verwendet. Es besteht die Möglichkeit, durch Wahl von anderen Strategien, was das Splitten der Slots angeht, eine Verbesserung herbeizuführen. Dazu kann man sich überlegen wann ein Slot gesplittet und ein neuer Slot eingeführt wird, aber auch wie ein Slot gesplittet wird. Dies soll hier nicht weiter erläutert werden, nachzulesen sind diese Möglichkeiten in [Enb88]. 2 Das LH*-Schema LH* stellt eine Erweiterung des Linearen Hashing dar. Im Gegensatz zum Linearen Hashing, welches auf einem Prozessor läuft, ist eine LH*-Datei auf mehreren Computern verteilt. Dabei existiert keine zentrale Instanz, die alles koordiniert. Man unterscheidet zwischen Clients, die Schlüssel suchen, bzw. einfügen und Servern, die die Schlüssel und die dazugehörigen Werte speichern. Zur Kommunikation der Clients mit den Servern werden Nachrichten ausgetauscht. Auf die Besonderheiten der einzelnen Komponenten wird später näher eingegangen. Um solch ein Netzwerk umsetzen zu können, werden bestimmte Anforderungen an die zugrundeliegende Datenstruktur gestellt [Lit93]: 1. Eine Datei wird nur schrittweise erweitert und auch nur, wenn alle Server, die sich gerade in Benutzung befinden, zu einem gewissen Grad ausgelastet sind. 2. Es existiert keine zentrale Steuerungseinheit, die zunächst benachrichtigt werden muss. 3. Keine Operation (Suchen, Einfügen, Splitten usw.) benötigt atomare Ausführungen unter verschiedenen Clients. Datenstrukturen, die diese Anforderungen erfüllen, werden auch SDDS 1 [Lit93] genannt. Anforderung 1 ist intuitiv klar und galt schon beim Linearen Hashing. Anforderung 2 ist essentiell, um mit weniger Nachrichten auszukommen und für die Größe der LH*-Datei nicht durch die Größe der zentralen Instanz beschränkt zu sein. Anforderung 3 ist unverzichtbar, da nicht garantiert werden kann, dass zu jedem Zeitpunkt alle Clients verfügbar sind. Um solch eine SDDS effizient nutzen zu können, müssen möglichst wenige Nachrichten zum Einfügen, bzw. Suchen eines Schlüssels gebraucht werden und die Auslastung sollte möglichst 1 Scalable Distributed Data Structure

161 Skalierbare verteilte Hashingverfahren mit Mirroring 153 Abb. 1. Beispiel für Lineares Hashing

162 154 Marco Müller hoch sein. Beides ist beim LH*-Schema gegeben, wie später gezeigt wird. Eine LH*-Datei wird auf mehreren Servern gespeichert. Dabei wird auf jedem Server genau ein Slot gespeichert, und zwar in dessen Arbeitsspeicher. Eine LH*-Datei expandiert genau so wie eine Datei beim Linearen Hashing. Da es genauso viele Server wie Slots gibt, ist dies ohne weiteres möglich. Genau wie beim Linearen Hashing hat jeder Slot ein Expansionslevel i und es gibt einen Split-Pointer p, der auf einen Slot zeigt. In den folgenden Abschnitten 2.1 und 2.2 wird näher auf die beiden Komponenten des LH*-Schemas, die Clients und die Server eingegangen. 2.1 Clients Clients manipulieren eine LH*-Datei, indem sie mit einem Server über Nachrichten kommunizieren. Sie fügen Schlüssel ein oder suchen nach Schlüsseln. Da es viele Clients gibt, die von der Existenz anderer Clients nichts wissen und unabhängig voneinander die LH*-Datei verändern können, verändert ein Client die Datei, ohne dass andere Clients davon erfahren. Man könnte eine zentrale Instanz einführen, die die beiden Werte, das Expansionslevel i und den Split-Pointer p, verwaltet und alle Clients informiert, oder jeder Client benutzt eine eigene Kopie. Letzteres führt dazu, dass die Clients unterschiedliche Werte für ihre Kopien haben. Diese sind im Regelfall nicht die Werte der Datei. Beides ist nicht optimal, aber im weiteren Verlauf wird die zweite Variante verwendet. Im nächsten Abschnitt soll näher auf die Adressberechnung des Clients eingegangen werden. Im darauffolgenden Abschnitt wird das Verfahren zum Anpassen der Werte eines Clients an die der LH*-Datei näher erläutert. Adressierung Da die Clients alle unterschiedliche Werte von i und p haben können, besitzen alle eine Kopie der beiden Werte, im Folgenden als i und p bezeichnet. Mit diesen Kopien berechnet jeder Client den Hashwert für den Schlüssel mit demselben Algorithmus wie beim Linearen Hashing (siehe Listing 1 auf Seite 151). Da die Kopien des Clients aber typischerweise nicht den tatsächlichen Werten entsprechen, kann es sein, dass die Berechnung des Hashwertes falsch war. In diesem Fall würde dieser Fehler durch die Server entdeckt werden (genaueres dazu findet sich in Kapitel 2.2) und eine IAM 2 wird an den Client geschickt. Im folgenden Abschnitt wird darauf näher eingegangen. Ist der berechnete Wert korrekt, bleibt diese Nachricht aus, auch wenn i und p nicht i und p entsprechen. Anpassung der eigenen Kopie Wenn ein Client eine falsche Kopie der Werte hat und somit einen falschen Server anspricht, so wird eine Nachricht von diesem Server an den Client geschickt, die sogenannte IAM. Durch diese Nachricht werden die Kopien i und p neu gesetzt und nähern sich den tatsächlichen i und p an (Die übermittelten Werte müssen nicht den tatsächlichen entsprechen, da der Server, der zuerst vom Client angesprochen wird, seine Werte übermittelt, nicht derjenige, wo der Hashwert tatsächlich gespeichert ist). Dies sorgt dafür, dass Nachrichten nur übermittelt werden, wenn es zwingend notwendig ist, denn auch wenn die Kopien falsch 2 Image Adjustment Message

163 Skalierbare verteilte Hashingverfahren mit Mirroring 155 sind, aber trotzdem die richtige Adresse berechnet wird, wird keine Nachricht gesendet. Das Result sind weniger Fehler bei der Adressierung, denn mit jedem Fehler, den ein Client macht, werden seine Kopien erneuert und den tatsächlichen Werten angenähert, sofern ein Client aktiv genug ist. Ein Client, der kaum Schlüssel sucht, bzw. Schlüssel einfügen möchte, verpasst natürlich viele Änderungen an der Datei und wird demnach mehr Fehler bei der Adressierung haben, als ein Client, der häufiger aktiv ist. Listing 2 zeigt den Algorithmus zum Anpassen der Kopien eines Clients. Dabei sind i das Expansionslevel der LH*-Datei, i die Kopie des Clients, p der Split-Pointer des Clients und a die Adresse des Servers bzw. des Slots. Die beiden Schritte decken die beiden möglichen Fälle ab: einmal, dass der adressierte Slot schon gesplittet wurde (Schritt 1), und dass der adressierte Slot noch nicht gesplittet wurde (Schritt 2). In jedem der beiden Fälle entspricht das Expansionslevel i nun dem der Datei. Lediglich der Split-Pointer kann von dem der Datei abweichen. 1 : i f i > i then i i 1, p a + 1 ; 2 : i f p 2 i then p 0, i i + 1 ; Listing 2. Adjustment Algorithmus [Lit93] 2.2 Server Server speichern Schlüssel mit den dazu korrespondierenden Werten. Dabei ist auf jedem Server genau ein Slot gespeichert. Server bekommen von Clients Nachrichten mit den einzufügenden Schlüsseln, bzw. Schlüsseln, nach denen gesucht wird. Wie im vorigen Abschnitt erläutert, kann es vorkommen, dass ein Server eine Nachricht erhält, die eigentlich nicht für ihn bestimmt ist. Deshalb überprüft jeder Server, ob er der richtige Empfänger der Nachricht ist und leitet die Nachricht an einen anderen Server weiter, falls er nicht der richtige Empfänger ist. Der genaue Ablauf dieses Prozesses wird im nächsten Abschnitt näher erläutert. Adressierung Jeder Server berechnet nach Erhalt einer Nachricht vom Client die Adresse neu, um zu überprüfen ob er der richtige Empfänger ist. Wenn nicht, berechnet er die Zieladresse neu und leitet die Nachricht an die neue Adresse weiter. Dann schickt er eine IAM an den Client, der die Anfrage gestellt hatte. Diese IAM enthält den aktuellen Wert des Servers für das Expansionslevel. Die Weiterleitung der Nachricht an einen weiteren Server findet höchstens zweimal statt, wie später noch gezeigt wird. Da ein Server den Wert des Split-Pointers p nicht kennt, kann er nicht den Algorithmus verwenden, den der Client benutzt (Listing 1 auf Seite 151). Er verwendet folgenden Algorithmus: a h i (C) ; i f a a then a hi 1(C) i f a > a and a < a then a a ; Listing 3. Adressberechnung des Servers [Lit93]

164 156 Marco Müller Dabei ist i das Expansionslevel des Servers und a die neu berechnete Adresse für den Schlüssel C, sowie a die vom Client berechnete und übermittelte Adresse. Sollte bei der Berechnung herauskommen, dass a = a gilt, so ist der Server der richtige Empfänger und führt die Anfrage vom Client aus. Ansonsten wird die Nachricht an den Server mit der Adresse a weitergeleitet. Dieser führt wiederum den Algorithmus aus und sendet die Nachricht gegebenenfalls weiter. Spätestens dann wird, wie oben erwähnt, der richtige Server gefunden. Dies verdeutlicht folgender Satz [Lit93]: Theorem 1. Der Algorithmus aus Listing 3 auf Seite 155 findet die richtige Adresse für jeden Schlüssel C, der mit dem Algorithmus aus Listing 1 auf Seite 151 berechnet wurde. Dabei wird C höchstens zweimal weitergeleitet. Beweis zu Theorem 1: Sei a die Adresse des Servers, der C vom Client empfangen hat, j sei das Expansionslevel des Servers mit Adresse a und i das Level der Datei, sowie i das Level des Clients. Mit Level(a) wird das Expansionslevel des Servers mit der Adresse a bezeichnet. Wenn gilt: a = a = h j (C), so ist a die richtige Adresse für C und der Algorithmus terminiert. Sonst sei a = h j 1 (C). Nun gibt es zwei Möglichkeiten: (i.) n a < 2 i oder (ii.) a < n oder a 2 i. Zunächst zu (i.): Dann gilt: j = i. Angenommen a a (Im Fall a = a würde die Nachricht zu a weitergeleitet werden und a wäre die richtige Adresse), Nachricht wird weitergeleitet an a und es gilt: i < j 1 und a > a, sowie Level(a ) = j = i und a = h Level(a ) 1(C). Nun gilt entweder: a = a = h i (C) und a ist die richtige Adresse für C oder: a < a. Dann ist Level(a ) = i und a ist die richtige Adresse für C. Somit gibt es in jedem Fall von (i.) höchstens zwei Weiterleitungen. Nun zu (ii.): Dann gilt: j = i + 1 und a a. Angenommen a > a (Im Fall a = a würde die Nachricht zu a weitergeleitet werden und a wäre die richtige Adresse), Nachricht wird weitergeleitet an a und Level(a ) = i oder Level(a ) = i + 1. Im Fall Level(a ) = i + 1 gilt: h Level(a )(C) = a und a ist somit die richtige Adresse für C. Sonst gilt: a = h Level(j) 1 (C). Sei nun a = a, a ist die Adresse für C. Ansonsten gilt: a > a und a 2 i, Level(a ) = i + 1 und a ist die richtige Adresse für C. Somit gibt es auch in Fall (ii.) höchstens zwei Weiterleitungen. Der Algorithmus aus Listing 3 auf Seite 155 verwendet diese Beweisführung zur Berechnung von a, bzw. a. Darüber hinaus gibt es Möglichkeiten, den Algorithmus zu verbessern. Beispielsweise könnte man die Berechnung von a verwenden, um herauszufinden, ob C schon einmal weitergeleitet wurde. Dadurch könnte man sich die Berechnung von a beim zweiten Empfänger sparen. 2.3 Weitere Eigenschaften des LH*-Schemas Splitten von Slots Wie schon weiter oben erwähnt, erfolgt die Expansion genauso wie beim linearen Hashing. Um das Splitten eines Slots durchzuführen, wird ein Koordinator eingesetzt, der die aktuellen Werte i und p der LH*-Datei verwaltet und ändert. Das Splitten kann wieder kontrolliert (z.b. abhängig von der Auslastung) oder unkontrolliert (z.b. bei jeder Kollision)

165 Skalierbare verteilte Hashingverfahren mit Mirroring 157 durchgeführt werden. Jeder Slot, der ein Splitten auslöst, schickt eine Nachricht an diesen Koordinator. Dieser schickt die Nachricht weiter an den Slot, auf den p gerade zeigt und aktualisiert seine Werte nach demselben Schema wie beim Linearen Hashing. Der Server, der die Nachricht zum Splitten erhält (mit Expansionslevel i), führt folgende Schritte durch [Lit93]: (a) Erstellen des neuen Slots mit der Adresse p + 2 i mit Expansionslevel i + 1. (b) Splitten der enthaltenen Werte mit der Funktion h i+1 auf den eigenen und den neuen Slot. (c) Sein eigenes Expansionslevel um einen erhöhen. (d) Den Koordinator benachrichtigen, dass der Split vollzogen wurde. Durch Schritt (d) wird die Sichtbarkeit der Splits serialisiert. Wenn solche Splits für Clients sichtbar wären, die falsche Kopien von i und p haben, könnte eine Adresse berechnet werden, die außerhalb der Datei liegen würde, was die Korrektheit des Algorithmus zum Anpassen der kopierten Werte (Algorithmus 2 auf Seite 155) beeinträchtigen würde. Weitere Möglichkeiten existieren, um das Splitten zu variieren [Lit93], beispielsweise ohne einen Koordinator. Güte Die Güte des LH*-Schemas wird durch die Anzahl der Nachrichten, die zum Einfügen, bzw. Suchen eines Schlüssels erforderlich sind, ermittelt. Beim Suchen sind im besten Fall zwei Nachrichten nötig (eine zum Senden des zu suchenden Schlüssels und eine zum Empfangen der Informationen) und im schlechtesten Fall werden noch zwei Nachrichten benötigt, um die Suchanfrage weiterzuleiten. Beim Einfügen eines Schlüssels sind mindestens eine, wenn der Client die richtige Adresse berechnet, und höchstens drei Nachrichten, falls die Anfrage zweimal weitergeleitet wird, nötig. In [Lit93] wurden Simulationen durchgeführt, um zu evaluieren, wieviele Nachrichten im Schnitt benötigt werden und wie sich die Fehlerrate verhält. Dabei wurde beobachtet, dass die Nachrichtenzahl steigt, wenn die Kapazität eines Slots geringer ist und dass die Zahl sich dem Minimum von zwei, bzw. einer Nachricht annähert. Was ebenfalls beobachtet wurde ist, dass die durchschnittliche Fehlerrate ca. log 2 (k) entspricht, wobei k die Anzahl der Slots darstellt. Darüber hinaus haben aktive Clients einen deutlichen Vorteil, was die Fehlerrate angeht, als weniger aktive Clients. Dies ist intuitiv erkennbar, da aktive Clients ihre Kopien seltener anpassen müssen als inaktive Clients. Abschließend sei noch zu sagen, dass die Auslastung einer LH*-Datei immer zwischen 65% und 95% liegt (siehe dazu [Lar80]). 3 Das LH*-Schema mit Mirroring Für gewisse Anforderungen, z.b. Bank-Applikationen, ist es unerläßlich, dass die gespeicherten Daten immer verfügbar sind. Dies gilt auch für das Speichern mittels Hashing. Das LH*-Schema - wie es im vorangegangenen Kapitel vorgestellt wurde - garantiert dies jedoch nicht. Wenn man beispielsweise davon ausgeht, dass die Wahrscheinlichkeit p d, dass ein Slot verfügbar ist, bei 99% liegt und die Ausfälle der einzelnen Slots unabhängig voneinander

166 158 Marco Müller sind, so ist die Wahrscheinlichkeit, dass die gesamte LH*-Datei verfügbar ist bei p F = p N d, mit N = Anzahl Slots in der Datei. Ein Vorteil des LH*-Schemas, die Skalierbarkeit, wird so abgeschwächt, da bereits ab einer Slotanzahl von 1000 die Wahrscheinlichkeit, dass die Datei verfügbar ist bei p F = 0,00004 liegt, also bei nahezu 0%. Trotz der Vorteile, die LH* sonst bietet, ist diese Wahrscheinlichkeit für Applikationen, die mit großen Datenbeständen arbeiten, nicht tragbar, da sie entweder auf die Skalierbarkeit oder auf die Verfügbarkeit verzichten müssten. Mirroring ist ein beliebte Technik, um eine hohe Verfügbarkeit zu erreichen, und findet schon in unterschiedlichen Bereichen Anwendung. Schon unter der Annahme, dass es zwei Slots gibt, die dieselbe Information tragen, vergrößert sich die Wahrscheinlichkeit für die Verfügbarkeit enorm. So ist die Wahrscheinlichkeit für einen Slot p c = (1 (1 p d ) 2 ) = 0,9999. Für 1000 Slots ergibt sich für die Datei eine Wahrscheinlichkeit von p F = (1 (1 p d ) 2 ) N = 91%. Das ist wesentlich besser als ohne Mirroring und für die oben erwähnten Applikationen tragbar. Natürlich muss dafür gesorgt werden, dass die Vorteile des LH*-Schemas nicht verloren gehen. Eine Möglichkeit wäre, das Mirroring auf der Ebene der Server durchzuführen und jeden Server zu spiegeln. Dadurch würde keine Anpassung des LH*-Schemas notwendig werden, da es für jeden Key weiterhin eine Adresse zum Speichern gibt. Allerdings sind solche komplizierten Server sehr teuer im Vergleich zu den konventionellen Servern, die zahlreich produziert werden. Außerdem sind sie nicht gegen unvorhergesehene Ereignisse wie Stromausfälle oder Brände gesichert. Eine weitere Möglichkeit ist, das Mirroring auf der Ebene des LH*-Schemas durchzuführen. Dann müssen Anpassungen vorgenommen werden, z.b. müssen alle Kopien eines Slots verschiedene Adressen haben und diese müssen anderen Komponenten sichtbar sein. Dadurch lassen sich die oben genannten Nachteile von Mirroring auf Server-Ebene lösen. Das LH*-Schema, wie es in Kapitel 2 vorgestellt wurde, soll in diesem Kapitel um Mirroring erweitert werden, um eine größtmögliche Verfügbarkeit zu garantieren. Dabei sind folgende Eigenschaften wünschenswert [Lit96]: 1. Verfügbarkeit aller Daten trotz des Ausfalls eines Knotens 2. Verfügbarkeit aller Daten in den meisten Fällen bei Ausfällen mehrerer Knoten 3. Verfügbarkeit der meisten Daten bei Ausfällen eines Knotens in jedem Mirror 4. Balancierte Auslastung nach Ausfällen 5. Effiziente Wiederherstellung nach Ausfällen Es werden zwei verschiedene Arten von Schemata, die LH* um Mirroring erweitern, vorgestellt. In Kapitel 3.2 wird der Structurally-Alike Mirror (SA-Mirror) vorgestellt und in Kapitel 3.3 die beiden Arten des Structurally-Dissimilar Mirror (SD-Mirror), der looselycoupled SD-Mirror und der minimally coupled SD-Mirror. In Abbildung 2 werden diese schematisch dargestellt. Der nächste Abschnitt beschäftigt sich mit allgemeinen Eigenschaften, die ein LH*-Schema mit Mirroring haben muss. 3.1 Allgemeine Eigenschaften von LH* mit Mirroring Zunächst sei festgelegt, dass es zwei LH*-Dateien gibt, im weiteren F 1 und F 2 genannt, die als Mirror bezeichnet werden. Sie sind gespiegelt, jede Änderung an der einen Datei wird sofort an der anderen durchgeführt. Beide Dateien haben gleich viele Slots und einen LH*-Koordinator (vgl. Abschnitt 2.3), der das Splitten durchführt.

167 Skalierbare verteilte Hashingverfahren mit Mirroring 159 Abb. 2. Die verschiedenen Typen der LH*-Mirror: (a) SA-Mirror, (b) loosely-coupled SD-Mirror, (c) minimally coupled SD-Mirror Jeder Server und jeder Client ist in der Lage, die Slots selbstständig zu lokalisieren, um die Kopie zu finden, falls ein Slot nicht verfügbar ist. Dabei müssen die beiden Dateien nicht gleich aufgebaut sein. Im Allgemeinen gilt für einen Schlüssel c, der in Datei F 1 in Slot d gespeichert ist und in Datei F 2 in Slot d, dass d d ist. Es werden also nicht dieselben Hashfunktionen genutzt, aber der Aufbau beider Dateien ist sowohl für die Server, als auch für die Clients transparent. Jeder Mirror hat seine eigenen Clients und jeder Client hat einen primären Mirror, auf den er immer zugreift. Zugriffe auf den jeweils anderen Mirror, den sekundären Mirror, werden nur im Ausnahmefall realisiert. Dies geschieht sobald der Slot des primären Mirrors ausfällt. Ein Client, der den Mirror F 1 als primären hat, wird auch F 1 -Client genannt. Sollte ein Server ausfallen und somit ein Slot nicht verfügbar sein, so muss dieser wiederhergestellt werden, sobald er wieder verfügbar ist. Dazu wird dem LH*-Koordinator eine Funktion hinzugefügt, die das Wiederherstellen übernimmt. Für die Wiederherstellung gibt es zwei Ansätze [Lit96]: Die Wiederherstellung wird solange verzögert, bis der nicht verfügbare Slot wieder verfügbar ist. In dieser Zeit wird eine Kopie aller Schlüssel, die in diesem Slot eingefügt werden sollen, angelegt. Ein neuer Slot, auch Spare genannt, wird sofort angelegt. Durch den Spare wird eine höhere Verfügbarkeit erreicht, allerdings benötigt man auch mehr Speicher. Dies könnte in manchen Applikationen zu Problemen führen. Im weiteren Verlauf wird die interessantere Möglichkeit mit den Spares näher untersucht.

168 160 Marco Müller 3.2 Besonderheiten des SA-Mirrors Beim SA-Mirror (Structurally-Alike Mirror) sind beide Mirrors strukturell gleich. Sie haben dieselbe Slotgröße, verwenden ähnliche Hashfunktionen und dieselben Verfahren, um die Auslastung zu kontrollieren. Änderungen an einem Mirror werden dem anderen so schnell wie möglich mitgeteilt. Dies übernimmt der Server mit der richtigen Adresse für die gesendete Anfrage. Den zu einem Slot korrespondierenden Slot des anderen Mirror nennt man Buddy. Das führt dazu, dass ein Schlüssel in beiden Mirrors in den Slot mit derselben Nummer gespeichert wird. Dies unterscheidet sich von der ursprünglichen Annahme. Dadurch wird die Weiterleitung von Anfragen durch die Clients über die Mirrors vereinfacht und ist effizienter, da ein Server eine Anfrage an seinen Buddy typischerweise ohne Fehler bei der Adressierung, bzw. Weiterleitung an einen anderen Server durchführen kann. Weiterhin werden Splits nach derselben Abfolge von Anfragen durchgeführt, egal ob sie von einem F 1 -Client oder einem F 2 -Client vorgenommen wurden. Dabei werden benötigte Splits unabhängig von dem jeweils anderen Mirror entdeckt und durchgeführt. Ein Server, der einen Split entdeckt, leitet die Anfrage an seinen Buddy weiter und leitet den Split ein, unabhängig von den Aktionen, die sein Buddy veranlasst. Dieser wird typischerweise seinerseits einen Split einleiten. Durch Fehler bei der Propagierung der Anfrage oder durch verschiedene Splitzeiten kann es vorkommen, dass ein Slot in einem Mirror existiert, der im anderen Mirror noch nicht existiert. Durch diese Asynchronizität könnte ein Client eine Anfrage an einen Server stellen, dessen Slot noch nicht existiert. Dies kann dadurch geschehen, dass ein Client eine IAM von einem Server bekommt, der gerade gesplittet hat und der korresponierende Buddy seinen Split noch nicht vollzogen hat. Wenn der Client nun eine Anfrage an den anderen Mirror stellt und den Buddy des gerade erzeugten Slots als Adresse ausmacht, so tritt der oben erwähnte Fall ein. Nun sendet der Client die Anfrage an den Eltern-Server (derjenige, der das Splitten veranlassen müsste). Dieser wiederum sendet die Anfrage an den eigentlichen Server, sobald dessen Slot erzeugt wurde. Sollte der Eltern-Server nicht verfügbar sein, so wird der Koordinator informiert. Allgemein sieht das Verfahren des Clients folgendermaßen aus: Ein Client berechnet die Adresse für den Server, der seine Anfrage bearbeiten soll, nach dem LH*-Schema (vgl. Kapitel 2) und schickt diese dann an diesen Server, beispielsweise Adresse a. Wenn es sich um einen F 1 -Client handelt, wird dieser Server zur F 1 -Datei gehören. Existiert der Slot von Adresse a nicht, so wird die Anfrage an den Eltern-Server gesendet. Sollte der Client erfahren, dass a nicht verfügbar ist, so wird die Anfrage an den Buddy a gesendet. Dieser verarbeitet die Anfrage dann. Solange der Client keine Benachrichtigung bekommt, dass a wieder verfügbar ist, wird er nun immer a benachrichtigen, anstelle von a, sofern er diese Adresse berechnet. Bekommt er eine Mitteilung, dass a wieder verfügbar ist, aktualisiert er seine Zuordnungstabelle. Wie schon beim LH*-Schema erwähnt, kann der Client einen Fehler bei der Adressierung begehen. Dann wird die Anfrage weitergeleitet. Bei einem SA-Mirror gibt es zusätzlich zu den Möglichkeiten des LH*-Schemas, wie eine Anfrage propagiert wird, weitere Möglichkeiten, da die Anfrage zwischen den beiden Mirrors propagiert werden kann. Jeder Server - nehmen wir an, er gehört zu einer F 1 -Datei und hat die Adresse a 1 - der eine Anfrage empfängt, überprüft zunächst, ob der Client ein F 1 -Client, also ein primärer Client ist. Ist dem so, wird weiter verfahren wie beim LH*-Schema und die Anfrage wird gegebenenfalls an weitere Server innerhalb der F 1 -Datei weiter propagiert. Zusätzlich propagiert der Server mit der richtigen Adresse die Nachricht an seinen Buddy weiter, sofern es sich bei der An-

169 Skalierbare verteilte Hashingverfahren mit Mirroring 161 frage um ein Update handelt. Ist der Client ein sekundärer Client, so überprüft der Server zunächst, ob sein Buddy a 1 verfügbar ist. Ist dieser verfügbar, versucht a 1, die Anfrage an a 1 weiterzuleiten. Dann übernimmt a 1 die Bearbeitung der Anfrage. In jedem Fall wird eine IAM an den Client geschickt, mit der Information, dass a 1 wieder verfügbar ist, da dies ja ein primärer Server für den Client ist. Diese IAM kann mit einer anderen IAM kombiniert werden, beispielsweise wenn die Anfrage an einen weiteren Server weitergeleitet würde. Sollte das Senden von a 1 an a 1 fehlschlagen, informiert a 1 den Koordinator. Ist a 1 die richtige Adresse, antwortet der Server auf die Anfrage, ansonsten leitet er die Anfrage an einen anderen Server a 2 F 1 weiter. Dieser verfährt genauso wie a 1. Er überprüft, ob er der richtige Empfänger ist und handelt dementsprechend. Sollte a 2 nicht verfügbar sein, wird die Anfrage an a 2 gesendet und dieser handelt wie oben beschrieben. Sollte die Anfrage weder von a 2 noch von a 2 beantwortet werden können, so wird noch einmal weitergeleitet. Dann ist in jedem Fall die richtige Adresse gefunden (siehe dazu auch Theorem 1 auf Seite 156). Der Koordinator, der hier auch als Wiederherstellungs-Manager fungiert, kann ebenfalls entdecken, dass ein Server nicht verfügbar ist, wenn er einen Split veranlassen möchte. In diesem Fall veranlasst der Koordinator das Erzeugen eines Spares. Dieser Thematik widmet sich der nächste Abschnitt. Erzeugen eines Spares Ein Spare wird immer dann erzeugt, wenn ein Server nicht verfügbar ist und auf diesen zugegriffen werden soll. Angenommen der Server mit der Adresse f ist nicht mehr verfügbar. Es muss zunächst Speicherplatz für den Spare allokiert werden. Dazu wird zunächst ein Knoten s für den Spare gesucht. So ein Knoten besteht überlicherweise aus mehreren Servern. Dann wird eine Tabelle angelegt, in der gespeichert wird, welche Adresse zu welchem Server gehört. Nun wird in dieser Tabelle eingetragen, dass Anfragen, die eigentlich für f bestimmt sind, nun an den Spare in Knoten s gesendet werden. Der Spare nimmt nun die Rolle von Server f ein und empfängt alle Anfragen, die eigentlich für f vorgesehen sind. Die Werte, die bisher in f gespeichert waren, werden vom Buddy von f gesendet. Da das Erzeugen eines Spares im SD-Mirror genauso verläuft, wird es hier nicht weiter beleuchtet, sondern findet in Abschnitt 3.3 statt. Sollte der Server mit der Adresse f wieder verfügbar sein, bevor alle Clients ihre Anfragen für f schon automatisch zum Spare umleiten, wird eine Anfrage für den alten Speicherort von f vom Knoten, der diesen Speicherort beinhaltet zum Spare umgeleitet und eine IAM wird an den Client zurückgesendet, in der dann die neue Adresse für Server f enthalten ist. So wird dann nach und nach für jeden Client die logische Adresse f auf die tatsächliche Speicheradresse vom Spare angepasst und der vorherige Speicherplatz für f kann neu vergeben werden. Güte Typisch für Verfahren, die Mirroring nutzen, ist, dass doppelt soviel Speicherplatz erforderlich ist wie bei einem Verfahren ohne Mirroring. Gibt es keine Fehler, weil ein Slot nicht verfügbar ist, so ändert sich die Anzahl Nachrichten, die verschickt werden, minimal. Für eine Suche bleibt sie genauso wie beim LH*, für das Einfügen wird eine zusätzlich Nachricht für die Benachrichtigung des Buddys benötigt. Das Splitten eines Slots kostet doppelt

170 162 Marco Müller soviele Nachrichten, da es zwei identische LH*-Dateien gibt. Sollten Fehler, aufgrund von ausgefallenen Servern auftreten, so erhöht sich die Anzahl der Nachrichten bei jedem Versuch, einen ausgefallen Server zu erreichen, um zwei. Um einen Spare zu erzeugen, werden typischerweise zwei zusätzliche Nachrichten gebraucht, gemäß dem Fall, die zu kopierenden Werte können in einer Nachricht gesendet werden. Für einen Verlust von Daten aufgrund des Ausfalls von einem Server in jedem Mirror ergibt sich eine Wahrscheinlichkeit von (1 p d ) 2. Falls dies auftritt, würden die Kosten für den Verlust durchschnittlich 0,7 * b Werten betragen, wobei b der Slotgröße entspricht. 3.3 Besonderheiten des SD-Mirrors Die beiden SD-Mirrors (Structurally-Dissimilar Mirror) haben im Allgemeinen unterschiedliche Eigenschaften, beispielsweise unterschiedliche Slotgrößen oder andere Verfahren um die Auslastung zu kontrollieren. Die Hashfunktionen, die gewählt werden, müssen sich nicht ähneln, auch wenn dies das Erzeugen eines Spares vereinfachen würde. Der Vorteil des SD- Mirrors im Vergleich zum SA-Mirror liegt in der Allgemeingültigkeit, man kann z.b. die Mirrors auf heterogenen Systemen speichern mit unterschiedlichen Speichergrößen. Der Hauptunterschied zwischen dem SA-Mirror und dem SD-Mirror ist jedoch, dass sich ein Slot hinsichtlich des SD-Mirrors ebenso verhält wie ein Client, also eine Kopie der beiden Werten i und p einer LH*-Datei hat und IAM s empfängt. Beim SD-Mirror unterscheidet man zwischen zwei verschiedenen Arten. Diejenigen, die dieselben Hashfunktionen verwenden und Änderungen sofort dem jeweils anderen Mirror mitteilen, werden loosely-coupled SD-Mirror genannt. Diejenigen, die keine Voraussetzungen an die Eigenschaften der Mirrors stellen, werden auch minimally coupled SD-Mirror genannt. Wie man in Abbildung 2 auf Seite 159 sieht, liegt der Vorteil des loosely-coupled SD-Mirrors darin, dass die Wiederherstellung effizienter geschieht, da die einzelnen Werte nicht so über den zweiten Mirror verteilt sind wie beim minimally coupled SD-Mirror. In den letzten beiden Abschnitten wird näher auf diese beiden Arten eingegangen. Loosely-coupled SD-Mirror Auf der Seite des Clients gibt es im Gegensatz zum SA-Mirror nur einen Unterschied: der Client hat für jeden Mirror eine Kopie von i und p, also typischerweise zwei Kopien. Jede Kopie wird aktualisiert, wenn sie zur Berechnung einer Adresse genutzt wird. Typischerweise nutzt ein Client eine Kopie wesentlich häufiger, nämlich die seiner primären Datei. Dies führt dazu, dass die andere Kopie sehr häufig falsche Berechnungen liefert und es somit häufig zu Fehlern kommt, wenn ein Server der primären Datei ausfällt. Dieses Problem hat ein SA-Mirror nicht, was sich positiv auf dessen Zugriffszeit auswirkt. Die Rolle der Server ist ebenfalls ein wenig anders. Da es keine Buddys gibt, wird in jedem Schritt die Berechnung der Adresse durchgeführt, so wie sie bei LH* vorgestellt wurde. Dementsprechend wird eine Anfrage an den anderen Mirror geschickt, wenn der korrekte Server gefunden wurde. Splits sind genau wie beim SA-Mirror asynchron. Erzeugen eines Spares Angenommen, es fällt der Slot mit der Adresse n 1 in Mirror F 1 aus und sein Expansionslevel ist j 1. Um den Spare effizient erzeugen zu können, müssen im Mirror F 2 die Slots, in

171 Skalierbare verteilte Hashingverfahren mit Mirroring 163 denen die Werte für n 1 gespeichert sind, gefunden werden. Da beide Mirrors dieselben Hashfunktionen benutzen, gibt es zwei Möglichkeiten: 1. Die gesuchten Werte befinden sich alle in einem Slot. Dann existiert entweder noch kein Slot, für den gilt n 1 = n 2 oder das Expansionslevel j 2 von n 2 ist kleiner als j 1 und enthält dann möglicherweise mehr Werte als n Die gesuchten Werte sind über mehrere Slots verstreut, das bedeutet, dass j 2 > j 1 gilt. Um den 1. Fall abzudecken, kann folgende Formel genutzt werden, um den gesuchten Slot n 2 zu finden: (n 2 = n 1 ) (n 2 = n 2,1 = n 1 2 j 1 1 ) (n 2 = n 2,1,1 = n 2,1 2 j 1 2 )...(n 2 = 0) Für den 2. Fall müssen mehrere Slots durchsucht werden. Dazu muss n 1 selber sowie alle Slots im Teilbaum durchsucht werden. m bezeichnet hier alle Slots, die durchsucht werden müssen. Folgende Formel drückt dies aus: (m = n 1 ) (m = n 1,1 = n j 1 1 ) (m = n 1,2 = n j 1 )...(m = n j 2 1 ) (m = n 1,1,1 = n 1,1 + 2 j 1 ) (m = n 1,1,2 = n 1,1 + 2 j 1+1 ) (m = n 1,1,1,1 = n 1,1,1 + 2 j 1+1 )... Typischerweise tritt Fall 1 ein, wenn die Slotgröße b 2 von F 2 größer ist als die von F 1 (b 1 ). Der 2. Fall tritt ein, falls b 1 > b 2 gilt. Für b 1 = b 2 handelt es sich um einen SA-Mirror. Die durchschnittliche Anzahl r 1 der Slots, die in F 2 durchsucht werden müssen, um einen Spare in F 1 zu erzeugen, ist dabei (vergleiche dazu auch Bild (b.) in Abbildung 2 auf Seite 159): Güte r 1 = Max[1, b 1 b2 ] Die Kosten zum Suchen und Einfügen von Schlüsseln, unter der Annahme, dass es keine Ausfälle gibt, ist genauso wie beim SA-Mirror. Die Kosten zum Splitten erhöhen sich in F 2 um (1 + r 1 ), im Vergleich zu den Split-Kosten von F 1. Die Kosten, wenn Serverausfälle geschehen, sind höher als beim SA-Mirror. Wenn eine Propagierung im SA-Mirror eine Nachricht benötigt, so werden im loosely-coupled SD-Mirror bei einem gleichen F 1 bis zu zwei Nachrichten mehr benötigt. Die exakten Werte müssen noch gefunden werden. Das Erzeugen eines Spares kostet (1 + 2 r 1 ) Nachrichten, unter der Annahme, dass jeweils eine Nachricht zum Allokieren eines Slots und zum Senden der Werte eines Slots ausreichen. 1 Die Wahrscheinlichkeit für einen Ausfall eines Servers in jedem Mirror ist Min[N 1,N 2, ist ] 2 also sehr gut skalierbar. Falls dies auftritt, würden die Ausfallkosten im Durchschnitt 0,7 * Min[b 1, b 2 ] betragen, was um r 1 weniger ist als beim SA-Mirror. Somit würden weniger Werte ausfallen, als beim SA-Mirror Minimally coupled SD-Mirror Die Funktionsweise der Clients und der Server sind genauso wie beim loosely-coupled SD- Mirror, ebenso die Berechnung der Adressen. Das Verfahren zur Erzeugung des Spare ist

172 164 Marco Müller allerdings anders, da die Werte, die in den Spare kopiert werden müssen, auf dem Mirror verteilt sind. Somit müssen alle Server bzw. Slots durchgegangen werden, um alle Werte zu bekommen. Dadurch erhöhen sich die Kosten für das Wiederherstellen. Die Wahrscheinlichkeit, dass bei einem Ausfall eines Slots und seines korrespondierenden Slots im anderen Mirror einige Werte nicht mehr verfügbar sind, ist größer als bei den anderen Verfahren, nahezu 1 bei großen Slots. Dafür fehlen weniger Werte und der Speicherbedarf ist gering. Uniformes Hashing vorausgesetzt, ist die Anzahl der fehlenden Werte approximiert 0,7 * Max[ b 1 M 2, b 2 M 1 ], wobei gilt: M = 2 i 1 und i ist das Level des jeweiligen Mirror. 4 Fazit Die hier vorgestellten Schemata eignen sich alle, um Hashing bei einer guten Skalierbarkeit auf verteilten Systemen anzuwenden. Die drei Schemata, die LH* noch um Mirroring erweitern, erhöhen zudem die Verfügbarkeit der gespeicherten Werte. Sie brauchen zwar wesentlich mehr Speicherplatz als das zugrundeliegende LH*-Schema, allerdings verliert dieser Faktor immer mehr an Bedeutung, da der Preis für Speicher mit jedem Jahr fällt. Im Gegensatz dazu erreichen sie weiterhin eine sehr gute Zugriffszeit, die nahe am Optimum liegt. Die einzelnen Unterschiede der drei Verfahren sind in den Anforderungen, die man an die Schemata stellt, begründet. Es lassen sich nicht alle Anforderungen zusammen umsetzen und jedes Schema setzt andere Anforderungen um. Der SA-Mirror beispielsweise kommt mit weniger Nachrichten bei der Wiederherstellung von ausgefallenen Servern aus, hat aber eine größere Ausfallrate wie der loosely-coupled SD-Mirror. Für zukünftige Arbeiten ist eine detailliertere Analyse der Kosten der hier vorgestellten Schemata wünschenswert, um einen besseren Vergleich machen zu können. Ebenfalls könnte man sich weitere Varianten vorstellen, die beispielsweise ohne einen Koordinator auskommen, oder die Technik der Spares verfeinern oder austauschen. Ein weiterer Ansatz wäre die Verwendung von mehr als zwei Mirrors, wie es hier die Fall ist, um evtl. eine höhere Verfügbarkeit zu erreichen. Literaturverzeichnis Com77. D. Comer & R. Sethi (1977) The complexity of trie index construction, Journal of the ACM, Vol. 24, P Enb88. R. J. Enbody & H. C. Du (1988) Dynamic Hashing Schemes, ACM Computer Surveys, Vol. 20, Nr. 2, P Lar80. P.A.Larson (1980) Linear Hashing with partial expansions, ACM Transactions on Database Systems, Vol. 7, No. 4, P Lit80. W. Litwin (1980) Linear Hashing : A new tool for file and table adressing, Sixth International Conference on Very Large Data Bases, P Lit93. W. Litwin & M.-A. Neimat & D.A. Schneider (1993) LH* - Linear Hashing for Distributed Files, Proceedings of the 1993 ACM SIGMOD international conference on Management of data, P Lit96. W. Litwin & M.-A. Neimat (1996) High-Availability LH* Schemes with Mirroring, Proceedings of the First IFCIS International Conference on Cooperative Information Systems, P

173 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen in 2D-Umgebungen Benjamin Eikel Universität Paderborn, Zusammenfassung. Das vorgestellte Verfahren berechnet einen kürzesten Weg in einer zweidimensionalen Umgebung zwischen einem Start- und einem Zielpunkt. Hierbei umgeht es Hindernisse in der Umgebung, die beliebig geformt sein können. Die Berechnung ist schneller als die bei Gitter-basierten Verfahren, aber mindestens so genau. Wenn ein kürzester Weg existiert, wird er im Gegensatz zu anderen Quadtree-basierten Verfahren von diesem Verfahren gefunden, auch wenn die Platzierung der Hindernisse ungünstig ist. Es wird eine neue Datenstruktur, der Framed-Quadtree, vorgestellt, die eine erweiterte Form eines Quadtrees ist. Diese sorgt für die hohe Effizienz und Genauigkeit des Verfahrens. Schlüsselwörter: Quadtree, kürzester Weg, Wegeberechnung, Roboter 1 Einleitung Motivation Bisherige Verfahren Algorithmus Datenstruktur Wellenausbreitung Ablaufplanung für Eintrittspunkte Bestimmung des kürzesten Weges Zusammenfassung Fazit Ausblick Literaturverzeichnis Einleitung 1.1 Motivation Der hier behandelte Algorithmus findet einen kürzesten Weg in einer bekannten, zweidimensionalen Umgebung, der an Hindernissen vorbeiführen muss. Solche Wege sind interessant für die Wegeplanung von Robotern, für GPS-gestützte Navigationssysteme und den Entwurf von integrierten Schaltkreisen. Diese Seminararbeit basiert auf dem Artikel von Chen, Szczerba und Uhran, Jr. [1].

174 166 Benjamin Eikel 1.2 Bisherige Verfahren Dieses Verfahrens vereint die Vorteile von früheren Verfahren, die als Datenstruktur Gitter oder Quadtrees benutzen. Verfahren mit quadratischen Gitterzellen finden kürzeste Pfade. Allerdings sind sie ineffizient, wenn es große Regionen ohne Hindernisse gibt, da alle Zellen in diesen Regionen betrachtet werden müssen. Verfahren, die Quadtrees benutzen, sind allgemein effizienter als Gitter-basierte Verfahren. Dies liegt an der Eigenschaft des Quadtrees, große Regionen nicht zwangsläufig weiter unterteilen zu müssen, wie dies beim Gitter geschieht. Solche Verfahren finden aber nicht immer den kürzesten Weg. Wenn ein Hindernis genau auf den Grenzen zweier Quadranten eines Quadtrees wie in Abbildung 1 liegt, liefern die Verfahren keinen optimalen Weg. Eine Verschiebung des Quadtrees funktioniert zwar für ein Hindernis, bei mehreren Hindernissen kann dies aber dazu führen, dass nach der Verschiebung ein anderes Hindernis auf einer Grenze liegt. Außerdem ist der Aufwand für die Neuberechnung des Quadtrees hoch. Abb. 1. Beispiel, bei dem ein Verfahren mit einem Quadtree nicht den kürzesten Weg findet. Pfad A (rot) ist der von dem Verfahren gefundene Weg, Pfad B (blau) ist der kürzeste Weg. Die Zahl in einer Zelle des Quadtrees sind die Kosten, um von dieser Zelle zum Ziel zu gelangen.

175 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen Algorithmus Das im Folgenden vorgestellte Verfahren erhält als Eingabe eine Umgebung mit Hindernissen. Die Hindernisse können beliebig beschrieben sein (Vielecke, Gitterzellen oder mathematische Funktionen). Aus der Umgebung wird die in Abschnitt 2.1 vorgestellte Datenstruktur erstellt. Hierfür muss lediglich geprüft werden, ob ein Teil eines Hindernisses in einem Quadrat liegt, was durch Schnittberechnungen erfolgen kann. 2.1 Datenstruktur Wegen der genannten Nachteile der bisherigen Verfahren wird hier eine neue Datenstruktur vorgestellt. Diese Datenstruktur heißt Framed-Quadtree und ist eine Erweiterung des Quadtrees. In einem Quadtree repräsentiert ein Knoten einen quadratischen, zweidimensionalen Bereich. Im Framed-Quadtree gibt es drei verschiedene Arten von Knoten. Freie Knoten stehen für einen Bereich, in dem sich keine Hindernisse befinden. Bereiche, in denen sich Hindernisse befinden, werden durch Hindernis-Knoten modelliert. Diese beiden Knotenarten sind Blätter des Framed-Quadtrees. Die dritte Knotenart, der Mischknoten, ist ein innerer Knoten des Framed-Quadtrees und beinhaltet vier Kindknoten. Er repräsentiert Bereiche, die sowohl frei als auch durch Hindernisse blockiert sind. Die Bereiche werden solange weiter unterteilt, bis ein Knoten entweder nur aus freien oder blockierten Bereichen besteht und dann zur ersten oder zweiten Knotenart gehört, oder der Knoten die kleinste erlaubte Größe (Auflösung) erreicht hat, aber noch Teile des Hindernisses enthält. Im letzten Fall wird der Knoten als Hindernis markiert. Falls es sich anstatt um einen Punktroboter um einen Roboter mit Ausdehnung handelt, sollte die Auflösung so gewählt werden, dass sich der Roboter durch die kleinstmöglichen Bereiche bewegen kann. Also sollte die kleinstmögliche Größe mindestens so groß wie die Ausdehnung des Roboters sein. Die Blattknoten des Framed-Quadtrees erhalten zusätzlich einen Rahmen aus quadratischen Zellen. Diese Zellen haben die kleinste erlaubte Größe (Auflösung). Der Sinn dieser Rahmenzellen liegt in der möglichen Durchquerung des Quadranten durch den Roboter. Wenn der Roboter einen freien Quadranten durchqueren soll, sind nur der Eintrittspunkt und Austrittspunkt dieses Quadranten wichtig. Beide müssen auf dem Rand des Quadranten liegen. Ein Pfad durch den Quadranten kann also festgelegt werden, indem eine Rahmenzelle als Eintrittspunkt und eine als Austrittspunkt bestimmt wird. Abbildung 2 zeigt einen Framed-Quadtree in graphischer Darstellung und als Baum. Bei der Berechnung des kürzesten Weges in einem Framed-Quadtree muss erwähnt werden, dass dieser nur aus stückweise kürzesten Wegen zusammengesetzt ist. Der Weg durch einen Quadranten ist wirklich ein kürzester Weg. Allerdings kann ein Roboter beim Übergang von einer Rahmenzelle eines Quadranten in eine Rahmenzelle eines benachbarten Quadranten in nur acht Richtungen gehen, da eine Rahmenzellen höchstens so viele benachbarte Rahmenzellen haben kann. Der größte Teil des Weges führt allerdings durch freie Quadranten, so dass dieses Problem nicht allzu stark ins Gewicht fällt. Weiterhin kann ein nahezu kürzester Weg berechnet werden, indem der gefundene Weg geglättet wird. 2.2 Wellenausbreitung Zur Berechnung des kürzesten Weges wird ein Verfahren angewandt, das eine Welle beginnend bei der Anfangsposition des Roboters aussendet. Diese Welle weist jeder freien Zelle

176 168 Benjamin Eikel Abb. 2. Die Beispielsumgebung oben links wird in den Framed-Quadtree oben rechts unterteilt. Die Darstellung als Baum ist im unteren Teil zu sehen. Abbildung übernommen aus [1]. des Framed-Quadtrees ähnlich einer Breitensuche einen Distanzwert zu. Dieser Distanzwert beschreibt die Kosten für den Roboter, diese jeweilige Position vom Startpunkt aus zu erreichen. Es wird die L 2 -Metrik verwendet. Die L p -Metrik ist definiert als dist p (a, b) := p a x b x p + a y b y p [2]. Die L 2 -Metrik beschreibt im zweidimensionalen Raum R 2 also die bekannte Distanz zwischen zwei Punkten a, b R 2 mit dist 2 (a, b) = (a x b x ) 2 + (a y b y ) 2. Innerhalb eines Quadranten des Framed-Quadtrees breitet sich die Welle von Rahmenzelle zu Rahmenzelle aus. Hierbei kann die Ausbreitung von einer Rahmenzelle zu einer Rahmenzelle innerhalb desselben Quadranten oder zu einem benachbarten Quadranten erfolgen. Eine Rahmenzelle, die durch eine Rahmenzelle eines benachbarten Quadranten erreicht wird, heißt Eintrittspunkt. Die Wellenausbreitung kann einen Quadranten mehrfach erreichen und daher kann es mehrere Eintrittspunkte geben. Die maximale Anzahl an Eintrittspunkten ist die Anzahl an Rahmenzellen eines Quadranten. Die Wellenausbreitung erfolgt nun rundenweise. Eine WFT (wave frontier table) beinhaltet die aktuell durch die Welle erreichten Quadranten, deren Rahmenzellen noch nicht

177 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 169 vollständig abgearbeitet worden sind. Zu Beginn beinhaltet diese Tabelle nur den Quadranten mit der Anfangsposition des Roboters. In jeder Runde wird die Welle nun in benachbarte Quadranten ausgebreitet, welche bei Erreichen zu der Tabelle hinzugefügt werden. Weiterhin wird eine Kontrollvariable wellenwert benutzt, die in jeder Runde um eins erhöht wird. In der i-ten Runde ist der Wert also i. Während einer Iteration i breitet sich die Welle in alle Rahmenzellen aller Quadranten aus der WFT aus, zu denen der kürzeste Weg von der Anfangsposition des Roboters bis zu dieser Rahmenzelle eine Distanz d mit i 1 < d i hat. In jeder Runde werden die Eintrittspunkte der Quadranten aus der WFT betrachtet und die Welle von dort in diesen Quadranten oder benachbarte Quadranten ausgebreitet. Wenn alle Rahmenzellen eines Quadranten und alle benachbarten Rahmenzellen einen Distanzwert erhalten haben, dann wird der Quadrant aus der WFT entfernt. Für die Terminierung gibt es zwei Möglichkeiten. Entweder erreicht die Ausbreitung der Welle den Quadranten, der die Zielposition enthält, oder die WFT ist leer. Wenn die WFT leer ist und die Welle das Ziel nicht erreicht hat, dann kann der Roboter von seiner Anfangsposition die Zielposition nicht erreichen. 2.3 Ablaufplanung für Eintrittspunkte Sei n die Seitenlänge eines Quadranten gemessen in der Anzahl der Rahmenzellen. Bei einem Gitter-basiertem Verfahren bestünde ein Quadrant aus n n Zellen und eine Wellenausbreitung in diesem Quadranten benötigte O(n 2 ) Schritte. In einem Framed-Quadtree wird der freie Bereich in der Mitte nicht verwendet und die Welle breitet sich nur über die Rahmenzellen aus. Ein Quadrant hat 4 n 4 = O(n) Rahmenzellen. Definition 1. Sei R Q die Menge von Rahmenzellen eines Quadranten Q in einem Framed- Quadtree. Seien a, b R Q Eintrittspunkte von Q. Sei dist(y, z) eine Funktion, die einer Rahmenzelle y R Q einen Distanzwert zuweist, wenn sich die Welle von Eintrittspunkt z R Q ausgebreitet hat. Sei R Q (a) = {y R Q dist(y, a) < dist(y, b)}. Dann dominiert Eintrittspunkt a den Eintrittspunkt b über R Q (a). R Q (a) ist also eine Menge von Rahmenzellen eines Quadranten Q, zu denen sich die Welle von Eintrittspunkt a mit einem geringeren Distanzwert ausbreitet hat als von Eintrittspunkt b aus. Ein Quadrant kann mehrere Eintrittspunkte enthalten. Von jedem dieser Eintrittspunkte wird die Welle weiter ausgebreitet. Im schlimmsten Fall können alle Rahmenzellen auch Eintrittspunkte sein. Wenn von jedem dieser Eintrittspunkte aus versucht würde, die Welle zu allen anderen Eintrittspunkten auszubreiten, führte dies zu einer Laufzeit von O(n 2 ). Die im Folgenden vorgestellte Ablaufplanung sorgt dafür, dass für die Wellenausbreitung in einem Quadrant eine Laufzeit in O(n) eingehalten wird. Dafür ist die Beobachtung wichtig, dass einige Eintrittspunkte nicht betrachtet werden müssen, da sie von anderen Eintrittspunkten dominiert werden. Wenn während einer Runde mehrere Eintrittspunkte derselben Rahmenzelle einen Distanzwert zuweisen wollen, dann wird der Rahmenzelle der niedrigste Wert zugewiesen. Bei den zwei kleinstmöglichen Quadranten mit einer Rahmenzelle oder vier Rahmenzellen, bei denen kein freier Bereich in der Mitte existiert, wird die Welle zu allen angrenzenden

178 170 Benjamin Eikel Abb. 3. Aufteilung der Rahmenzellen eines Quadranten in vier Seiten. Rahmenzellen ausgebreitet. Bei diesen Quadranten kann dies in O(1) Zeit durchgeführt werden. Vorerst wird nur noch der Fall betrachtet, dass Eintrittspunkte an einer Seite eines Quadranten auftreten. Hierfür werden die Rahmenzellen eines Quadranten wie in Abbildung 3 zu sehen aufgeteilt. Wenn eine Ablaufplanung von Eintrittspunkten für eine Seite gelingt, so kann diese für die anderen drei Seiten benutzt werden, indem der Quadrant um 90, 180 und 270 gedreht betrachtet wird. Definition 2. Sei R Q die Menge von Rahmenzellen einer bestimmten Seite j eines Quadranten Q in einem Framed-Quadtree. Ein Eintrittspunkt a von Q wird blockiert auf Seite j nach Runde i T genannt, wenn es andere Eintrittspunkte von Q gibt, die a über R Q nach Runde i T dominieren. Das bedeutet, dass a nach Runde i T weiteren Rahmenzellen auf Seite j keinen Distanzwert mehr zuweisen kann. Jeder Eintrittspunkt erhält vier binäre Blockierungsmarkierungen. Diese zeigen an, ob der Eintrittspunkt für die jeweilige Seite des Quadranten blockiert ist. In jeder Runde i werden die Eintrittspunkte überprüft, die mindestens für eine Seite nicht blockiert sind und es wird versucht, den Rahmenzellen auf den nicht blockierten Seite des Quadranten Distanzwerte von diesen Eintrittspunkten aus zuzuweisen. Die Eintrittspunkte auf Seite 1 können den Rahmenzellen auf vier Seiten Distanzwerte zuweisen. Die Ablaufplanung muss vier Fälle unterscheiden, die den vier Seiten entsprechen. Diese vier Fälle werden im Folgenden einzeln abgehandelt. Hierfür sei Q der betrachtete Quadrant und i die Runde, in welcher der erste Eintrittspunkt Seite 1 von Q erreicht. Der Quadrant Q hat also vor Runde i keine Eintrittspunkte. Es wird gezeigt, wie die notwendigen Datenstrukturen für Runde i aufgebaut werden und wie eine Aktualisierung für die folgenden Runden erfolgt.

179 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 171 Seite 1 In Runde i erreichen k 1 Eintrittspunkte die Seite 1. Diese k Eintrittspunkte werden in eine Liste eingefügt. In jeder Runde wird diese Liste durchlaufen und die Eintrittspunkte versuchen, die Welle nach links und nach rechts auszubreiten. Falls beide Seiten des Eintrittspunktes durch kleinere Distanzwerte blockiert sind oder der Rand des Quadranten erreicht ist, so ist dieser Eintrittspunkt blockiert und wird aus der Liste entfernt. Nach jeder Runde enthält die Liste dann nur nicht blockierte Eintrittspunkte. Falls in späteren Runden neue Eintrittspunkte die Seite 1 erreichen, werden sie an den Anfang der Liste eingefügt. Den Rahmenzellen wird nach jeder Runde, wie bereits oben erwähnt, der kleinste Distanzwert zugewiesen. Lemma 1. Sei Q ein n n Quadrant in einem Framed-Quadtree. Die Wellenausbreitung durch die Eintrittspunkte kann allen Rahmenzellen auf Seite 1 von Q Distanzwerte in Laufzeit O(n) zuweisen. Die Laufzeit ist unabhängig von der Anzahl von Eintrittspunkten. Beweis. Die Eintrittspunkte auf Seite 1 können die Welle zu höchstens einer Rahmenzelle auf der rechten und einer auf der linken ausbreiten. Daher kann zu einer Rahmenzelle b auf Seite 1 die Welle von höchstens zwei Eintrittspunkten ausgebreitet werden. Der Rahmenzelle wird der niedrigere Distanzwert zugewiesen. In jeder Runde wird die Welle von einem Eintrittspunkt zu mindestens einer der O(n) Rahmenzellen ausgebreitet oder der Eintrittspunkt wird aus der Liste entfernt. Jeder dieser zwei Fälle benötigt konstante Laufzeit. Da in jeder Runde mindestens einer Rahmenzelle ein Distanzwert zugewiesen wird, beträgt die Laufzeit für Seite 1 O(n). Seite 2 In diesem Fall wird die Wellenausbreitung von Eintrittspunkten auf Seite 1 zu Rahmenzellen auf Seite 2 betrachtet. Es wird wieder angenommen, dass k 1 Eintrittspunkte in Runde i das erste Mal auf Seite 1 auftreten. Die Eintrittspunkte werden in eine Liste eingefügt. Weil diese Eintrittspunkte in Runde i auftreten, müssen sie einen Distanzwert zwischen i 1 und i haben. Welche Rahmenzellen auf Seite 2 von Eintrittspunkten auf Seite 1 Distanzwerte erhalten, hängt von der Entfernung zwischen den Rahmenzellen und den Eintrittspunkten ab. Daher wird die Liste mit den k Eintrittspunkten nach x-koordinate sortiert (Festlegung der x-achse in Abbildung 3). Da die Koordinaten ganzzahlige Werte in einem bekannten Bereich sind, kann eine Sortierung mit dem Bucket-Sort-Algorithmus [3] in linearer Zeit erfolgen. Lemma 2. Seien a und b zwei verschiedene Eintrittspunkte auf Seite 1 eines Quadranten Q in einem Framed-Quadtree. Sei a dw der Distanzwert und a x die x-koordinate von a. Wenn a dw b dw und a x < b x, dann wird b von a auf Seite 2 dominiert und b muss nicht weiter betrachtet werden. Beweis. Sei z eine beliebige Rahmenzelle auf Seite 2, der sowohl a als auch b einen Distanzwert zuweisen wollen. Wenn der Distanzwert von z vom Eintrittspunkt a zugewiesen wird, dann gilt z dw = a dw + dist 2 (a, z). Wenn a x < b x gilt, dann gilt auch dist 2 (a, z) < dist 2 (b, z) für jede Rahmenzelle z auf Seite 2. Eine Rahmenzelle erhält von den Eintrittspunkten a und b den kleineren Distanzwert z dw = min {a dw + dist 2 (a, z), b dw + dist 2 (b, z)}. Wenn nun

180 172 Benjamin Eikel a dw b dw und a x < b x, dann gibt es keine Rahmenzelle auf Seite 2, die von b einen Distanzwert erhalten kann, der kleiner ist als der von a. Daher dominiert a den Eintrittspunkt b über alle Rahmenzellen auf Seite 2 und b muss nicht weiter betrachtet werden. Aus der sortierten Liste mit k Eintrittspunkten können nun die Punkte extrahiert werden, die nicht wie in Lemma 2 beschrieben nicht weiter betrachtet werden müssen. Diese neue Liste kann durch eine Variante der dominating maxima of planar points [1] in Zeit O(k) = O(n) berechnet werden. Die auf Seite 2 nicht blockierten Eintrittspunkte dieser Liste müssen die Welle nun zu den Rahmenzellen auf Seite 2 ausbreiten. Dies muss erfolgen, ohne dass jeder Eintrittspunkte eine Ausbreitung zu jeder der Rahmenzellen versucht, da dies zu einer zu hohen Laufzeit führt. Daher werden hierzu die Voronoi-Domänen auf Seite 2 berechnet. Definition 3. Die Voronoi-Domäne V D i (a) auf Seite i eines Eintrittspunktes a auf Seite 1 ist ein Bereich von Rahmenzellen auf Seite i, in dem a alle anderen Eintrittspunkte auf Seite 1 dominiert. Wenn die Voronoi-Domäne auf Seite 2 eines Eintrittspunktes die leere Menge ist, dann ist er blockiert auf Seite 2 und kann aus der Liste der nicht blockierten Eintrittspunkte entfernt werden. Die nicht blockierten Eintrittspunkte p 1, p 2,..., p k mit k k befinden sich absteigend nach x-koordinate sortiert in der Liste (p 1x > p 2x >... > p k x). p 1 ist der Eintrittspunkt, der am weitesten rechts auf Seite 1 liegt. Die Liste wird nun, beginnend mit p 1, durchlaufen und die folgenden Datenstrukturen werden für die bisher betrachteten j Eintrittspunkte p 1, p 2,..., p j verwendet, bevor p j+1 betrachtet wird. Erstens die Liste L j {p 1, p 2,..., p j }. Sie enthält einen Eintrittspunkt p γ {p 1, p 2,..., p j } genau dann, wenn p γ nicht von einem Eintrittspunkt aus {p 1, p 2,..., p j } dominiert wird auf Seite 2. Zweitens die Voronoi-Domänen auf Seite 2 der Eintrittspunkte aus L j. Die Liste wird durchlaufen, bis alle Voronoi-Domänen der Eintrittspunkte aus L k berechnet wurden. Zu Beginn kann L 1 und V D 2 (p 1 ) leicht berechnet werden, denn L 1 = {p 1 } und V D 2 (p 1 ) enthält alle Rahmenzellen der Seite 2. Nun sollen die Voronoi-Domänen der Eintrittspunkte in L j+1 aus denen der Eintrittspunkte in L j berechnet werden. Der erste Eintrag in der Liste L j sei der zuletzt hinzugefügte Eintrittspunkt p j mit 1 j j. Es werden jetzt nur die Voronoi-Domänen auf Seite 2 der Eintrittspunkte p j+1 und p j berechnet. Dies geschieht durch Berechnung der gemeinsamen Grenze zwischen den beiden Voronoi-Domänen. Sei die Rahmenzelle z diese gemeinsame Grenze auf Seite 2 und seien a, b zwei Eintrittspunkte auf Seite 1. Für die Rahmenzelle z auf Seite 2 gilt z x = 0 und für die zwei Eintrittspunkte auf Seite 1 gilt a y = b y = 0. Es muss gelten: z dw = z dw a dw + dist 2 (a, z) = b dw + dist 2 (b, z) (i) (a x z x ) 2 + (a y z y ) 2 + a dw = (b x z x ) 2 + (b y z y ) 2 + b dw a 2 x + zy 2 + a dw = b 2 x + zy 2 + b dw Die Werte der Eintrittspunkte a x, a dw, b x, b dw sind bekannt und die Gleichung kann für z y gelöst werden. Bei zwei Lösungen wird nur die positive Lösung benötigt, denn Rahmenzellen mit negativer y-koordinate sind nicht vorhanden. Der Wert von z y bestimmt eine

181 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 173 Rahmenzelle z auf Seite 2, welche die gemeinsame Grenze der Voronoi-Domänen von a und b ist. Jede Voronoi-Domäne auf Seite 2 kann durch zwei begrenzende Rahmenzellen festgelegt werden, eine obere und eine untere Begrenzungszelle. Die untere Begrenzungszelle von V D 2 (p j ) ist die Rahmenzelle in der unteren, linken Ecke des Quadranten, weil die x-koordinate der nicht blockierten Eintrittspunkte mit steigendem j abnimmt und p j der zuletzt eingefügte Eintrittspunkt ist. Da p j, um überhaupt eingefügt zu werden, mindestens eine Rahmenzelle dominieren muss, muss die Voronoi-Domäne mindestens aus der untersten Rahmenzelle auf Seite 2 bestehen. Die Rahmenzelle auf der Grenze zwischen den Voronoi- Domänen gehöre ohne Beschränkung der Allgemeinheit zur Voronoi-Domäne von p j. Die Liste der Eintrittspunkte L j+1 und deren Voronoi-Domänen können dann wie folgt berechnet werden. Fall 1: z ist die Rahmenzelle in der unteren, linken Ecke des Quadranten. Da die Grenze z per Definition zu p j gehört, erhält p j+1 keine Voronoi-Domäne auf Seite 2 und wird nicht zu L j hinzugefügt, weshalb L j+1 = L j gilt. Die Voronoi-Domänen bleiben also unverändert. Der nächste Eintrittspunkt p j+2 kann betrachtet werden. Fall 2: z y > 0 und ist nicht oberhalb der oberen Begrenzungszelle der Voronoi-Domäne V D 2 (p j ). Dann ist die neue untere Begrenzungszelle der Voronoi-Domäne V D 2 (p j ) die Rahmenzelle z. Die Rahmenzelle direkt unterhalb von z ist die obere Begrenzungszelle von V D 2 (p j+1 ) und die Rahmenzelle in der unteren, linken Ecke wird die untere Begrenzungszelle. Die Voronoi-Domäne von V D 2 (p j ) wird also verkleinert und V D 2 (p j+1 ) erhält die frei gewordenen Rahmenzellen wie in Abbildung 4 zu sehen. Der Eintrittspunkt p j+1 wird zu L j hinzugefügt; L j+1 = L j {p j+1 }. Die Betrachtung kann mit p j+2 fortgesetzt werden. Fall 3: Wenn z oberhalb der oberen Begrenzungszelle der Voronoi-Domäne V D 2 (p j ) ist, dann wird p j von p j+ 1 dominiert auf Seite 2 und p j wird aus L j entfernt. Der nächste Eintrittspunkt in L j sei p j. Die untere Begrenzungszelle der Voronoi-Domäne V D 2 (p j ) sei dann nun die untere, linke Rahmenzelle des Quadranten. Der gesamte Vorgang wird nun für p j+1 und p j anstelle von p j wiederholt. Wenn der Vorgang schlussendlich terminiert und p j+1 in L j+1 enthalten ist, kann mit p j+2 fortgefahren werden. Die Berechnung der begrenzenden Rahmenzelle z kann in konstanter Zeit erfolgen. In Fall 1 geschieht nichts, im zweiten Fall wird p j+1 zu L j+1 hinzugefügt und im dritten Fall wird ein Eintrittspunkt aus L j entfernt. Alle drei Operationen benötigen konstante Zeit. In einer Runde i werden zuerst die Eintrittspunkte sortiert, dann die blockierten Eintrittspunkte entfernt und anschließend die Liste der Eintrittspunkte L k durchlaufen, um die Voronoi- Domänen auf Seite 2 zu berechnen. Die ersten beiden Operationen benötigen O(n) Zeit, der Durchlauf der Liste mit der Aktualisierung der Voronoi-Domänen benötigt O(k) Zeit. Wenn also k neue Eintrittspunkte in einer Runde i auftreten, ist die Laufzeit zur Verarbeitung O(n + k) = O(n). Nachdem in Runde i die ersten k Eintrittspunkte aufgetreten sind, können in folgenden Runden i + j, j 1 neue Eintrittspunkte auf Seite 1 auftreten. Die bestehenden Datenstrukturen können dann aktualisiert werden. Angenommen in Runde i + j treten m neue Eintrittspunkte auf.

182 174 Benjamin Eikel Abb. 4. Zweiter Fall: Neue Voronoi-Domäne für p j+1 durch Verkleinerung der Voronoi-Domäne von p j. Lemma 3. Sei b der am weitesten links liegende Eintrittspunkt auf Seite 1 in oder vor Runde i + j 1, j 1 in einem Quadranten eines Framed-Quadtrees. Ein in Runde i + j auftretender Eintrittspunkt e auf Seite 1 wird dominiert auf Seite 2 wenn e x > b x. Beweis. Da b schon vor Runde i + j aufgetreten ist und e erst in Runde i + j auftritt, muss für die Distanzwerte e dw > b dw gelten. Lemma 2 besagt, dass e von b dominiert wird, wenn b dw e dw und b x < e x. Wenn also auch e x > b x gilt, dominiert b den Eintrittspunkt e bezüglich Seite 2. Sei b der Eintrittspunkt auf Seite 1, der vor Runde i + j aufgetreten ist und der am weitesten links liegt. Aufgrund des Lemmas 3 können in einer Runde alle Eintrittspunkte, die rechts von b auftreten, sofort verworfen werden. Sei E i+j die Menge der anderen Eintrittspunkte, also diejenigen, die links von b aufgetreten sind. Sei b E i+j der Eintrittspunkt, der am weitesten links liegt. Mit einem Bucket-Sort in dem Intervall b x bis b x können die Eintrittspunkte aus E i+j in Laufzeit O(b x b x + 1) sortiert werden. Die nach Lemma 2 dominierten Eintrittspunkte können dann entfernt werden, was Zeit O(m) benötigt. Die dann entstehende Menge sei E i+j. Für die Eintrittspunkte aus dieser Menge müssen nun die vor dieser Runde berechneten Voronoi-Domänen aktualisiert werden. Hierfür kann das oben beschriebene Verfahren für Runde i verwendet werden, mit dem man die Menge E i+j durchläuft. Die Operation für jeden Eintrag der Menge benötigt konstante Laufzeit, die gesamte Aktualisierung benötigt Laufzeit O(m). In jeder Runde der Wellenausbreitung ab Runde i + 1 versucht jeder Eintrittspunkt auf Seite 1 den Rahmenzellen auf Seite 2, die in der eigenen Voronoi-Domäne sind, einen Distanzwert zuzuweisen. Dies kann nur erfolgen, wenn der zuzuweisende Distanzwert kleiner oder gleich wellenwert ist. Das Verfahren wird so lange fortgesetzt, bis die obere Begrenzungszelle einer Voronoi-Domäne einen Distanzwert erhalten hat. Denn dann hat der Eintrittspunkt allen Rahmenzellen, über die er dominiert, einen Distanzwert zugewiesen und ist danach blockiert für Seite 2. Er kann dann aus der Liste der Eintrittspunkte entfernt werden. Wenn diese Liste leer ist, endet das Verfahren.

183 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 175 Lemma 4. Sei Q ein n n Quadrant in einem Framed-Quadtree. Die Welle kann durch die Eintrittspunkte auf Seite 1 zu den Rahmenzellen auf Seite 2 in Laufzeit O(n), unabhängig von der Anzahl von Eintrittspunkten, durchgeführt werden. Beweis. Die Voronoi-Domänen für mehrere Eintrittspunkte, die in Runde i auftreten, können in Zeit O(n) berechnet werden. In allen darauffolgenden Runden i+j, j 1 benötigt der Bucket-Sort-Algorithmus O(n) Zeit, denn jeder Eintrittspunkt auf Seite 1 kann höchstens ein Mal in allen Runden neu auftreten und sortiert werden müssen. Die gesamte Laufzeit der Aktualisierung der Voronoi-Domänen ist linear in der Anzahl N n der auftretenden Eintrittspunkte, denn die Operationen für die Aktualisierung der Voronoi-Domäne für einen Eintrittspunkt ist konstant. Da jeder Eintrittspunkt nur Rahmenzellen aus seiner Voronoi- Domäne Distanzwerte zuweisen kann und diese Voronoi-Domänen in Zeit O(n) verwaltet werden können, ist die Laufzeit für die Wellenausbreitung O(n). Seite 3 Um die Welle von Eintrittspunkten auf Seite 1 zu Rahmenzellen auf Seite 3 auszubreiten, kann das Verfahren für Seite 2 in gespiegelter Form benutzt werden. Seite 4 Bei der Ablaufplanung für Seite 4 ist es problematisch, dass hier nicht wie bei Seite 2 Eintrittspunkte aufgrund ihrer Lage auf Seite 1 direkt als blockiert ausgeschlossen werden können. Doch es kann ein Ausschluss von Eintrittspunkten auf Seite 1 anhand des Zeitpunkts ihres Auftretens durchgeführt werden. Angenommen in einem n n Quadrant Q in einem Framed-Quadtree treten die ersten Eintrittspunkte auf Seite 1 in Runde i auf. Sei t 1 der Wert von wellenwert, wenn die Eintrittspunkte auftreten (hier t 1 = i). Angenommen während der Runden t 1 bis t n n treten k 1 Eintrittspunkte auf Seite 1 auf. Diese werden beim Auftreten in eine Liste eingefügt. Lemma 5. Jeder Eintrittspunkt auf Seite 1, der nach Runde t n n auftritt, kann keine Voronoi-Domäne auf Seite 4 erhalten und muss daher nicht weiter betrachtet werden. Beweis. Sei x der erste Eintrittspunkt auf Seite 1 in Runde t 1. Wenn keine anderen Eintrittspunkte auftreten, dann wäre die Zeit, um von x allen Rahmenzellen auf Seite 4 einen Distanzwert zuzuweisen gleich der Zeit, um die Rahmenzelle zu erreichen, die am weitesten von x entfernt ist. Im schlimmsten Fall, wenn x eine Rahmenzelle in der Ecke des Quadranten ist, ist die am weitesten entfernte Zelle die diagonal gegenüberliegende Rahmenzelle auf Seite 4. In Abbildung 5 ist dieser schlimmste Fall zu sehen und die Zelle auf Seite 4 mit z bezeichnet. Um die Entfernung zu dieser Zelle zu überbrücken, werden 2 n Runden benötigt. Also wird diese Zelle in Runde t n erreicht. Falls andere Eintrittspunkte auf Seite 1 auftreten, können diese ebenfalls versuchen, den Rahmenzellen auf Seite 4 einen Distanzwert zuzuweisen. Die minimal benötigte Anzahl von Runden hierfür ist n, mit der die direkt oberhalb liegende Rahmenzelle erreicht werden kann. Daher kann ein Eintrittspunkt y, der in Runde t 2 mit t 2 > t n n auftritt, keine Rahmenzelle auf Seite 4 vor Runde t 2 + n erreichen. Aber zu diesem Zeitpunkt sind bereits alle Rahmenzellen auf Seite 4 durch den Eintrittspunkt x erreicht worden. Daher ist y blockiert und muss nicht mehr betrachtet werden.

184 176 Benjamin Eikel Abb. 5. Die Wellenausbreitung von x nach z benötigt 2 n Schritte, die von y nach z benötigt n Schritte. In Runde t n n werden die k Eintrittspunkte nun nach ihren x-koordinaten mit einem Bucket-Sort sortiert, so wie dies bei der Ablaufplanung für Seite 2 der Fall war. Für die Berechnung der Voronoi-Domänen auf Seite 4 wird wieder eine Rahmenzelle z benötigt, die auf der Grenze zwischen zwei Voronoi-Domänen von Eintrittspunkten a und b liegt. Die Koordinaten a y und b y sind gleich null und z y ist gleich der Seitenlänge des Quadranten. Setzt man das in Gleichung (i) ein, erhält man die gesuchte Rahmenzelle z durch Auflösen der folgenden Gleichung zur x-koordinate z x. (a x z x ) 2 + zy 2 + a dw = (b x z x ) 2 + zy 2 + b dw Nun wird das gleiche Verfahren verwendet wie für Seite 2. Die Liste der Eintrittspunkte wird durchlaufen und die Voronoi-Domänen werden berechnet und in den darauffolgenden Runden aktualisiert. Dann weisen die Eintrittspunkte den Rahmenzelle in ihrer Voronoi-Domäne die Distanzwerte zu, bis alle Rahmenzellen einen Wert erhalten und alle Eintrittspunkte blockiert sind. Lemma 6. Sei Q ein n n Quadrant in einem Framed-Quadtree. Die Eintrittspunkte auf Seite 1 können in Zeit O(n) allen Rahmenzellen auf Seite 4 einen Distanzwert zuordnen. Die Zeit ist nicht abhängig von der Anzahl der Eintrittspunkte. Beweis. Es gibt maximal n Eintrittspunkte auf Seite 1, die den n Rahmenzellen auf Seite 4 einen Distanzwert zuordnen wollen. Die Voronoi-Domänen der Eintrittspunkte können in O(n) Zeit berechnet werden. Jeder Eintrittspunkt weist nur Rahmenzellen in seiner Voronoi- Domäne einen Distanzwert zu. Also ist die gesamte Laufzeit wie für Seite 2 O(n). Gesamter Quadrant Lemma 7. Sei Q ein n n Quadrant in einem Framed-Quadtree. Unabhängig von der Anzahl der Eintrittspunkte in Q benötigt die Wellenausbreitung über Q Laufzeit O(n).

185 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 177 Beweis. Wenn der Quadrant entweder eine oder vier Rahmenzellen besitzt, kann die Welle wie bereits oben beschrieben in konstanter Zeit ausgebreitet werden. Bei größeren Quadranten kann die Welle über die vier Seiten in linearer Zeit ausgebreitet werden (Lemmata 1, 4, 6). Während jeder Runde der Wellenausbreitung wird jede Seite eines Quadranten einmal als Seite 1 angesehen und die Wellenausbreitung von dieser Seite zu den vier Seiten durchgeführt. Den Rahmenzellen wird der kleinste der vier Werte zugewiesen. Hier ergibt sich also eine Laufzeit von O(4 n) = O(n). Die Korrektheit dieses Algorithmus kann genauso gezeigt werden wie bei Gitter-basierten Algorithmen. Der Beweis wird hier nicht durchgeführt. 2.4 Bestimmung des kürzesten Weges Während der Durchführung der Wellenausbreitung werden von den Eintrittspunkten den Rahmenzellen Distanzwerte zugewiesen. Sobald eine Rahmenzelle r ihren endgültigen Distanzwert von einem Eintrittspunkt e erhält, wird ein Zeiger von r auf e gesetzt. Wenn der Quadrant mit der Zielposition gefunden wird, können diese Zeiger zurück verfolgt werden. Dies ergibt einen kürzesten Weg vom Ziel zur Anfangsposition des Roboters. Wenn man diesen Weg umgekehrt, erhält man den kürzesten Weg vom Roboter zum Ziel. Theorem 1. Sei T ein Framed-Quadtree und T a T enthalte alle Quadranten, die Blätter des Baums sind und keine Hindernisse enthalten. Für einen Quadranten Q T a, sei u(q) der Umfang von Q. u(q) entspricht also der Anzahl an Rahmenzellen in Q. Das hier vorgestellte Verfahren berechnet einen kürzesten Weg in Laufzeit O(U) + O(T Nachbar ). Hierbei ist U = i T a u(i) und T Nachbar ist die Zeit zur Aktualisierung der Nachbar-Zeiger der Quadranten in T. Beweis. Die Welle breitet sich nur durch freie Quadranten aus und sobald ein Quadrant vollständig abgearbeitet wurde, wird er nicht noch einmal besucht. Durch jeden Quadrant kann laut Lemma 7 die Welle in linearer Zeit bezogen auf den Umfang des Quadranten ausgebreitet werden. Im schlimmsten Fall wird jeder freie Quadrant einmal besucht, weshalb sich der erste Summand in Abhängigkeit von der Summe des Umfangs aller Quadranten ergibt. Die Aktualisierung der Nachbar-Zeiger erfolgt durch Suche des entsprechenden Nachbarquadranten im Baum, woraus sich der zweite Summand ergibt. Dieser ist linear in der Auflösung des Framed-Quadtrees und in den meisten Fällen sogar konstant. Man kann U auch ansehen als die Gesamtanzahl von Rahmenzellen, die in allen freien Quadranten enthalten sind. 3 Zusammenfassung 3.1 Fazit Das hier vorgestellte Verfahren spielt seine Vorteile hauptsächlich in Umgebungen aus, in denen große, freie Bereiche vorhanden sind. In diesen Fällen ist es weitaus schneller, als Gitterbasierte Verfahren, die solche Bereiche nicht zusammenfassen können. In Gitter-basierten Verfahren kann der Roboter bei einer Bewegung von einer Gitterzelle zur nächsten auch nur aus acht verschiedenen Richtungen wählen. In dem hier gezeigten Verfahren werden in großen, freien Bereichen echte kürzeste Wege mit beliebigen Richtungen benutzt. Weitherhin besitzt es durch Einführung der neuen Datenstruktur Framed-Quadtree nicht den Nachteil,

186 178 Benjamin Eikel dass es den kürzesten Weg in einigen Fällen nicht findet, wie es bei anderen Quadtreebasierten Verfahren vorkommen kann. Es ist aber durch die aufwändigeren Verfahren zur Wellenausbreitung und Ablaufplanung rechenintensiver als einfache Quadtree-basierte Verfahren. Die Laufzeit in Abhängigkeit von der Anzahl an Rahmenzellen in allen Quadranten hat auch Nachteile. Falls die Hindernisse in der Umgebung so platziert sind, dass der Framed- Quadtree nur aus Quadranten kleinster Größe besteht, dann gibt es so viele Rahmenzellen wie es bei einem Gitter-basierten Verfahren Gitterzellen gäbe. Der Vorteil in der Laufzeit gegenüber Gitter-basierten Verfahren verschwindet dann und möglicherweise wird das Verfahren aufgrund des Verwaltungsaufwandes sogar langsamer als diese Verfahren. Das Verfahren wurde von den Autoren des zugrundeliegenden Artikels implementiert. Die Abbildungen 6 und 7 zeigen zwei Ergebnisse bei der Suche eines kürzesten Weges in einer Beispielumgebung. In der Umgebung in Abbildung 7 müsste ein Gitter-basiertes Verfahren ungefähr freie Gitterzellen durchsuchen und das Framed-Quadtree-Verfahren durchsucht hier nur etwa 4250 Rahmenzellen. Dies entspricht einer Ersparnis von etwa zwei Dritteln. 3.2 Ausblick Ein Vorteil des Framed-Quadtree-Verfahrens ist die Möglichkeit zur Erweiterung. Es können beispielsweise mehrere Ziele in die Umgebung eingefügt werden. Durch die Wellenausbreitung können mehrere Ziele erreicht werden, wenn das Verfahren nicht nach dem Erreichen des ersten Ziels angehalten wird. Sind alle oder eine vorgegebene Anzahl von Zielen gefunden worden, kann der Roboter anhand der Distanzwerte der Ziele, die für ihn die Kosten darstellen, um dieses Ziel zu erreichen, entscheiden, welches Ziel er anfährt. Hier könnten für die Ziele verschiedene Prioritäten gesetzt und anhand derer eine Entscheidung getroffen werden. Eine weitere Erweiterung ist die Verwendung des Verfahrens im dreidimensionalen Raum. Hierfür muss das dreidimensionale Pendant zum Quadtree, der Octree, zur neuen Datenstruktur Framed-Octree erweitert werden. Allerdings ist die Berechnung der Voronoi- Domänen schwieriger als im zweidimensionalen Raum. Literaturverzeichnis 1. Chen DZ, Szczerba RJ, Uhran, Jr. JJ (1997) A framed-quadtree approach for determining euclidean shortest paths in a 2-d environment. IEEE Transactions on Robotics and Automation 13(5): de Berg M, van Kreveld M, Overmars M, Schwarzkopf O (2000) Computational Geometry: Algorithms and Applications, Zweite Ausgabe. Springer-Verlag, Berlin Heidelberg New York 3. Cormen TH, Leiserson CE, Rivest RL, Stein C (2001) Introduction to algorithms, Zweite Ausgabe. MIT Press, Cambridge, Massachusetts

187 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 179 Abb. 6. Framed-Quadtree mit einer Auflösung von und zufälligen Hindernissen. Die schwarze Linie zeigt den stückweise kürzesten Pfad. Abbildung übernommen aus [1]. Abb. 7. Framed-Quadtree mit einer Auflösung von und zufälligen Hindernissen. Die schwarze Linie zeigt den stückweise kürzesten Pfad. Abbildung übernommen aus [1].

188

189 Konstruktion von geometrischen Spannern mit geringem Durchmesser Philipp Wissneth Universität Paderborn Zusammenfassung. Geometrische Spanner werden zur Approximation vollständiger euklidischer Graphen eingesetzt. Es handelt sich hierbei um Graphen, deren Knotenmenge einer Punktmenge im R d entspricht und deren Kanten so definiert sind, dass der kürzeste Pfad zwischen zwei Knoten p und q höchstens um einen konstanten Faktor größer ist als der euklidische Abstand zwischen den beiden Punkten. Der Durchmesser eines Spanners ist definiert als die maximale Anzahl Kanten über alle Pfade mit minimaler Anzahl Kanten von jedem beliebigen Punkt p zu jedem beliebigen Punkt q. In dieser Arbeit wird eine randomisierte Datenstruktur für einen geometrischen Spanner vorgestellt, welche, bezogen auf eine Menge von n Punkten, mit hoher Wahrscheinlichkeit einen Durchmesser von O(log n) hat. Des Weiteren wird ein Algorithmus zur Beantwortung von Pfadanfragen auf dieser Datenstruktur vorgestellt und analysiert. 1 Einleitung Grundlagen Grundlegende Definitionen Θ-Graphen Algorithmische Konstruktion von Θ-Graphen Bemerkungen Der Skip List Spanner Konstruktion des Skip List Spanners Ein Algorithmus zur Konstruktion von t-spanner Pfaden Zusammenfassung Literaturverzeichnis Einleitung Geometrische Spanner dienen der Approximation vollständiger euklidischer Graphen. Dabei soll sich die Summe der einzelnen euklidischen Abstände der Kanten in einem Pfad von einem Punkt p zu einem Punkt q höchstens um einen konstanten Faktor gegenüber dem euklidischen Abstand zwischen p und q unterscheiden. In dieser Ausarbeitung wird eine randomisierte Datenstruktur vorgestellt, welche mit hoher Wahrscheinlichkeit einen geringen Durchmesser besitzt. D.h., die Anzahl der Kanten in einem Pfad von einem beliebigen Punkt p zu einem beliebigen Punkt q soll möglichst gering sein ohne dabei die Spannereigenschaft zu verletzen. Des Weiteren wird ein Algorithmus vorgestellt, mit dessen Hilfe es

190 182 Philipp Wissneth möglich ist, einen Pfad zwischen zwei beliebigen Punkten in der vorgestellten Datenstruktur zu bestimmen. Sowohl die Datenstruktur als auch der Algorithmus wurden von Arya, Mount und Smid in [4] eingeführt. Zur effizienten Konstruktion solcher Datenstrukturen wird eine Technik vorgestellt, welche auf der Beantwortung von orthogonalen Bereichsanfragen basiert. 2 Grundlagen In diesem Kapitel werden für die Konstruktion des Algorithmus zur Beantwortung von Pfadanfragen nötige Datenstrukturen vorgestellt. Zunächst werden der Begriff t-spanner definiert und einige Eigenschaften von Spannern vorgestellt. Im Anschluss wird eine zur Konstruktion von t-spannern eingesetzte Datenstruktur, der Θ-Graph, eingeführt. Zur effizienten Konstruktion von Θ-Graphen wird eine Datenstruktur zur Beantwortung orthogonaler Bereichsanfragen verwendet. 2.1 Grundlegende Definitionen Sei S eine Menge von n Punkten im R d. Bei einem euklidischen Graphen für S entspricht die Knotenmenge der Menge S. Eine Kante eines solchen Graphen ist definiert als (p, q) : p, q S. Das Gewicht einer Kante (p, q) ist definiert als der euklidische Abstand zwischen den Punkten p und q. Sei E die Kantenmenge eines Graphen G. Für ein t > 1 ist der Graph G = (S, E) ein t-spanner, wenn für jedes Paar von Punkten p, q S ein Pfad von p nach q existiert, dessen Gewicht höchstens um den Faktor t größer ist als der euklidische Abstand zwischen p und q. Für einen t-spanner kann eine Pfadanfrage für ein Paar von Punkten (p, q) S gestellt werden. Das Resultat einer solchen Anfrage wird dann als t-spanner Pfad von p nach q bezeichnet. Der Durchmesser D eines t-spanners bezeichnet die maximale Pfadlänge über alle Pfade von jedem beliebigen Punkt p zu jedem beliebigen Punkt q, deren Anzahl der Kanten im t-spanner-pfad minimal ist. Der euklidische Abstand zwischen zwei Punkten p und q im R d wird im folgenden Text mit pq bezeichnet. 2.2 Θ-Graphen Eine Form von t-spannern sind die sogennannten Θ-Graphen. Die Idee bei der Konstruktion von Θ-Graphen besteht darin, ausgehend von einem Punkt p zunächst eine Kante zu einem Knoten zu wählen, welcher sich grob in der Richtung des Zielknotens q befindet. Dafür wird der Raum R d durch Kegel in mehrere Sektionen aufgeteilt. Ein Kegel ist definiert als die Schnittmenge von d Halbräumen im R d. Die einzelnen Halbräume werden jeweils durch eine Hyperebene begrenzt, welche sich in einer allgemeinen Lage befindet. Der Punkt, an dem sich sämtliche Halbräume schneiden ist definiert als die Kegelspitze. Zur Veranschaulichung dienen hier R 2 und R 3 : Im R 2 entspricht eine Hyperebene einer Geraden. Die von der Geraden abgegrenzte Ebene entspricht nun einem Halbraum

191 Konstruktion von geometrischen Spannern mit geringem Durchmesser 183 (in diesem Spezialfall auch Halbebene genannt). Im R 3 entspricht eine Hyperebene einer Ebene. Der von der Ebene abgegrenzte Raum entspricht einem Halbraum. Der Winkel Θ (0 < Θ < π) legt fest, in welchem Winkel die d Halbräume zueinander stehen. Da sich die einzelnen Halbräume in einem gemeinsamen Punkt schneiden, entsteht ein geometrisches Konstrukt in Form eines Kegels. Die Menge C sei definiert als eine Sammlung von Kegeln, welche ihren Ursprung im Koordinatenursprung haben, dessen Kegel einen Winkel von Θ besitzen und den R d abdecken. In [8] wird gezeigt, wie eine solche Menge C, bestehend aus O((c/Θ) d 1 ) Kegeln, für eine geeignete Konstante c konstruiert werden kann. Jeder Kegel besitzt einen Strahl l C, welcher vom Ursprung des Kegels ausgeht und sich innerhalb des Kegels befindet. Dabei darf sich l C irgendwo im Kegel befinden (in den folgenden Zeichnungen wurde die Winkelhalbierende gewählt). Ein verschobener Kegel C p ist definiert als der Kegel C, dessen Ausgangspunkt vom Koordinatenursprung zum Punkt p verschoben wurde. Formal kann C p wie folgt beschrieben werden: C p := C +p := {x+p : x C}. Abbildung 1 zeigt zwei Kegel im R 2. Einer hat seinen Ausgangspunkt im Koordinatenursprung, der zweite Kegel ist um den Punkt p verschoben worden. Analog hierzu wird der verschobene Strahl l C,p definiert. Der Strahl l C,p hat seinen Ursprung im Punkt p und entspricht dem um den Punkt p verschobenen Strahl l C. l C,p l C p 0 0 Abb. 1. Ein Kegel mit Ausgangspunkt im Koordinatenursprung inklusive Strahl l C und ein zugehöriger, um den Punkt p verschobener Kegel (d = 2). Definition 1 (Θ-Graph [1]). Sei k 2 ein ganzzahliger Wert und Θ = 2π/k. S sei eine Menge von Punkten im R d. Der gerichtete Graph Θ(S, k) ist wie folgt definiert. 1. Die Knoten von Θ(S, k) sind die Punkte in S. 2. p S und C C, sodass in dem verschobenen Kegel C p Punkte aus S\{p} enthalten sind, existiert eine Kante von p zu einem Punkt r in C p S\{p}, dessen orthogonale Projektion auf den Strahl l C,p dem Punkt p am nächsten ist. Existieren mehrere solcher Punkte, wird ein beliebiger Punkt gewählt. Abbildung 2 illustriert die Auswahl einer Kante (p, r) in einem Kegel C p. Für den Θ- Graph lässt sich folgendes Lemma definieren:

192 184 Philipp Wissneth l C,p r p Abb. 2. Ein Kegel mit Ausgangspunkt p und Strahl l C,p (d = 2). In einem Θ-Graphen wird für diesen Kegel die Kante (p, r) hinzugefügt, da die orthogonale Projektion auf l C,p am nächsten zu p ist. Lemma 1. Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und sei S eine Menge bestehend aus n Punkten im R d. Dann ist der Graph Θ(S, k) ein t-spanner für t = 1/(cos Θ sin Θ). Der Graph enthält O((c/Θ) d 1 n) Kanten für eine Konstante c. Die Anzahl der Kanten ergibt sich daraus, dass in jedem der n Punkte p S für alle Kegel (welche O((c/Θ) d 1 ) betragen) eine Kante bestimmt wird. Ein Beweis für die Bestimmung von t folgt in Kapitel Algorithmische Konstruktion von Θ-Graphen Der folgende Abschnitt befasst sich mit der algorithmischen Konstruktion von Θ-Graphen. Arya, Mount und Smid beschreiben in [4] eine Datenstruktur, mit welcher sich der Graph Θ(S, k) in Zeit O(n log d 1 n) und einem Speicherbedarf von O(n log d 2 n) erstellen lässt. Vor der eigentlichen Konstruktion werden einige Notationen eingeführt: Sei C ein Kegel aus C. Es seien h 1, h 2,..., h d die Hyperebenen, welche die Halbräume begrenzen, die C definieren. H 1, H 2,..., H d seien Linien durch den Koordinatenursprung, so dass jedes H i (1 i d) jeweils orthogonal zu h i ist. H i ist so gerichtet, dass H i in die Richtung zeigt, in welche sich der Kegel C ausbreitet. Des Weiteren ist L definiert als die Linie, welche den Strahl l C enthält und ebenfalls durch den Koordinatenursprung geht. Für einen beliebigen Punkt p im R d seien im Folgenden seine Koordinaten in Bezug auf die entsprechende Achse mit p 1, p 2,..., p d gekennzeichnet. Der Wert von p i mit 1 i d kennzeichne den vorzeichenbehafteten euklidischen Abstand zwischen dem Koordinatenursprung und der orthogonalen Projektion von p auf H i. Das Vorzeichen wird dadurch bestimmt, ob sich die entsprechende Projektion in Bezug zur Richtung von H i rechts oder links vom Koordinatenursprung befindet. Analog hierzu bezeichne p d+1 den vorzeichenbehafteten euklidischen Abstand zwischen dem Koordinatenursprung und der orthogonalen Projektion von p auf L. Abbildung 3 verdeutlicht diesen Zusammenhang für d = 2. Sei nun angenommen, dass p ein Punkt in S ist. Bei der Berechnung des Graphen Θ(S, k) muss eine Kante ausgehend von p zu einem Punkt q in C p mit minimalem Abstand in Bezug zur orthogonalen Projektion von q auf l C,p gefunden werden. Dies ist äquivalent zum Bestimmen eines Punktes q S\{p}, sodass aus allen 1 i d mit q i p i ein Punkt mit minimaler q d+1 -Koordinate gefunden wird. Die Datenstruktur, auf dessen Basis dieser Punkt bestimmt wird, ist eine erweiterte Version eines Bereichsbaumes (vgl. [5]). Sie ist wie folgt aufgebaut: Auf oberster Ebene

193 Konstruktion von geometrischen Spannern mit geringem Durchmesser 185 H 1 p' 2 h 1 + p L 0 p l C,p H 2 p' 1 h 2 + p Abb. 3. Die Linien H i sind orthogonal zu h i (1 i d). Die gestrichelten Linien kennzeichnen die orthogonale Projektion des Punktes p auf die Linien H i (d = 2). existiert ein balancierter binärer Suchbaum in dessen Blättern die Punkte aus S gespeichert sind. Diese Punkte sind nach ihren q 1 -Koordinaten sortiert. Für jeden Knoten v dieses Baumes sei S v die Teilmenge aus S, welche in dem Teilbaum unter v gespeichert ist. Jeder Knoten v enthält nun einen Zeiger auf die Wurzel eines sortierten binären Suchbaumes über S v, welcher in seinen Blättern nach seinen q 2 -Koordinaten sortiert ist. Sämtliche Knoten dieses Baumes enthalten wiederum einen Zeiger auf sortierte binäre Suchbäume, welche in ihren Blättern nach ihrer q 3 -Koordinate sortiert sind usw. Diese rekursive Konstruktion wird bis zu Suchbäumen, welche nach ihrer q d -Koordinate sortiert sind, fortgesetzt. Ein Baum, welcher in seinen Blättern q i -Koordinaten enthält, wird im Folgenden als Baum der Ebene i bezeichnet. Zusätzlich zu dem in einem Knoten u eines Baumes der Ebene d gespeicherten Suchintervall wird dort eine weitere Information gespeichert. Es handelt sich hierbei um den Punkt, welcher in Bezug auf die in den Blättern des von u gespeicherten Teilbaumes enthaltene Teilmenge von S eine minimale q d+1 -Koordinate besitzt. Sobald diese Datenstruktur konstruiert wurde, ist es möglich, die entsprechenden Kanten von Θ(S, k) zu bestimmen. Für einen beliebigen Punkt p R d wird eine entsprechende Menge von Knoten aus Bäumen der Ebene d berechnet, sodass alle Teilmengen von S, welche in den Teilbäumen dieser Knoten gespeichert sind, der Menge der Punkte innerhalb des Kegels C p entsprechen. In der vorgestellten Datenstruktur müssen also sämtliche Punkte q S\{p} bestimmt werden, bei denen für alle 1 i d die Eigenschaft q i p i gilt. Diese Menge von Punkten kann durch eine orthogonale Bereichsanfrage bestimmt werden (siehe [5]). Die Bestimmung der Kante in C p zur Berechnung von Θ(S, k) erweist sich nun als besonders leicht: Für jeden der eben bestimmten Knoten u S, welcher die Wurzel eines Teilbaumes der Ebene d ist, wurde ein Knoten q u gespeichert, dessen q u,d+1 -Koordinate im jeweiligen Teilbaum minimal ist. Sei nun q derjenige Knoten aus allen bestimmten Knoten u, welcher den minimalen Wert für q u,d+1 besitzt. Folglich ist (p, q) eine Kante von Θ(S, k). Bis auf die Bestimmung der minimalen Werte für q d+1 entspricht die vorgestellte Datenstruktur der eines Bereichsbaumes. Bereichsbäume haben einen Speichplatzbedarf von O(n log d 1 n) und können in Zeit O(n log d 1 n) erstellt werden. Die Bestimmung des Punktes eines Teilbaumes mit minimalem Wert für die q d+1 -Koordinate kann mit Hilfe einer

194 186 Philipp Wissneth Bottom-Up Prozedur geschehen. Hier wird ausgehend von den Blättern eines Baumes der Ebene d die Bezeichnung des Knotens mit minimaler q d+1 -Koordinate nach oben propagiert. Auf Basis der Eigenschaften von Bereichsbäumen (vgl. [5] oder [6]) kann folgendes Lemma definiert werden: Lemma 2 (vgl. [4]). Sei S eine Menge von n Punkten im R d und sei C ein Kegel aus C. Die oben beschriebene Datenstruktur hat eine Größe von O(n log d 1 n) und kann in Zeit O(n log d 1 n) erstellt werden. Die Zeit zum Einfügen oder Löschen eines Punktes in bzw. aus dieser Datenstruktur beträgt O(log d n). Zu jedem Punkt p R d kann in Zeit O(log d n) ein Punkt q in C p S\{p} bestimmt werden, dessen q d+1 -Koordinate minimal ist, beziehungsweise festgestellt werden, dass kein solcher Punkt existiert. Es muss beachtet werden, dass sich die gezeigte Datenstruktur ausschließlich auf einen einzigen Kegel C aus C bezieht. Es lassen sich also die Kanten für sämtliche verschobenen Kegel C p, welche auf C basieren, berechnen. Dies kann in Zeit O(n log d n) geschehen. Dieser Wert ergibt sich daraus, dass für die Berechnung einer Kante mit minimaler q d+1 -Koordinate für einen bestimmten Kegel C p (wobei p S) die erstellte Datenstruktur mit dem Punkt p befragt wird. Dies kann in Zeit O(log d n) geschehen (vgl. Lemma 2). Will man die Kanten sämtlicher Kegel C p erhalten, muss die erstellte Datenstruktur mit sämtlichen Punkten aus S, ( S = n) befragt werden. Es muss also n mal eine Anfrage auf die erstellte Datenstruktur gestartet werden. Die Laufzeit beträgt folglich O(n log d n) (das Erstellen der Datenstruktur benötigt O(n log d 1 n) Zeit und ist somit in der O-Notation enthalten). Bei der Konstruktion des Θ-Graphen lässt sich sowohl beim Speicherplatzbedarf als auch bei der Laufzeit ein Faktor von log n einsparen. Dies wird dadurch möglich, dass bereits a priori sämtliche Punkte bekannt sind, mit denen die erstellte Datenstruktur befragt wird: Alle Punkte aus S. Die Punkte aus S werden nun der Reihe nach absteigend nach ihrer p 1-Koordinate sortiert. Die Berechnung der einzelnen Kanten in den verschobenen Kegeln erfolgt nun entsprechend dieser Liste von p 1-Koordinaten in absteigender Reihenfolge. Wie bereits oben gezeigt, wird auch hier für jeden Kegel C C ein erweiterter Bereichsbaum konstruiert. Allerdings geschieht dies hier lediglich für die Koordinaten p 2,..., p d+1. Es wird also die Datenstruktur aus Lemma 2 für Dimension d 1 angewandt. Um sicherzustellen, dass bei einer Anfrage für einen Punkt p ausschließlich Punkte r S mit einer r 1 -Koordinate betrachtet werden, welche größer oder gleich p 1 sind, werden in den Bereichsbaum nur die Punkte eingefügt, welche in der zuvor konstruierten Liste über dem aktuell betrachteten Punkt p liegen. Durch eine Anfrage der Datenstruktur für jeden Punkt p wird nun ein Punkt q bestimmt, bei dem für alle 2 i d die Eigenschaft q i p i gilt und q d+1 minimal ist. Des Weiteren ist sichergestellt, dass die Datenstruktur zu diesem Zeitpunkt nur Punkte r aus S enthält, deren Koordinate r 1 größer oder gleich p 1 ist. Daraus folgt, dass die Eigenschaft q i p i für alle 1 i d gilt und q d+1 minimal ist. Nachdem für die Anfrage mit Punkt p ein passender Punkt q bestimmt wurde, wird p bezüglich seiner Koordinaten (p 2,..., p d+1 ) in den erweiterten Bereichsbaum eingefügt und es kann die Anfrage für den nächsten Punkt aus der nach p 1-Koordinaten sortierten Liste von Punkten aus S gestartet werden. Da das Einfügen von Punkten in den erweiterten Bereichsbaum Zeit O(log d 1 n) benötigt und dies für alle n Punkte aus S durchgeführt wird, ergibt zusätzlich zum Konstruieren des erweiterten Bereichsbaumes für die Dimension d 1 ein Zeitbedarf von O(n log d 1 n). Gemäß

195 Konstruktion von geometrischen Spannern mit geringem Durchmesser 187 Lemma 2 wird für die Konstruktion eines erweiterten Bereichsbaumes für die Dimension d 1 Zeit O(n log d 2 n) benötigt. Die benötigte Zeit zur Bestimmung sämtlicher Kanten der verschobenen Kegel C p zu einem Kegel C C ist also durch O(n log d 1 n) beschränkt. Um Θ(S, k) vollständig zu berechnen, müssen für sämtliche Kegel C C die Kanten der verschobenen Kegel C p bestimmt werden. Aus Lemma 1 geht hervor, dass Θ(S, k) O((c/Θ) d 1 n) Kanten enthält. Das bedeutet insbesondere, dass für die Konstruktion ein Speicherplatz von O((c/Θ) d 1 n + n log d 2 n) benötigt wird, also dem Platz zum Speichern der berechneten Kanten und dem Platz zum Speichern der einzelnen erweiterten Bereichsbäume. Ferner beträgt die Anzahl der Kegel C C O((c/Θ) d 1 ). Daraus ergibt sich eine Laufzeit von O((c/Θ) d 1 n log d 1 n) zur Konstruktion des Graphen Θ(S, k). Die Ergebnisse zum Graph Θ(S, k) und seiner algorithmischen Konstruktion werden wie folgt zusammengefasst: Theorem 1 (vgl. Theorem 5 in [4]). Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und S eine Menge von n Punkten im R d. Der Graph Θ(S, k) ist ein t-spanner für t = 1/(cos Θ sin Θ). Er enthält O((c/Θ) d 1 n) Kanten für eine Konstante c. Unter einem Speicherplatzverbrauch von O((c/Θ) d 1 n + n log d 2 n) kann der Graph in Zeit O((c/Θ) d 1 n log d 1 n) konstruiert werden. 2.4 Bemerkungen Die hier eingeführten Θ-Graphen dienen als Grundlage für die im folgenden Kapitel vorgestellte Technik zur Konstruktion von t-spannern mit geringem Durchmesser. Des Weiteren wird in Kapitel 3 auf das folgende Lemma zurückgegriffen. Ein entsprechender Beweis ist in [3] zu finden. Lemma 3. Sei k > 8 ein ganzzahliger Wert und Θ = 2π/k. Ferner seien p und q beliebige disjunkte Punkte im R d und C sei ein Kegel aus C, sodass q C p. Sei r ein beliebiger Punkt im R d C p, sodass die orthogonale Projektion von r auf den Strahl l C,p mindestens so nah zu p ist wie die orthogonale Projektion von q auf l c,p. Es gilt 1. pr cos Θ pq, und 2. rq pq (cos Θ sin Θ) pr. Außerdem wird bei der Konstruktion der im nächsten Kapitel eingeführten Datenstruktur auf das Konzept von Skip Listen (vgl. [2]) zurückgegriffen, weshalb an dieser Stelle kurz deren Eigenschaften wiederholt werden sollen: Skip Listen sind eine randomisierte Datenstruktur zur effizienten Suche auf geordneten Mengen. Die Datenstruktur besteht aus n Listen, welche sich in verschiedenen Ebenen befinden. In der Liste der Ebene 1 befinden sich alle Elemente. Es wird per Münzwurf bestimmt, ob sich ein Element einer Liste der Ebene i in der übergeordneten Liste i + 1 befindet. Da es sich hierbei um einen fairen Münzwurf handelt, ist zu erwarten, dass die Anzahl der Elemente einer Liste der Ebene i + 1 halb so groß ist wie die Anzahl der Elemente der darunter liegenden Liste der Ebene i. Elemente, welche in mehreren Listen auftreten besitzen einen Zeiger zu ihren Vorkommen in der jeweils höheren bzw. niedrigeren Ebene. Die Anzahl der zu erwartenden Ebenen beträgt O(log n).

196 188 Philipp Wissneth 3 Der Skip List Spanner Ziel dieses Kapitels ist die Vorstellung und Analyse eines t-spanners, welcher einen möglichst geringen Durchmesser hat. Arya, Mount und Smid führen in [4] einen t-spanner ein, dessen Durchmesser mit hoher Wahrscheinlichkeit O(log n) beträgt. Der vorgestellte Spanner basiert auf der Kombination von den bereits im vorhergegangenen Kapitel eingeführten Θ-Graphen und Skip-Listen. 3.1 Konstruktion des Skip List Spanners Bevor eine entsprechende Datenstruktur angegeben werden kann, werden zunächst aus der Menge S der Punkte im R d entsprechende Teilmengen gebildet. Es sei S 1 = S. Für ein i > 1 wird die Menge S i wie folgt ermittelt: Für jeden Punkt aus S i 1 wird ein fairer Münzwurf ausgeführt. Jeder Punkt, für den der Münzwurf mit dem Ergebnis Kopf ausgegangen ist, ist Bestandteil der Teilmenge S i. Die Konstruktion der Teilmengen ist dann beendet, wenn für eine Menge S i ausschließlich das Ergenis Zahl geworfen wurde, also S i =. Mit h sei die Anzahl der Iterationen für diese Konstruktion gekennzeichnet. Es besteht also folgende Beziehung zwischen den einzelnen Teilmengen von S: = S h+1 S h S h 1 S h 2 S 2 S 1 = S Die im Folgenden definierte Datenstruktur basiert auf den oben erstellten Mengen S i. Definition 2 (Skip List Spanner [4]). Sei k 2 ein ganzzahliger Wert und Θ = 2π/k. Sei S eine Menge von n Punkten im R d. S i, 1 i h seien die oben durch den fairen Münzwurf konstruierten Teilmengen von S. Der Skip List Spanner, SLS(S, k) ist wie folgt definiert. 1. Für jedes 1 i h existiert eine Liste L i, welche die Punkte aus S i beinhaltet (in beliebiger Reihenfolge). 2. Für jedes 1 i h existiert ein Graph Θ(S i, k). 3. Für jedes 1 i h existiert der umgekehrte Graph Θ (S i, k), welcher durch die Umkehrung der Kantenrichtung in Θ(S i, k) erhalten wird. 4. Für jedes 1 < i h enthält jedes p S i einen Zeiger von seinem Auftreten in L i zum in L i 1 korrespondierenden Auftreten von p. 5. Für jedes 1 i < h enthält jedes p S i+1 einen Zeiger von seinem Auftreten in L i zum in L i+1 korrespondierenden Auftreten von p. Lemma 4. Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und sei S eine Menge von n Punkten im R d. Der Skip List Spanner SLS(S, k) ist ein t-spanner für t = 1/(cos Θ sin Θ). Er enthält O((c/Θ) d 1 n) Kanten für eine Konstante c. Ferner kann dieser Graph mit hoher Wahrscheinlichkeit in Zeit O((c/Θ) d 1 n log d 1 n) mit einem Speicherplatzbedarf von O((c/Θ) d 1 n + n log d 2 n) konstruiert werden. Beweis. Da der Skip List Spanner SLS(S, k) insbesondere den Graphen Θ(S 1, k) = Θ(S, k) enthält, ist er nach Theorem 1 ein t-spanner für t = 1/(cos Θ sin Θ). Die Anzahl der Kanten in Θ(S, k) ist begrenzt durch O((c/Θ) d 1 n). Daraus folgt, dass die Anzahl der Kanten in SLS(S, k) durch O( h i=1 (c/θ)d 1 S i ) begrenzt ist.

197 Konstruktion von geometrischen Spannern mit geringem Durchmesser 189 Da die Mengen S i durch einen fairen Münzwurf bestimmt wurden, wissen wir, dass ein Punkt aus der Menge S i 1 mit einer Wahrscheinlichkeit von 1/2 in der Menge S i enthalten ist. Die erwartete Anzahl an Punkten in S i beträgt folglich (1/2) S i 1. Aufgrund dieser Beobachtung kann die Gesamtzahl aller Punkte in SLS(S, k) über eine geometrische Reihe der Form h 1 k=0 n( 1 2 )k berechnet werden, deren Grenzwert lim i i k=0 n( 1 2 )k 1 = n 1 (1/2) = 2n beträgt. Setzt man nun für die Anzahl der Punkte in SLS(S, k) den Wert 2n ein, so beträgt die Anzahl der Kanten in SLS(S, k) mit hoher Wahrscheinlichkeit O((c/Θ) d 1 n). Sollte die Anzahl der Kanten wider Erwarten größer ausfallen, wird die Konstruktion des Skip List Spanners so oft wiederholt, bis die Anzahl der Kanten O((c/Θ) d 1 n) beträgt. Die Schranken für die Konstruktionszeit und den Speicherplatzbedarf werden analog zu der oben gezeigten Schranke für die Anzahl der Kanten bestimmt. 3.2 Ein Algorithmus zur Konstruktion von t-spanner Pfaden Der Skip List Spanner stellt die für die Konstruktion von t-spanner Pfaden grundlegende Datenstruktur dar. Im Folgenden wird der Algorithmus skizziert, welcher einen Pfad von einem Punkt p zu einem Punkt q konstruiert. Dass es prinzipiell möglich ist, t-spanner Pfade im SLS(S, k) zu berechnen, wurde bereits dadurch gezeigt, dass der Skip List Spanner den Θ-Graphen Θ(S, k) enthält. Um die Anzahl der Kanten jedoch zu reduzieren, wird wie folgt vorgegangen: Gestartet wird der Algorithmus bei dem Punkt x = p. Zuerst wird gepüft, ob sich der Punkt x auf Ebene 2 (also in der Menge S 2 ) befindet. Ist dem nicht der Fall, wird nun in Ebene 1 eine Kante berechnet, welche sich in grober Richtung zu Punkt q befindet. Um dies zu erreichen, wird der Kegel C aus C so bestimmt, dass q C x (was bedeutet, dass sich q im verschobenen Kegel C x befindet). Nun sei x ein Punkt aus C x S 1 (also allen Punkten aus der Menge S 1, die sich im verschobenen Kegel C x befinden), welcher zusammen mit x eine Kante (x, x ) im Θ-Graphen Θ(S 1, k) ist. x wird nun ein Punkt auf dem Pfad von p zu q. Für den weiteren Verlauf wird x := x gesetzt. Der Punkt x kennzeichnet also immer den zuletzt hinzugefügten Punkt eines zu berechnenden Pfades von p zu q. Der Pfad wird auf diese Weise solange erweitert bis x = q gilt oder x in der zweiten Ebene des Skip List Spanners enthalten ist (x S 2 ). Sollte x in der zweiten Ebene vorkommen, wird gestartet, einen Pfad von Punkt q zu x zu konstruieren. Der Pfad dorthin wird analog zu dem oben beschriebenen Pfad von p zu x konstruiert: Der zuletzt zum Pfad hinzugefügte Punkt sei hier mit y gekennzeichnet. Der Pfad wird solange erweitert, bis y einem Punkt des bereits konstruierten Pfades von p nach x entspricht oder y in Ebene 2 des Skip List Spanners enthalten ist (y S 2 ). Sollte y einem Punkt p des Pfades von p nach x entsprechen, so wird der Pfad von p nach p gefolgt vom umgekehrten Pfad von q nach p ausgegeben. Der Pfad von p nach p ist in Θ(S 1, k) und der Pfad von q nach p ist in Θ (S 1, k) enthalten. Beide Θ-Graphen sind in SLS(S, k) enthalten. Befindet sich y hingegen auf Ebene 2 des Skip List Spanners, wird mit dem selben Vorgehen ausgehend von Ebene 2, ein Pfad von x nach y berechnet usw. Der in [4] vorgestellte formale Algorithmus entspricht dem hier gezeigten Algorithmus 19.

198 190 Philipp Wissneth Algorithmus 19 walk(p, q) p 0 := p; q 0 := q; a := 0; b := 0; r := 0; s := 0; i := 1; /* p 0 = p, p 1,..., p r,..., p a und q 0 = q, q 1,..., q s,..., q b sind Pfade in SLS(S, k), r = min{j : p j S i}, s = min{j : q j S i} und p r, p r+1,..., p a, q s, q s+1,..., q b S i */ stop := false; while stop = false do while p a q b und p a / S i+1 do C := Kegel aus C, sodass q b C pa ; p a+1 := Punkt aus C pa S i sodass (p a, p a+1) eine Kante aus Θ(S i, k) ist; a := a + 1; /* p a = q b oder p a S i+1 */ while q b / {p r, p r+1,..., p a} und q b / S i+1 do C := Kegel aus C, sodass p a C qb ; q b+1 := Punkt aus C qb S i sodass (q b, q b+1 ) eine Kante aus Θ (S i, k) ist; b := b + 1; /* q b {p r, p r+1,..., p a} oder p a und q b treten in S i+1 auf */ if q b {p r, p r+1,..., p a} then l := Index, sodass q b = p l ; Pfad p 0, p 1,..., p l, q b 1, q b 2,..., q 0 ausgeben; stop := true; else i := i + 1; r := a; s := b; Lemma 5. Sei k > 8 und Θ = 2π/k. Für jedes Paar von Punkten p und q aus S konstruiert der Algorithmus walk(p, q) im SLS(S, k) einen t-spanner Pfad von p nach q für ein t = 1/(cos Θ sin Θ). Beweis. Der Beweis zu Lemma 5 geschieht durch Induktion über die Anzahl der Ebenen des Skip List Spanners. Für den Induktionsanfang wird angenommen, dass der Skip List Spanner SLS(S, k) aus lediglich einer Ebene besteht. Dabei wird das Verhalten während der ersten Iteration der äußeren While-Schleife beobachtet (Eine zweite Iteration wäre in diesem Fall ohnehin nicht möglich, da dort Kanten der Ebene 2 berechnet werden würden, welche logischerweise nicht existieren können). q l C,pa p a+1 p a Abb. 4. Nach Definition des Θ-Graphen muss die Projektion von p a+1 auf den Strahl l C,pa nah an p a sein wie die Projektion von q auf l C,pa (d = 2). mindestens so In der ersten inneren While-Schliefe wird ein Pfad, beginnend mit p = p 0, p 1, p 2,... konstruiert. Die Berechnung des Pfades wird beendet, sobald der zuletzt hinzugefügte Punkt dem Punkt q entspricht. Wir betrachten nun für a 0 die Punkte p a und p a+1. Da p a einen

199 Konstruktion von geometrischen Spannern mit geringem Durchmesser 191 Nachfolger (p a+1 ) besitzt, ist klar, dass p a q gilt. Sei nun C der Kegel, sodass q im verschobenen Kegel C pa enthalten ist. Laut Algorithmus ist p a+1 C pa und (p a, p a+1 ) eine Kante von Θ(S 1, k) und damit auch eine Kante von SLS(S, k). Des Weiteren gilt laut Definition des Θ-Graphen, dass die Projektion von p a+1 auf den Strahl l C,pa mindestens so nah an p a sein muss wie die Projektion von q auf l C,pa. Abbildung 4 verdeutlicht diesen Zusammenhang. Nach Lemma 3 gilt p a+1 q p a q (cos Θ sin Θ) p a p a+1. (1) Durch die Monotonieeigenschaften der Cosinus- und Sinusfunktion im Intervall [0, π 4 ) folgt p a+1 q < p a q, (2) womit gezeigt ist, dass bei jeder Iteration der ersten inneren While-Schleife der Abstand zwischen den Punkten p a und q kleiner wird und die Schleife terminiert. Wird angenommen, dass z die Anzahl der durchgeführten Iterationen ist, wurde durch den Algorithmus ein Pfad der Form p = p 0, p 1, p 2,..., p z = q konstruiert. Die zweite innere While-Schleife wird nicht ausgeführt, da q b = p z = q Element des konstruierten Pfades ist und so die Abbruchbedingung der Schleife zutrifft. Der Algorithmus terminiert und gibt den konstruierten Pfad von p nach q aus. Um eine Gewichtsbeschränkung des konstruierten Pfades zu erhalten, wird zunächst die Ungleichung (1) umgeformt zu p a p a+1 1 cos Θ sin Θ ( p aq p a+1 q ) = t( p a q p a+1 q ) (3) Das Gewicht des ausgegebenen Pfades ist die Summe der Gewichte der einzelnen Kanten. Unter Zuhilfenahme von (3) kann nun eine Gewichtsbeschränkung des konstruierten Pfades bestimmt werden: z 1 z 1 p a p a+1 t ( p a q p a+1 q ) (4) a=0 Durch Auflösen der Teleskopsumme auf der rechten Seite erhält man a=0 z 1 p a p a+1 t( p 0 q p z q ) = t pq, (5) a=0 womit gezeigt ist, dass der Algorithmus für einen Skip List Spanner SLS(S, k) mit einer Ebene einen t-spanner Pfad von p nach q konstruiert. Der Induktionsanfang ist bewiesen. Ferner konnte hier der in Lemma 1 genannte Wert für t bewiesen werden. Im Folgenden wird ein Skip List Spanner mit h Ebenen betrachtet, wobei h > 1. Wir nehmen an, dass das Lemma 5 für alle Skip List Spanner mit weniger als h Ebenen gilt. Während der ersten Iteration der äußeren While-Schleife wird in der ersten inneren While-Schleife ein Pfad der Form p = p 0, p 1, p 2,..., p z konstruiert. Der Punkt p z entspricht

200 192 Philipp Wissneth entweder dem gesuchten Punkt q (p z = q) oder er ist in der Menge S 2 enthalten und damit Element der zweiten Ebene des Skip List Spanners (p z S 2 ). Offensichtlich gilt die Ungleichung (2) auch hier. Für den Fall, dass p z = q gilt, wird der Algorithmus den konstruierten Pfad ausgeben und terminieren. Der Beweis, dass es sich bei der Ausgabe um einen t-spanner Pfad handelt, ist exakt derselbe wie bereits im Induktionsanfang gezeigt. Für den Fall, dass p z q gilt, muss p z S 2 gelten. In der zweiten inneren While-Schleife wird ein Pfad der Form q = q 0, q 1, q 2,... konstruiert. Gemäß Lemma 3 und den Monotonieeigenschaften der Cosinus- und Sinusfunktion im Intervall [0, π 4 ) folgt q b+1 p z q b p z (cos Θ sin Θ) q b q b+1 < q b p z. (6) Die zweite innere While-Schleife terminiert, wenn der zuletzt hinzugefügte Punkt des q- Pfades einem Punkt des bereits erstellten p-pfades entspricht oder in Ebene 2 des Skip List Spanners vorkommt. Durch (6) wurde gezeigt, dass mit jeder Iteration der zweiten inneren While-Schleife die Abstände zwischen q b und p z echt kleiner werden. Folglich terminiert die Schleife. Es sei y die Anzahl der Iterationen bis zum Terminieren der Schleife. Es können nun zwei Fälle unterschieden werden: q y {p 0, p 1, p 2,..., p z } oder q y S 2. Falls q y {p 0, p 1, p 2,..., p z } sei l so gewählt, dass q y = p l gilt. Der Algorithmus würde dann den Pfad der Form p = p 0, p 1, p 2,..., p l = q y, q y 1,..., q 0 = q ausgeben. Das Gewicht des Pfades ist bestimmt durch die Summe aller Kantengewichte, welches wiederum kleiner oder gleich der Summe aller Kantengewichte des p- und q-pfades ist. l 1 p a p a+1 + q b q b+1 a=0 y 1 b=0 y 1 z 1 p a p a+1 + q b q b+1 (7) a=0 Analog zu (3) kann (6) umgeformt werden zu q b q b+1 b=0 1 cos Θ sin Θ ( q bp z q b+1 p z ) = t( q b p z q b+1 p z ). (8) Unter Zuhilfenahme von (3) und (8) lässt sich nun eine Gewichtsbeschränkung des konstruierten Pfades bestimmen, welche sich durch das Auflösen der Teleskopsummen kürzen lässt:

201 Konstruktion von geometrischen Spannern mit geringem Durchmesser 193 a=0 z 1 p a p a+1 + q b q b+1 a=0 y 1 y 1 b=0 z 1 t ( p a q p a+1 q ) + t ( q b p z q b+1 p z ) b=0 = t( p 0 q p z q + q 0 p z q y p z ) = t( pq q y p z ) t pq (9) Für den Fall, dass q y {p 0, p 1, p 2,..., p z } gilt, wird folglich ein t-spanner Pfad konstruiert. Als zweiter und letzter Fall muss noch die Annahme betrachtet werden, dass q y / {p 0, p 1, p 2,..., p z } gilt. Demnach befindet sich q y in der nächsthöheren Ebene des Skip List Spanners (q y S 2 ). Laut Algorithmus wird die aktuell betrachtete Ebene um eins erhöht, was bedeutet, dass nun ein Pfad vom Punkt p z nach q y im Skip List Spanner SLS(S 2, k) berechnet wird. Laut Induktionsannahme konstruiert der Algorithmus einen t-spanner Pfad von p z nach q y. Das Gewicht des Pfades von p z zu q y ist also begrenzt durch t p z q y. Wurde dieser Pfad konstruiert, werden die Teilpfade p = p 0, p 1,..., p z und p z, p z+1,..., q y und q y, q y 1,..., q 0 = q aneinanderghängt ausgegeben, welche zusammen den Pfad von p nach q beschreiben. Eine Gewichtsbeschränkung des Pfades lässt sich analog zu (9) definieren, wobei hier zusätzlich das Gewicht des von p z nach q y konstruierten Pfades betrachtet wird: a=0 z 1 p a p a+1 + t p z q y + q b q b+1 a=0 y 1 y 1 b=0 z 1 t ( p a q p a+1 q ) + t p z q y + t ( q b p z q b+1 p z ) b=0 = t( p 0 q p z q + p z q y + q 0 p z q y p z ) = t pq (10) Für den Fall, dass sich q y in der nächsthöheren Ebene des Skip List Spanners befindet, konstruiert walk(p,q) also ebenfalls einen t-spanner Pfad. Nachdem die Korrektheit des Algorithmus bewiesen wurde, sollen nun noch Aussagen über zwei wichtige Eigenschaften getroffen werden: Die Laufzeit des Algorithmus und die Anzahl der Kanten des erzeugten t-spanner Pfades, welche den Durchmesser beschreibt. Für die folgende Analyse beschreibt T die Laufzeit des Algorithmus walk(p,q) und N die Anzahl der Kanten des erzeugten Pfades. Es soll ein Pfad vom Punkt p zum Punkt q erzeugt werden. Da die Punktmengen S 1, S 2,... S h per Zufall durch einen Münzwurf bestimmt wurden, ist

202 194 Philipp Wissneth zunächst festzuhalten, dass T und N Zufallsvariablen sind und sich folglich nicht deterministisch bestimmen lassen. Der Algorithmus muss als erstes für jeden zum p-pfad hinzugefügten Punkt p a einen Kegel C bestimmen, sodass sich der gesuchte Zielpunkt q b im verschobenen Kegel C pa befindet. Analog hierzu muss für jeden zum q-pfad hinzugefügten Punkt q b die Eigenschaft p a C qb gelten. In Kapitel 2 wurde angegeben, dass sich jeder Kegel in C aus d Hyperebenen zusammensetzt und dass C aus O((c/Θ) d 1 ) Kegeln besteht. Bezeichne m die Gesamtzahl aller Hyperebenen, welche die Kegel definieren so gilt m = d C = O((c/Θ) d 1 ). Um nun den passenden Kegel bestimmen zu können, wird diese Ansammlung von Hyperebenen in der in [9] beschriebenen Datenstruktur gespeichert. Die Datenstruktur hat einen Speicherplatzbedarf von O(m d ) und ermöglicht es, einen zu einem Punkt gehörenden Kegel in Zeit O(log m) zu bestimmen. Da in der Datenstruktur keine verschobenen Kegel gespeichert werden, muss vor jeder Anfrage der Punkt mit dem die Anfrage gestartet wird normalisiert werden: Um einen Kegel C zu finden, sodass q b C pa gilt, wird die Anfrage mit dem Punkt q b p a gestartet. Der ausgegebene Kegel ist nun der gesuchte. Die Zeit zum Auffinden eines Kegels ist durch O(log(1/Θ)) beschränkt, da c und d konstante Faktoren sind. Mit Hilfe dieser Beobachtungen kann nun eine generelle Formel für T aufgestellt werden: Der Algorithmus berechnet einen Pfad bestehend aus N Kanten. Für die Bestimmung einer jeden hinzuzufügenden Kante muss zuerst ein passender verschobener Kegel gefunden werden. Dies geschieht in den beiden inneren While-Schleifen. Gesteuert durch die äußere While-Schleife geschieht dies im Worst-Case für alle h Ebenen des Skip List Spanners. Die Laufzeit T ist also bestimmt durch T = O(N log(1/θ) + h). Da es sich bei T, N und der Anzahl der Ebenen h um Zufallsvariablen handelt, ist deren Erwartungswert von Interesse. Es gilt E(T ) = O(E(N) log(1/θ) + E(h)) = O(E(N) log(1/θ) + log n), da die erwartete Anzahl an Ebenen des Skip List Spanners (analog zu Skip Listen) logarithmisch zur Gesamtzahl der Punkte in S ist (siehe Kapitel 2). Damit der Erwartungswert der Laufzeit bestimmt werden kann, muss nun noch der Erwartungswert von N bestimmt werden. Um zu bestimmen, wie groß die Anzahl der Kanten eines von walk(p,q) erzeugten Pfades ist, wird im Folgenden die Zahl der in einer Ebene i hinzugefügten Punkte abgeschätzt. Zusammen mit der zu erwartenden Anzahl der Ebenen im Skip List Spanner lässt sich dann eine Aussage über den Durchmesser der erzeugten Pfade treffen. Für die folgende Abschätzung wird angenommen, dass ein Pfad vom Punkt p zu Punkt q erzeugt werden soll. Dabei wird eine feste Ebene i betrachtet, in welcher ein Teilpfad von einem Punkt p r S i zu einem Punkt q s S i erzeugt wird. Es gilt 1 i h. Es ist zu beachten, dass, sobald die Mengen S 1,..., S i und p, q bekannt sind, die Indizes r und s deterministisch bestimmt werden können. Für die folgende Analyse sei angenommen, dass der Münzwurf, welcher die Menge S i+1 bestimmt, noch nicht ausgefürt wurde. Der Pfad p r = p r, p r+1, p r+2,..., p m = q s sei definiert als der Pfad, welcher konstruiert werden würde, wenn alle Punkte aus S i nicht in der Menge S i+i vorkommen würden. Des weiteren bezeichne z die Zahl der Punkte, welche in Ebene i zum p-pfad hinzugefügt wurden. Aufgrund der Tatsache, dass die Mengen S 1,..., S h zufällig bestimmt werden ist offensichtlich, dass es sich bei z um eine Zufallsvariable handelt. Es sei nun l 0 und z = l. Auf Ebene i wurden dem p-pfad also l Punkte hinzugefügt. Für den konstruierten p-pfad gilt offensichtlich p r = p r, p r+1 = p r+1,..., p r+l = p r+l. Die

203 Konstruktion von geometrischen Spannern mit geringem Durchmesser 195 aktuell hinzugefügten Punkte entsprechen also bis zum l-ten hinzugefügten Punkt denen, wenn keiner der Punkte aus S i in S i+1 enthalten gewesen wäre. Insbesondere gilt für alle a, r a r + l 1, dass p a / S i+1. Daraus lässt sich folgende Aussage treffen: P (z = l) P ( r+l 1 a=r (p a / S i+1 ) ) (11) Wird nun angenommen, dass der Münzwurf für jeden Punkt p a erst bei der Anfrage, ob sich p a auch in Ebene S i+1 befindet, ausgeführt wird, lässt sich eine Aussage über die entsprechende Wahrscheinlichkeit machen. Jeder Punkt aus S i ist mit einer Wahrscheinlichkeit von 1/2 in S i+1 enthalten. Da alle Münzwürfe unabhängig voneinander sind, gilt P (z = l) r+l 1 a=r P (p a / S i+1 ) = (1/2) l. (12) Aufgrund der Unabhängigkeit der Münzwürfe ist es bei jedem Wurf gleich wahrscheinlich, dass das Ergebnis Kopf bzw. Zahl geworfen wird. D.h., dass die Zufallsvariable z geometrisch mit dem Parameter 1/2 verteilt ist. Der q-pfad wird analog zu dem p-pfad erstellt. Folglich ist auch eine Zufallsvariable y, welche die Zahl der hinzugefügten Punkte zum q-pfad beschreibt, geometrisch mit dem Parameter 1/2 verteilt. Angenommen, M i beschreibt die Zahl der in Ebene i zum p-pfad hinzugefügten Kanten und N i die Zahl der in Ebene i zum q-pfad hinzugefügten Kanten (1 i h). M i und N i sind Zufallsvariablen. Da die Zahl der zu einem Teilpfad hinzugefügten Punkte der Zahl der hinzugefügten Kanten entspricht, gilt, dass M i und N i ebenfalls geometrisch mit dem Parameter 1/2 verteilt sind. Die Erwartungswerte für alle M i bzw. N i betragen E(M i ) = E(N i ) = = 2. (13) Die Gesamtzahl N der Kanten im berechneten Pfad von p nach q beträgt h i=1 (M i + N i ). Wie bereits weiter oben festgestellt wurde, beträgt die zu erwartende Anzahl an Ebenen des Skip List Spanners (h) mit hoher Wahrscheinlichkeit log n, weshalb sich folgende Aussage über den Erwartungswert von N treffen lässt: log n E(N) = (E(M i ) + E(N i )) = (2 + 2) = 4 log n (14) i=1 log n i=1 Da es sich bei den einzelnen Münzwürfen für die Punkte um jeweils voneinander unabgängige Bernoulli-Experimente handelt, lässt sich mit Hilfe der Chernoff-Schranke (vgl. [7]) die Wahrscheinlichkeit einschränken, dass N von seinem Erwartungswert abweicht. Die generelle Aussage der Chernoff-Schranke lautet

204 196 Philipp Wissneth P (X (1 ɛ)e(x)) exp( ɛ2 E(X) ) 2 P (X (1 + ɛ)e(x)) exp( ɛ2 E(X) ). (15) 3 Wobei X eine Zufallsvariable oder die Summe über Zufallsvariablen ist und E(X) dessen Erwartungswert. Für die Zufallsvariable N beschreibt die Chernoff-Schranke also P (N (1 ɛ)4 log n) exp( ɛ2 4 log n ) 2 P (N (1 + ɛ)4 log n) exp( ɛ2 4 log n ). (16) 3 Daraus folgt, dass der tatsächliche Wert für N mit hoher Wahrscheinlichkeit nur gering von dem des Erwartungswertes abweicht. Insbesondere ist die Wahrscheinlichkeit, dass N unter dem Erwartungswert liegt etwas größer als die Wahrscheinlichkeit, dass der tatsächliche Wert für N über dem Erwartungswert von N liegt. Mit Hilfe dieser Beobachtung gilt mit hoher Wahrscheinlichkeit, dass E(N) = 4 log n = O(log n). Daraus folgt, dass der Durchmesser des Skip List Spanners ebenfalls mit hoher Wahrscheinlichkeit durch O(log n) beschränkt ist. Die erwartete Laufzeit T von walk(p,q) ist mit hoher Wahrscheinlichkeit beschränkt durch E(T ) = O(E(N) log(1/θ) + h) = O(log n log(1/θ) + log n) = O(log(1/Θ) log n). (17) Die Erkenntnisse über die Eigenschaften des Skip List Spanners und den zugehörigen Algorithmus walk(p,q) zur Bestimmung von t-spanner Pfaden können wie folgt zusammengefasst werden: Theorem 2 (vgl. Theorem 10 in [4]). Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und S eine Menge von n Punkten im R d. 1. Der Skip List Spanner SLS(S, k) ist ein t-spanner für t = 1/(cos Θ sin Θ). Er enthält eine erwartete Anzahl von O((c/Θ) d 1 n) Kanten für eine Konstante c. 2. Der Skip List Spanner kann in erwarteter Zeit O((c/Θ) d 1 n log d 1 n) mit einem erwarteten Speicherplatzbedarf von O((c/Θ) d 1 n + log d 2 n) konstruiert werden. 3. Die zu erwartende maximale Zeit zum konstruieren eines t-spanner Pfades von einem beliebigen Punkt aus S zu einem anderen beliebigen Punkt aus S ist beschränkt durch O(log(1/Θ) log n). 4. Der zu erwartende Durchmesser des konstruierten Skip List Spanners ist beschränkt durch O(log n). 5. Sämtliche Beschränkungen gelten mit hoher Wahrscheinlichkeit.

205 4 Zusammenfassung Konstruktion von geometrischen Spannern mit geringem Durchmesser 197 In dieser Ausarbeitung wurde gezeigt, dass t-spanner mit einem erwarteten Durchmesser von O(log n) für t = 1/(cos Θ sin Θ) existieren. Es handelt sich dabei um eine randomisierte Datenstruktur, welche auf Skip-Listen und Θ-Graphen basiert. Der sogenannte Skip List Spanner enthält eine erwartete Anzahl von O((c/Θ) d 1 n) Kanten für eine Konstante c. Die Zeit zum Bestimmen eines t-spanner Pfades ist mit hoher Wahrscheinlichkeit beschränkt durch O(log(1/Θ) log n). Der Algorithmus zum Bestimmen des gesuchten Pfades ist deterministisch, jedoch kann wegen der ihm zugrunde liegenden randomisierten Datenstruktur lediglich eine Aussage über die zu erwartende Laufzeit getroffen werden. Arya, Mount und Smid nennen in [4] einige Konstruktionen von geometrischen Spannern, in welchen t-spanner Pfade bis zu Ω(n) Kanten enthalten können. Durch den hier mit hoher Wahrscheinlichkeit zu erzielenden Wert von O(log n) ist ein t-spanner Pfad effizienter zu speichern und durch die vergleichsweise geringe Anzahl an zu besuchenden Knoten und Kanten in bestimmten Anwendungsfällen zu bevorzugen. Um die dem Skip List Spanner zugrunde liegenden Θ-Graphen effizient konstruieren zu können, wurde eine auf orthogonalen Bereichsanfragen von Bereichsbäumen basierende Technik vorgestellt, mit dessen Hilfe es möglich ist, den Skip List Spanner in erwarteter Zeit O((c/Θ) d 1 n log d 1 n) mit einem erwarteten Speicherplatzbedarf von O((c/Θ) d 1 n + log d 2 n) zu konstruieren. Im Vergleich zu ähnlichen Verfahren konnte hier durch das Vorwissen, dass für alle Punkte der Punktmenge S eine Bereichsanfrage gestartet wird, Speicherplatz in Höhe eines Faktors von log n eingespart werden. Literaturverzeichnis 1. J. Ruppert, R. Seidel (1991) Approximating the d-dimensional complete Euclidian graph, Proc. 3rd Canadian Conf. on Computational Geometry W. Pugh (1990) Skip Lists: A probabilistic alternative to balanced search trees, Communications of the ACM 33: S. Arya, M. Smid (1997) Efficient construction of a bounded degree spanner with low weight, Algorithmica 17: S. Arya, D. M. Mount, M. Smid (1999) Dynamic algorithms for geometric spanners of small diameter: Randomized solutions, Computational Geometry: Theory and Applications 13(2): M. de Berg, M. van Kreveld, M. Overmars, O. Schwarzkopf (1997) Computational Geometry Algorithms and Applications. Springer Verlag. 6. R. Klein (1997) Algorithmische Geometrie Grundlagen, Methoden, Anwendungen. Springer Verlag. 7. K. Mulmuley (1994) Computational Geometry, an Introduction through Randomized Algorithms. Prentice Hall, Englewood Cliffs. 8. A.C. Yao (1982) On constructing minimum spanning trees in k-dimensional spaces and related Problems, SIAM J. Comput. 11: B. Chazelle, J. Friedman (1994) Point location among hyperplanes and unidirectional ray-shooting, Computational Geometry Theory and Applications. 4:53 62.

206

207 Ein einfacher, linearer (1+ɛ) - Approximationsalgorithmus für das k-means Clustering Problem Markus Heberling Universität Paderborn markush@upb.de Zusammenfassung. k-means Clustering ist das Auffinden von k Mittelpunkten zu einer Menge von Punkten, so dass die Summe aller Entfernungen von allen Punkten zu ihrem nächsten Mittelpunkt minimal ist. In dieser Ausarbeitung wird ein Algorithmus beschrieben, der eine (1+ɛ) - Approximation des k-means Clusterings in linearer Zeit liefert. Die Idee des Algorithmus ist es, den Mittelpunkt des größten Clusters einer Punktmenge zu approximieren, indem alle Untermengen einer konstanten Größe durchprobiert werden. Um diesen Mittelpunkt können dann Punkte aus der Gesamtmenge weggenommen werden und es kann rekursiv der Mittelpunkt des nächstkleineren Clusters ermittelt werden. 1 Einleitung Unreduzierbarkeit Means und 2-Means Means Means k-means Näherung in linearer Zeit Idee irred-k-means k-means Vergleich Fazit Literaturverzeichnis Einleitung Diese Ausarbeitung beschäftigt sich mit dem Thema k-means Clustering, und einer linearen Approximation, die in [6] beschrieben ist. Sie baut auf der Proseminar Ausarbeitung von Holger Bürger zum Thema 2-Means auf. Zunächst folgt eine kurze Wiederholung der Problemstellung. Das k-means Clusteringproblem ist durch die Formel min( p P d(p, C)2 ) definiert. Dabei ist C die Menge der Mittelpunkte und d(p, C) ist die Entfernung von p zum nächsten Punkt aus C. Dies bedeutet, dass jeder Punkt p P seinem nächsten Mittelpunkt aus C

208 200 Markus Heberling zugewiesen wird. Somit bilden alle Punkte, die dem gleichen Mittelpunkt zugewiesen sind, einen Cluster. Für variable k und n ist das Problem NP-Schwer. Bei konstanten k kann es in Polynomieller Laufzeit gelöst werden. So wird in [5] ein optimaler Algorithmus beschrieben, der das k-means Problem in O(n kd+1 ) löst. Einer der meist benutzten Algorithmen zur Approximation des k-means Problems ist Lloyds Algorithmus [7]. Dabei werden k zufällige Mittelpunkte gewählt. Für jeden Punkt der Gesamtmenge wird der Mittelpunkt mit der kürzesten Distanz bestimmt. Punkte mit dem gleichen Mittelpunkt bilden dann einen Cluster. Für jeden der erhaltenen Cluster wird dann ein neuer Mittelpunkt berechnet und es werden wieder alle Punkte dem am kürzesten entfernten Mittelpunkt zugeordnet. Dies wird solange wiederholt, bis keine Änderung mehr eintritt. Dabei kann man die Laufzeit des Algorithmus nicht abschätzen. Außerdem kann es passieren, dass der Algorithmus in einem beliebig schlechten lokalen Minimum endet. Es lassen sich also weder Aussagen über Genauigkeit noch über das Laufzeitverhalten treffen. Ein häufiger Verwendungszweck des k-means Algorithmus ist im Data-Mining. Eine gegebene Datenmenge mit verschiedenen Dimensionen soll dabei in Ähnlichkeitscluster unterteilt werden. Mithilfe des k-means Clusterung können aber auch zum Beispiel Farben in in einem Bild reduziert werden, um das Bild zu komprimieren (Abbildung 1). Dazu werden die RGB oder CMYK Werte der einzelnen Pixel als Dimensionen angesehen. Dazu können dann k Mittelpunkte gefunden werden. Jeder Pixel wird dann durch die Farbwerte seines zugehörigen Mittelpunktes ersetzt. Anstatt z.b. 24Bit/Pixel benötigt man bei einer Reduzierung auf 32 Farben nur noch 5Bit/Pixel. Dazu kommt dann noch ein Index von 32*24Bit. Diese Farbreduzierung ist sehr schnell und liefert relativ gute Ergebnisse. Zur weiteren Geschwindigkeitsverbesserung kann das Berechnen des Clusters auch auf eine Untermenge aller Pixel angewendet werden. Abb. 1. Bildkompression mit k=32[3]

209 (1+ɛ) - k-means - Approximation 201 Eine lineare Annäherung für k = 2 wurde im Kapitel von Holger Bürger bereits beschrieben. Der Algorithmus für das k-means Problem basiert hierauf. Ziel ist es für das k-means Problem einen Näherungsalgorithmus zu beschreiben, der in Laufzeit O(nd) eine Näherung liefert, die maximal um einen konstant gewählten Faktor ɛ vom Optimum abweicht. In 2 wird ein 3-Means Clustering gezeigt. Dabei sind die Sterne die Clustermittelpunkte. Abb Means Beispiel 1.1 Unreduzierbarkeit Im weiteren Verlauf wird der Begriff der Reduzierbarkeit bzw. Unreduzierbarkeit benötigt. Definition 1. Ein Problem ist (k, ɛ))-unreduzierbar, wenn gilt k 1 (P ) (1 + 32ɛ) k (P ) Wenn wir für ein Problem also anstatt der k-means Lösung eine (k-1)-means Lösung finden können, die Nahe an der optimalen k-means Lösung liegt, so können wir das k-

210 202 Markus Heberling Means Problem auf ein einfacheres (k-1)-means Problem reduzieren. Ist dies nicht der Fall, so ist das Problem unreduzierbar. 2 1-Means und 2-Means Kurz zur Wiederholung sind hier die Konzepte für 1-Means und 2-Means aufgeführt. Die Beweise dazu finden sich in der Ausarbeitung von Holger Bürger Means Die optimale Lösung des 1-Means Problem ist der Mittelpunkt der gegebenen Punktmenge. Durch Random-Sampling kann in konstanter Zeit ein Mittelpunkt angenähert werden. Dazu werden einige Punkte der Originalmenge zufällig ausgewählt, und es wird für diese Untermenge der Mittelpunkt bestimmt. Verschiedene mögliche Ergebnisse sind in Abbildung 3 dargestellt. Wenn man dabei m = 2/ɛ zufällige Punkte auswählt, erhält man mit der Wahrscheinlichkeit 1/2 eine (1 + ɛ)-approximation des 1-Means Problems. Abb. 3. Random Sampling

211 (1+ɛ) - k-means - Approximation Means Für das 2-Means Problem benötigen wir zunächst das Superset Sampling Lemma: Lemma 1 (Superset Sampling Lemma). Es gilt ɛ) 1 (P ) mit konstanter Wahrscheinlichkeit. min (P, c(s )) (1 + S :S S, S = 2 ɛ Dieses Lemma sagt aus, dass wir für eine Untermenge P von P eine gute Approximation erhalten, obwohl P noch nicht bekannt ist. Dazu sei P β P, wobei β zwischen 0 und 1 liegt. Dann können wir von P eine zufällige Menge S der Größe 4 βɛ nehmen. Für alle möglichen Untermengen S der Größe 2 ɛ von S können wir nun den Mittelpunkt c(s ) berechnen. Nach Lemma 1 ist einer dieser Mittelpunkte eine gute Annäherung an den Mittelpunkt von P. Wir nehmen an die beiden optimalen Mittelpunkte seien c 1 und c 2 und die dazugehörigen Cluster P 1 und P 2. Es gelte P 1 P 2, dann können wir von P eine Menge S der Größe 1 ɛ samplen. Wenn wir von S nun alle Mittelpunkte aller Untermengen der Größe 2 ɛ ermitteln ist nach Lemma 1 eines davon eine gute Annäherung an c 1. Wir nennen diesen Mittelpunkt c 1. Um den Punkt c 1 können wir nun alle Punkte entfernen, die einen Abstand kleiner als t/4 zu c 1 haben. t ist der Abstand der beiden optimalen Mittelpunkte c 1 und c 2. Wenn die Punkte entfernt sind kann im zweiten Schritt durch erneute Anwendung des Superset Sampling Lemmas der Mittelpunkt c 2 bestimmt werden. Da das Lemma jeweils eine Menge von Punkten zurück gibt, wird der zweite Schritt für jedes Element der ersten Menge durchgeführt. Es wird dann zum Schluss das beste Ergebnis zurückgeliefert. Zu beachten ist, dass der Wert t nicht bekannt ist. Es werden daher verschiedene Werte für t ausprobiert. Dies wird in der 2-Means Ausarbeitung näher beschrieben. 3 k-means Näherung in linearer Zeit 3.1 Idee Die Grundidee zur Lösung des k-means Problems ist die selbe wie beim 2-Means Problem. Wir wollen rund um einen gefundenen Mittelpunkt, Punkte aus der Gesamtmenge entfernen, so dass die Gesamtpunktmenge kleiner wird und in der verbliebenen Punktmenge ein anderer Cluster größer ist. Dies können wir dann für alle Cluster machen und so die Punktmenge immer weiter verkleinern und jeweils den Mittelpunkt des größten Clusters in der verbliebenen Menge suchen. Dazu suchen wir mittels Superset Sampling zunächst den Mittelpunkt des größten Clusters. Um diesen Mittelpunkt können wir nun alle Punkte entfernen, die in einem Radius von t/4 um diesen Punkt liegen. t/4 ist dabei der Abstand zwischen dem optimalen Mittelpunkt dieses Clusters und dem optimalen Mittelpunkt, der am nächsten zu ihm liegt. Da die optimalen Clustermittelpunkte nicht bekannt sind, muss t/4 wie beim 2-Means Verfahren angenähert werden. Sobald die Punkte entfernt sind kann man in der verbliebenden Punktmenge den nächst größten Cluster suchen (Abbildung 4). Dabei ist zu beachten, dass das Superset Sampling nicht genau einen Mittelpunkt zurück liefert, sondern eine Menge von Punkten, von denen einer eine gute Annäherung zum richtigen Mittelpunkt ist. Wir führen

212 204 Markus Heberling den 2. Schritt also nicht nur für einen Punkt aus sondern für jeden Punkt dieser Menge. Dies wiederholen wir k-mal, so dass wir für jeden der k Mittelpunkte eine Annäherung erhalten. Als Ausgabe liefern wir dann die beste Clusterung, die wir ermittelt haben. t/4 t t Abb Means Beispiel 3.2 irred-k-means Wir gehen zunächst davon aus, das das gegebene Problem k-unreduzierbar ist. Zunächst sei der Algorithmus angegeben: Funktionsweise Der Algorithmus kombiniert das Random-Sampling (Zeile 6) und das verkleinern der Punktmenge (Zeile 10). Die erste Rekursion in Zeile 9 führt dazu, dass der nächst kleinere Cluster gefunden wird. Die zweite Rekursion in Zeile 9 ist die Verkleinerung der Punktmenge. Beim

213 (1+ɛ) - k-means - Approximation 205 Algorithmus 20 Irred-k-Means(Q, m, k, C, α, Sum) Vorbedingung: Q: Verbliebende Punkt Menge, m: Anzahl noch zu findender Cluster, k: Gesamtanzahl Cluster, C Menge der k m bereits gefundenen Mittelpunkte, α: Approximationsfaktor, Sum: Kosten der Clustering von P Q zu C 1: if m = 0 then 2: Ordne alle Punkte in Q ihrem jeweiligen nächsten Mittelpunkt zu 3: Sum = Sum+Clustering Kosten von Q 4: return Clustering 5: else 6: Erstelle ein Random Sampling der Größe O(k/α 2 ) von Q 7: for alle Untermengen S der Größe O(1/α) von S do 8: Finde den Mittelpunkt c von S 9: Finde das Clustering irred-k-means(q, m 1, k, C c, α, Sum) 10: Betrachte die Punkte in Q in aufsteigender Entfernung von C 11: U seien die ersten Q /2 Punkte dieser Sequenz 12: Ordne alle Punkte in U ihrem jeweiligen nächsten Mittelpunkt aus C zu 13: Sum = Sum+Clustering Kosten von U 14: Finde das Clustering irred-k-means(q U, m, k, C, α, Sum) 15: return Clustering mit den minimalen Kosten 2-Means Clustering war die Punktmenge, die entfernt werden kann als Ball der Größe t/4 um den ersten gefunden Cluster definiert. Wobei t der Abstand der beiden optimalen Mittelpunkte c 1, c 2 ist. Beim k-means Clustering können wir t definieren als den Abstand des optimalen Mittelpunkts c i zum nächsten anderen optimalen Mittelpunkt. Wie beim 2-Means Clustering wissen wir vorab nicht, wie groß dieser Abstand ist. Deshalb benutzen wir die gleiche Technik um trotzdem die entsprechenden Punkte entfernen zu können. Dabei nehmen wir jeweils die Hälfte der Punkte, die näher an den bereits gefunden Clustern liegen und berechnen ein Clustering für P ohne diese Punkte. Da dies rekursiv geschieht bis wir nur noch einen Punkt haben, ist eines dieser Clusterings das Clustering, bei dem genau die Punkte des Balls mit dem Radius t/4 um c i entfernt worden sind. Da wir das beste Clustering nehmen, erhalten wir als Rückgabe genau dieses Clustering. Korrektheit Theorem 1. Angenommen eine Punktmenge P ist (k, α)-unreduzierbar. dann liefert der Algorithmus Irred-k-means(P, k, k,, α, 0) mit der Wahrscheinlichkeit γ k eine Lösung des k-means Problems mit den Kosten (1 + α) k (P ). dabei ist γ eine von k unabhängige Konstante. Beweis. Wir betrachten eine optimale k-means Lösung für die Eingabemenge P. c 1,..., c k seien die Mittelpunkte, die P in die Partitionen P 1,..., P k aufteilen. Die einzige Zufallsquelle in unserem Algorithmus ist das Superset-Sampling-Lemma (Lemma 1). Dieses Lemma liefert aber nur mit einer gewissen Wahrscheinlichkeit das gewünschte Ergebnis. Wir nehmen fürs erste an, dass das Lemma immer das gewünschte Ergebnis liefert, und berechnen hinterher für welche Wahrscheinlichkeit unser Algorithmus erfolgreich ist. Für die Eingabe (P, k, k,, α, 0) wird der Algorithmus Irred-k-means mehrmals rekursiv Aufgerufen. Sei C die Menge aller Aufrufe von Irred-k-means mit der Eingabe (P, k, k,, α, 0). C i sei die Menge der Aufrufe, in denen die Anzahl der bereits gefundenen Mittelpunkte C die Größe i hat. Für alle i soll folgende Invariante gelten:

214 206 Markus Heberling 1. Sei C = {c 1,..., c i }, dann gilt für j = 1,..., i, (P j, c j ) (1 + α) (P j, c j ) 2. Die Menge P Q ist eine Untermenge von P 1... P i Wenn wir zeigen können, dass die Invariante für i = k gilt, haben wir gezeigt, dass der Algorithmus korrekt arbeitet. Für i = 0 ist die Invariante erfüllt. Wir zeigen jetzt mittels Induktion, dass die Invariante für i + 1 gilt, wenn sie für i gilt. Da die Invariante für i gilt, gibt es Parameterlisten in C i, für die die Invariante gilt. Von diesen Listen wählen wir die Liste (Q, m, k, C, α, Sum), für die Q minimal ist. Wir betrachten das Paar von Mittelpunkten der Mengen c l {c 1,..., c i } und c r {c i +1,..., c k } mit dem kürzesten Abstand von einander. Sei t = d(c l, c r ) Lemma 2. Sei S die Menge von Punkten B(c 1, t/4)... B(c i, t/4)), also die Punkte, die höchstens t/4 von {c 1,..., c i } entfernt sind. Dann ist S in P 1... P i enthalten und P S enthält höchstens P i+1 /α Punkte von P 1... P i. Beweis. Wir nehmen an, dass P j einen Punkt von S enthält, j > i. Wir sagen P j enthalte einen Punkt x B(c q, t/4), q i. Behauptung. d(c q, c q) t/4. Beweis. Wir nehmen das Gegenteil an. Dann ist d(c q, x) < t/2. x ist aber seinem nächsten Mittelpunkt zugeordnet, also d(c j, x) d(c q, x) < t/2. Dann gilt d(c j, c q ) < t, was ein Widerspruch ist. Wir wissen das (P q, c q) (1 + α) (P q, c q ) ist. Aber durch die Gleichung (2) 1 wissen wir das (P q, c q) = (P q, c q ) + P q d(c q, c q) 2 ist. Wir wissen also: P q d(c q, c q) 2 α (P q, c q ) (1) Es gilt d(c q, c j ) d(c q, c j ) + d(c q, x) + d(x, c j ) und d(x, c j ) d(x, c q ) d(x, c q) + d(c q, c q). Wir erhalten also d(c q, c j ) 2d(c q, x) + 2d(c q, c q). Zusammen mit dem Claim von oben erhalten wir, d(c q, c j ) 4d(c q, c q). Angenommen wir würden alle Punkte von P q dem Mittelpunkt c j zuordnen. Dann erhalten wir als Kosten: (P q, c j ) = (P q, c q ) + P q d(c q, c j ) 2 (P q, c q ) + 16 P q d(c q, c q) 2 (1 + 16α) (P q, c q ) Die letzte Ungleichung folgt von Gleichung 1. Aber dies widerspricht der Bedingung, das P (k, α)-unreduzierbar ist. Also ist S in P 1... P i enthalten. Angenommen P S enthält mehr als P l /α Punkte von P 1... P i. In diesem Fall werden diese Punkte Mittelpunkten zugewiesen, die mindestens eine Entfernung von t/4 haben. Es folgt, dass die Kosten der optimalen Lösung k (P ) mindestens t2 P l 16α sind. Dies bedeutet, t 2 P l 16α k (P ). Wenn wir nun aber alle Punkte in P l c r zuweisen, dann erhöhen sich die Kosten maximal um 16α k (P ), was bedeuten würde, dass P (k, α)-reduzierbar ist, was ein Widerspruch ist. 1 Definiert in der Ausarbeitung von Holger Bürger

215 (1+ɛ) - k-means - Approximation 207 Sei S die Punktmenge B(c 1, t/4)... B(c i, t/4) und P = P S. Wir wissen, dass P i+1... P k in P Q enthalten ist. Behauptung. P i+1 α k P. Beweis. Wegen Lemma 2 gibt es höchstens P i + 1 /α Elemente von P 1... P i in P. Also gilt P P i+1 /α + P i P k P i+1 /α + k P i+1 k α P i + 1 Es folgt, dass P i + 1 α k P Q. Wenn wir also P kennen würden, dann könnten wir mit Lemma 1 einen Punkt c i+1 berechnen der eine gute Approximation zu c i+1 ist, in dem wir O(k/α 2 ) Punkte von P Q samplen. Leider kennen wir P nicht. Lemma 3. P Q Q /2. Beweis. Wir nehmen das Gegenteil an: P Q Q /2. Behauptung. Wir betrachten die Punkte in Q aufsteigend sortiert nach der Entfernung von C. U seien die ersten Q /2 Punkte. Dann enthält U keinen Punkt aus P Q. Beweis. Sei x P und y P P, dann behaupten wir, dass y näher zu C ist als x. Wegen der Definition von P gibt es einen Mittelpunkt c, für den gilt, dass d(c, y) t/4. Wäre x näher an C als y, dann gäbe es einen Mittelpunkt in C, dessen Abstand zu x höchstens t/4 beträgt. Aber dann gilt x P P, ein Widerspruch zu x P. P Q ist also eine Untermenge von Q U. da P i+1... P k in P Q enthalten ist (Lemma 2), folgt, dass P i+1... P k eine Untermenge von Q U ist. Daher ist die Parameterliste (Q U, C, k, m, α, Sum) in C i. dies ist ein Widerspruch dazu, dass (Q, C, k, m, α, Sum) in C i ist. Dies beweist das Lemma. Es wurde also gezeigt, dass die Invariante für alle i gilt und somit der Algorithmus das korrekte Ergebnis liefert. Wahrscheinlichkeit Wir hatten bisher eine Wahrscheinlichkeit für das gewünschte Ergebnis des Superset Sampling Lemmas mit 1 angenommen. Das Superset Sampling Lemma 1 liefert das gewünschte Ergebnis jedoch nur mit einer konstanten Wahrscheinlichkeit kleiner 1. In jedem Durchlauf der Rekursion in Zeile 9 wird m um 1 verkleinert. Also sind in jeder Abfolge von Rekursionsaufrufen höchstens k Aufrufe des Samplings. Es wurde eben gezeigt, dass es eine Parameter Liste C k gibt, für die C eine Menge von Mittelpunkten enthält, die nah an den optimalen Mittelpunkten liegen. Wenn wir uns nun die Abfolge von Aufrufe anschauen, die zu dieser Parameter Liste geführt haben, sehen wir, dass wir k Aufrufe des Samplings haben. Jeder dieser Aufrufe liefert das gewünschte Ergebnis mit konstanter Wahrscheinlichkeit γ. Die Wahrscheinlichkeit, dass wir genau diese Parameter Liste erhalten ist also γ k.

216 208 Markus Heberling Laufzeit Theorem 2. Der Algorithmus irred-k-means, aufgerufen mit den Parametern (P, m, k, C, α, 0), hat eine Laufzeit von O(2 (k/α)o(1) ), wobei n = P ist. Beweis. Sei T (n, m) die Laufzeit des Algorithmus mit der Eingabe (Q,m,k,C, α,sum), wobei n = Q ist. T (n, 0) = O(nd), da in diesem Fall nur der erste Fall in Zeile 1 ausgeführt wird und das Zuordnen aller Punkte zu ihrem Mittelpunkt O(nd) Zeit benötigt. T (n, 0) = O(nd) (2) In Zeile 7 erhalten wir u(k, α) = O(2 (k/α)o(1) ) Samples. Das Zuordnen der Mittelpunkte in Zeile 8 benötigt O(d) Schritte. In Zeile 10 des irred-k-means-algorithmus werden die Q /2 Punkte mit der geringsten Entfernung zu ihren jeweiligen Mittelpunkten berechnet. Wenn man dies wie hier angegeben zunächst durch Sortierung und dann Auswahl der Punkte macht, erhält man dort eine Laufzeit von O(n log n+n). Dies widerspricht der Behauptung, dass der gesamte Algorithmus eine lineare Laufzeit erreicht. Die Auswahl der kleinsten k Punkte kann aber auch in linearer Zeit geschehen, wie in [1] gezeigt wird. Wir erhalten also für die Zeilen 10 bis 13 eine Laufzeit von O(nd) Für den allgemeinen Fall erhalten wir also die rekursive Gleichung T (n, m) = O(u(k, α))t (n, m 1) + T (n/2, m) + O((n + u(k, α))d) (3) Diese Gleichung lässt sich zu T (n, k) = O(2 k/αo(1) dn) auflösen. 3.3 k-means Um eine gute Lösung auch für reduzierbare Probleme finden zu können, werden wir den Algorithmus irred-k-means für alle i = 1... k durchlaufen (Algorithmus 21) und das Minimum als Ergebnis ausgeben. Dies erhöht die Laufzeit um den Faktor k, bleibt also immer noch linear in der Menge der Punkte. Algorithmus 21 k-means(p, k, ɛ) Vorbedingung: P : Punktmenge, k: Gesamtanzahl Cluster, ɛ: Approximationsfaktor 1: for i = 1... k do 2: Finde das Clustering irred-k-means(p, i, i,, ɛ/64k, 0) 3: return Clustering mit den minimalen Kosten Es bleibt also nur noch zu zeigen, dass der Algorithmus korrekt arbeitet. Sei i der größte Index, für den P (i, α)-unreduzierbar ist. Daraus folgt i (1 + 32α) i+1 (P )... (1 + 32α) k 1 k (P ). Weiterhin wissen wir, dass Irred-k-means(P, i, i,, α, 0) eine Menge C mit i Mittelpunkten liefert, für die gilt (P, C) (1+α) i (P ). Also bekommen wir ein Ergebnis mit Kosten von höchstens (1 + 32α) k k (P ). Dabei ist (1 + 32α) k = (1 + ɛ/2k) k 1 + ɛ. Der Algorithmus liefert also eine (1 + ɛ)-approximation des k-means Problems.

217 (1+ɛ) - k-means - Approximation Vergleich Im Vergleich mit anderen Näherungsverfahren, hat dieser Algorithmus den Vorteil, lineare Laufzeit in der Menge der Punkte zu haben. Allerdings sind die konstanten Faktoren sehr hoch. Das bedeutet, dass der Algorithmus erst bei sehr großen Eingabemengen schneller ist als andere Algorithmen. Gerade bei Erhöhung der Wahrscheinlichkeit steigt die Laufzeit exponentiell an. Ein Vergleich mit den Algorithmen von Inaba [5], Matousek [8], de la Vega [2] and Har-Peled [4] ist in Abbildung 5 dargestellt. Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) Zeit inf 1e+300 1e+250 1e+200 1e+150 1e+100 1e k n Abb. 5. Vergleich verschiedener k-means Algorithmen In Abbildung 6 zeigt die Algorithmen mit den Parametern k=2, e=0.9, d=2. Es ist zu erkennen, dass der lineare Algorithmus ab einer Eingabegröße von ca besser abschneidet als der genaue Algorithmus. Hier ist auch klar der lineare Verlauf zu sehen. Die anderen Algorithmen sind in dieser Grafik nur am unteren Rand zu erkennen. Wenn man sich nun aber die Algorithmen mit den gleichen Parametern mit Logarithmischer Darstellung der y-achse ansieht, dann fällt auf, dass die anderen Näherungsverfahren deutlich unter dem exakten und dem linearen Verfahren liegen. (Abbildung 7). Für höhere Dimensionen sieht es für diesen Algorithmus wieder besser aus, da die Dimension nur linear eingeht (Abbildung 8). Aber auch hier gibt es eine bessere Alternative. Bei höheren k (Abbildung 9) und kleineren ɛ (Abbildung 10) sind die anderen Algorithmen jedoch wieder deutlich besser.

218 210 Markus Heberling 1.2e+108 1e+108 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 8e+107 Zeit 6e+107 4e+107 2e e+20 1e e+21 2e e+21 3e e+21 4e+21 n Abb. 6. Vergleich der Laufzeit bei Änderung der Größe der Punktmenge n 1e+120 1e+100 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+80 Zeit 1e+60 1e+40 1e e+20 1e e+21 2e e+21 3e e+21 4e+21 n Abb. 7. Vergleich der Laufzeit bei Änderung der Größe der Punktmenge n (Zeit-Achse logarithmisch)

219 (1+ɛ) - k-means - Approximation 211 inf 1e+300 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+250 1e+200 Zeit 1e+150 1e+100 1e d Abb. 8. Vergleich der Laufzeit bei Änderung der Dimensionen d inf 1e+300 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+250 1e+200 Zeit 1e+150 1e+100 1e k Abb. 9. Vergleich der Laufzeit bei Änderung der Anzahl Cluster k

220 212 Markus Heberling inf 1e+300 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+250 1e+200 Zeit 1e+150 1e+100 1e e Abb. 10. Vergleich der Laufzeit bei Änderung der Genauigkeit ɛ 5 Fazit Insgesamt ist zu sagen, dass dieser Algorithmus zwar eine lineare Laufzeit hat, durch die hohen konstanten Faktoren jedoch oft andere Näherungen, oder sogar der genaue Algorithmus schneller sind. In [9] werden drei weitere Algorithmen mit sehr guten Laufzeiten von O( k ɛ k dn), O(k 3 n 2 log n) und O(k 5 log 3 kd) beschrieben. Diese Algorithmen liefern allerdings keine (1+ɛ) Approximation, sondern sind in dieser Beziehung schlechter. Offen bleibt, ob es möglich ist die Performance weiter zu steigern, indem zum Beispiel für kleinere Teilprobleme innerhalb dieses Algorithmus einer der anderen Algorithmen benutzt wird, ohne dass dabei die Gesamtgenauigkeit verloren geht. Literaturverzeichnis 1. Manuel Blum, Robert W. Floyd, Vaughan R. Pratt, Ronald L. Rivest, and Robert Endre Tarjan. Time bounds for selection. J. Comput. Syst. Sci., 7(4): , Wenceslas Fernandez de la Vega, Marek Karpinski, Claire Kenyon, and Yuval Rabani. Approximation schemes for clustering problems. In STOC, pages ACM, Alessandro Giusti. Clustering colors in an image Sariel Har-Peled and Akash Kushal. Smaller coresets for k-median and k-means clustering. Discrete & Computational Geometry, 37(1):3 19, Mary Inaba, Naoki Katoh, and Hiroshi Imai. Applications of weighted voronoi diagrams and randomization to variance-based k-clustering: (extended abstract). In SCG 94: Proceedings of the tenth annual symposium on Computational geometry, pages , New York, NY, USA, ACM. 6. Amit Kumar, Yogish Sabharwal, and Sandeep Sen. A simple linear time (1 + ɛ) - approximation algorithm for k-means clustering in any dimensions. In FOCS 04: Proceedings of the 45th Annual IEEE Symposium

221 (1+ɛ) - k-means - Approximation 213 on Foundations of Computer Science (FOCS 04), pages , Washington, DC, USA, IEEE Computer Society. 7. S. Lloyd. Least squares quantization in pcm. IEEE Transactions on Information Theory, 28: , Jirí Matousek. On approximate geometric k-clustering. Discrete & Computational Geometry, 24(1):61 84, Mingjun Song and Sanguthevar Rajasekaran. Fast k-means algorithms with constant approximation. In Xiaotie Deng and Ding-Zhu Du, editors, ISAAC, volume 3827 of Lecture Notes in Computer Science, pages Springer, 2005.

222

223 Peer-to-Peer Netzwerke: Skip-Graph Marc Borowski Universität Paderborn Zusammenfassung. In dieser Ausarbeitung wird die Datenstruktur Skip-Graph vorgestellt. Diese ist in der Lage Daten verteilt auf Knoten eines Peer-to-Peer Netzen zu speichern und zu suchen. Dabei werden die Hauptanforderungen bei P2P Netze, wie Dezentralisierung, Fehlertoleranz, Skalierbarkeit und Lastverteilung berücksichtigt. Gegenüber alternativen Lösungen bietet der Skip-Graph eine sehr hohe Ausfallsicherheit der Datenstruktur bei jeder Art von Ausfällen einzelner Peers und eröffnet zudem weitere Möglichkeiten, wie eine Bereichssuche. 1 Einleitung Eigenschaften von Peer-to-Peer Netzwerken Existierende Lösungen Verteilte Hashtabellen Ausblick Die Datenstruktur Skip-Liste Skip-Graph Operationen auf einem Skip-Graph Die Suche Einfügen neuer Peers Entfernen von Peers Operationen bei mehrfachem gleichzeitigen Zugriff Qualitätsanalyse Fehlertoleranz Auslastung der Peers Varianten und Erweiterungen Mehrere Nachfolger SkipNet Expander Graphen in Skip-Graphen Zusammenfassung und Fazit Literaturverzeichnis

224 216 M. Borowski 1 Einleitung Die Verbreitung von Peer-to-Peer Netzwerken (P2P) hat in den letzten Jahren stark zugenommen. Die Verwendung kostengünstiger Massencomputer ermöglicht große finanzielle Einsparungen gegenüber dem Betrieb großer Serverarchitekturen. 1.1 Eigenschaften von Peer-to-Peer Netzwerken Heutige P2P-Anwendungen werden insbesondere durch drei wichtige Eigenschaften beschrieben: Client- und Serverfunktionalität: In einem P2P-Netzwek kann jeder Knoten im Kontext einer Anwendung Daten speichern, senden und empfangen. Er ist damit in der Lage, sowohl Client- als auch Serverfunktionalität zu leisten. Im idealen Fall sind alle Knoten gleichberechtigt und gleichwertig. Direkter Austausch zwischen Peers: Wenn zwei Knoten eines Netzwerks direkt miteinander verbunden sind, können sie in Echtzeit miteinander interagieren. Es gibt keine zentrale Instanz, die die Kommunikation verzögert oder filtert. Dabei ist es unerheblich welche Daten zu welchem Zweck ausgetauscht werden. Autonomie: Den Knoten eines P2P-Netzwerkes kommt dabei vollkommene Autonomie im Sinne der (Selbst-) Kontrolle ihrer eigenen Aktivitäten zu, d.h. sie allein legen fest, wann und in welchem Umfang sie ihre Ressourcen anderen zur Verfügung stellen. Als Folge dieser Autonomie ist nicht sichergestellt, dass ein Knoten dem Netz ständig zur Verfügung steht. Das Netzwerk muss also tolerieren, dass die Knoten nicht permanent online sind. 1.2 Existierende Lösungen Es gibt viele verschiedene Ansätze, wie Daten in einem P2P Netz bereitgestellt und gefunden werden können. P2P Architekturen können dabei in zentrale und dezentrale Architekturen unterteilt werden. Bei zentralen P2P-Netzwerken ist ein zentraler Server erforderlich, auf dem gespeichert ist, welcher User welche Daten zum Tausch bereitstellt. Nun richtet das Filetauschprogramm des Users seine Suchanfrage direkt an diesen Server und erhält von dem wiederum die Suchergebnisse zurück. Hierbei werden die Suchergebnisse erheblich schneller geliefert als beim dezentralen P2P. Wird nun ein File geladen, geschieht dies allerdings nun direkt vom anderen User. Diese Technik hat aber den Nachteil, dass das File-Sharing-Programm im Falle eines Verbotes abgeschaltet werden kann. Dies kann dann ganz leicht durch ein Abschalten der Server bewerkstelligt werden. Napster Napster ist kein reines P2P-System, da ein zentraler Datenbank-Server Suchanfragen verwaltet. Sobald sich ein Peer in das Napster-Netzwerk einloggt, werden vom Napster-Server

225 P2P: Skip-Graph 217 napster.com P Peer P S S S S P S Server R Response Q Query R P P Q P P Download Abb. 1. Napster die Dateien registriert, die der Anwender zur Verfügung stellt. Bei einer Suchanfrage liefern die Napster-Server eine Liste von Peers, die die gewünschte Datei zum Downloaden bereitstellen. Der Anwender kann dann eine direkte, serverlose Verbindung zu den Anbietern aufbauen und die Dateien beziehen. Die Server stellen damit den Flaschenhals des Netzwerkes dar: Die maximale Anzahl von gleichzeitigen Suchanfragen ist durch die Hardware begrenzt und ein Ausfall führt zum Zusammenbruch des ganzen Netzes. Gnutella P P P D Peer Q R R R P P P Query Response D File Download Q P Q Q P Q Abb. 2. Gnutella Gnutella wurde im März 2000 vom WinAmp-Entwickler Nullsoft herausgegeben und war nur kurze Zeit - bis zur Übernahme via Nullsoft durch AOL - erhältlich. Gnutella ist ein Protokoll für den Datenaustausch in dezentralen Netzwerken. Netzwerke die auf der Gnutella-Technologie basieren, kommen damit ohne zentrale Instanzen aus. Alle Rechner im Netz fungieren deshalb gleichzeitig sowohl als Server, als auch als Client. Sie

226 218 M. Borowski werden deshalb auch als Servents bezeichnet. Suchanfragen funktionieren hier nach dem Schneeballprinzip : Eine Suchanfrage wird an alle direkt verbundenen Peers weitergeleitet. Diese leiten die Anfrage wiederum an benachbarte Peers weiter, bis eine zuvor bestimmte Suchtiefe erreicht wird. Positive Suchergebnisse werden dann über die Route der eingehenden Anfrage zurück an den Anfrager gesendet, so dass dieser die gewünschte Datei direkt von dem Anbieter herunterladen kann. Durch das Fehlen einer zentralen Komponente ist eine Überwachung oder Abschaltung von Gnutella-basierten Netzwerken kaum möglich. Das ist der wichtigste Unterschied zu Napster. Außerdem beschränkt sich Gnutella, anders als Napster, nicht nur auf MP3-Dateien sondern bietet allgemeines File-Sharing an. Freenet Freenet ist ein dezentrales geschlossenes Netzwerk zum Speichern und Austausch von Informationen, welches ohne zentrale Instanz auskommt. Entwickelt wurde Freenet von Ian Clarke mit dem Ziel, ein Netzwerk zu schaffen, in dem Informationen anonym bezogen werden und auf Anforderung zur Verfügung gestellt werden können. Die Dateien werden zu diesem Zweck verschlüsselt auf den PCs der teilnehmenden Peers gespeichert. Nur der Herausgeber der Informationen ist in der Lage diese zu verändern. Die Peers wissen dabei nicht, welche Daten auf ihrer Festplatte abgelegt werden. Nutzer dieses Systems Nutzer dieses System müssen lediglich eine kleine Software installieren, die als Server und Client funktioniert. Jeder (der sich darauf versteht) kann Client oder Serverprogramme für Freenet schreiben. Freenet basiert auf einem offenen Protokoll. Autoren und Leser von Informationen bleiben anonym, wenn sie es wünschen. Informationen werden in einer Weise in Freenet verteilt, dass es schwer zu beurteilen ist, wo die Information gespeichert ist. Jeder Computerbesitzer kann Informationen veröffentlichen. Dafür benötigt er weder einen Domainnamen, noch gekauften Speicherplatz auf einem Webserver. Sein eigener Computer wird zum Webserver. Welche Informationen des eigenen Computers der Nutzer freigibt, entscheidet er selbst. Freenet arbeitet mit einer fehlertoleranten, anpassbaren, verteilten Suchmaschine (FASD). FASD arbeitet mit Schlüsseln für Metadaten, das ist eine bewertete Liste, welche den Inhalt eines Dokumentes im darunterliegenden Netzwerk beschreibt. Obwohl FASD dezentral arbeitet, ist diese Technik in der Lage so effektiv wie eine zentrale Suchmaschine zu arbeiten. Wuala Einen ähnlich Ansatz verfolgt auch das an der ETH Zürich entwickelte Wuala. Das erst vor kurzen veröffentlichte System fragmentiert Dateien mit einem Reed-Solomon-Code. Diese Fragmente sind redundant, sodass nur ein Teil der Fragmente zur Wiederherstellung der vollständigen Datei benötigt wird. Die Fragmente werden anschließend auf Knoten des P2P Netzes verteilt. Daten, die nur privat oder einer geschlossenen Benutzergruppe zur Verfügung stehen sollen werden zuvor mit AES verschlüsselt. Die Daten werden auf den Knoten, wie in einer verteilten Hashtabelle gespeichert. Knoten kennen dabei nur ihre direkten Nachbarn. Eine Suche erfolgt, indem die Suchanfrage immer zu einem Knoten weitergeleitet wird, dessen Schlüssel eine größere Übereinstimmung mit dem Ziel hat. Zur Optimierung des Netzes speichert jeder Knoten auch weitere zufällige

227 P2P: Skip-Graph 219 Verbindungen, die er aufgrund von Routinginformationen aus vorhergehenden Suchanfragen erzeugen hat. 1.3 Verteilte Hashtabellen Es gibt viele Topologieansätze von P2P Netzwerken, die auf verteilten Hashtabellen (DHT) aufbauen. Ihnen gemein ist die Methode, die Daten vorher durch die Anwendung einer Hashfunktion auf den Schlüssel auf die Peers zu verteilen. Anschließend wird über die physikalische Netzstruktur ein virtuelles Netz aufgebaut, dass das effiziente Auffinden der Schlüssel ermöglicht. Verteilte Hashtabellen dienen zur gleichmäßigen Verteilung von Datenobjekten auf die Knotenmenge. Der Speicherort soll dabei mit möglichst geringen Aufwand schnell und effizient gefunden werden. Der Begriff Content-Addressable Network (CAN) [Rat00] bezeichnet eine Variante des ortsunabhängigen Routing mithilfe eines geometrischen Ansatzes. Jeder Knoten ist für einen Teilbereich der gesamten Hashtabelle verantwortlich (Zone). Diese hat mehrere Dimensionen und jeder Knoten kennt die physikalische Adresse seiner Nachbarn in dieser räumlichen Datenstruktur. Eine Suchanfrage kann so immer zu einen Nachbarn weitergeleitet werden, der eine geringere Distanz zu der Zielzone hat. Das Einfügen neuer Knoten verursacht eine Teilung einer bestehenden Zone, wodurch ein hierarchischer Suchbaum entsteht. Am MIT wurde Chord [SMK01] als Algorithmus für eine verteilte Hashtabelle entwickelt. Alle Rechner wenden die Hashfunktion auf ihre IP-Adresse an und bilden einen Datenring in aufsteigender Sortierung ihrer gehashten IP-Adresse. Alle Datenschlüssel werden auf dem Datenring verteilt und auf den Rechner gespeichert, der dem Schlüssel nachfolgt. Da jeder Rechner seinen Nachfolger kennt ist ein Auffinden der Daten garantiert. In der in [SMK01] beschriebenen erweiterten Variante, dem skalierten Routing, werden zur Minimierung der Laufzeit der Operationen jedoch außer dem direkten Nachfolger noch weitere Zeiger auf andere Knoten gespeichert, die in der sogenannten Fingertabelle zusammengefasst werden. Die Entfernung der in der Tabelle gespeicherten Nachbarn nimmt exponentiell zu um einen größeren Folgebrereich zu adressieren. Somit ist der i-te Eintrag der Fingertabelle der 2 i 1 Nachbar auf dem Ring in Uhrzeigerrichtung. In dieser Variante besitzt jeder Knoten zudem noch einen Zeiger auf seinen Vorgänger. Damit ist eine Suche mit der Laufzeit O(log n) möglich. Chord zeichnet sich wegen der Hashfunktion durch eine gute Lastverteilung aus. Zudem steigen die Routingkosten nur logarithmisch an, weshalb dieses Verfahren gut Skalierbar ist. 1.4 Ausblick Ein neue Möglichkeit Peers zu vernetzen zeigt der Skip-Graph. Ziel der Entwicklung dieser Datentruktur ist es den Zusammenhang der Daten nicht zu zerstören, wie es bei verteilten Hashtabellen geschieht. Die Funktionsweise des von James Aspnes und Gauri Shah [AspnesS2003] entwickelten Ansatzes zur Speicherung der Daten in einem P2P-Netz wird in

228 220 M. Borowski den folgenden Kapiteln erläutert. Zudem wird die Laufzeit für die verschiedenen Operationen und die Eignung für ein P2P-Netz untersucht. Zum Schluss werden die Laufzeiten mit anderen Architekturen verglichen. 2 Die Datenstruktur Verteilte Hashtabellen (DHT) ermöglichen eine gute Lastverteilung auf einem Peer-to-Peer Netz und garantieren eine gute Suchzeit von O(log n) bei einem Speicherverbrauch von ebenfalls O(log n). Auch das Einfügen neuer Schlüssel oder deren Löschung ist effizient möglich. Allerdings nutzen sie nicht die Eigenschaft der räumlichen Nähe von Daten aus. Zudem ist ihre gute Ausfallsicherheit nur bei einem gleichmäßig verteiltem Ausfall der Knoten gegeben. Diese Nachteile sollen durch eine andere Datenstruktur behoben werden. 2.1 Skip-Liste William Pugh veröffentlichte im Jahre 1990 eine Datenstruktur namens Skip-Liste [PUGH90], die auf parallelen verketteten Listen aufbaut und bei der Effizienz mit einem binären Suchbaum vergleichbar ist. Er verkettet alle Elemente in aufsteigender Reihenfolge miteinander. Abb. 3. Verwendet man nur alle Listen, die den Startknoten enthalten, so erhält man eine Skip-Liste Hieraus wählt er mit einer bestimmten Wahrscheinlichkeit p zufällig einige Elemente aus und verkettet diese Elemente erneut in einer Liste. Dies führt er so fort, bis nur noch 2 Elemente in einer Liste enthalten sind. Suchen, einfügen und löschen ist ein einer Skip-Liste mit einer Laufzeit von O(log n) möglich. 2.2 Skip-Graph James Aspnes und Gauri Shah stellen in ihrer Ausarbeitung Skip Graphs [AspnesS2003] eine Datenstruktur vor, die den Ansatz der Skip-Listen verallgemeinert. Ihr Ziel ist es eine Datenstruktur für Peer-to-Peer-Netze zu entwickeln, die das Hinzukommen neuer Peers bzw. den Ausfall vieler Peers verkraften kann ohne den Zusammenhang der Daten zu verlieren. Auf Ebene 0 sind alle Knoten in einer doppelt verketteten Liste miteinander verbunden. Im Unterschied zu Skip-Listen können in jeder anderen Ebene mehrere verkettete Listen vorhanden sein. Jeder Knoten ist einer der Listen einer Ebene zugeordnet, bis die Höhe

229 P2P: Skip-Graph 221 ausreicht, sodass er eindeutig adressiert werden kann. Formell wird die Zugehörigkeit eines Knoten x zu den Listen durch den Mitgliedsvektor m(x) beschrieben. Da ein Knoten im Skip-Graph nichts über die Größe des Adressraumes weiß, wird m(x) als unendliches langes Wort über einem endlichen Alphabet σ definiert. Abb. 4. Beispiel eines Skip-Graphen mit 5 Schlüsseln Im folgenden Beispiel betrachten wir das Alphabet {0, 1}. Bei einem Skip-Graphen befinden sich alle Knoten auf Ebene 0 in einer doppelt-verketteten Liste. Auf Ebene 1 existieren zwei doppelt-verkettete Listen. Jeder Knoten wird zufällig auf einer der Listen verteilt. Die aufsteigende Sortierung der Liste muss dabei erhalten bleiben. In Ebene 2 wird jeder Knoten aus einer der Listen aus Ebene 1 wieder zufällig auf zwei neue Listen aufgeteilt, sodass es insgesamt 4 Listen auf Ebene 2 gibt. Diese Aufteilung wiederholt sich solange bis nur noch ein Knoten in einer Liste vorhanden ist. In der Abbildung 4 wird dieses Beispiel graphisch veranschaulicht. Durch diesen Aufbau eines Skip-Graphen ist dieser äquivalent zu einer Sammlung von Skip-Listen. Jeder Skip-Graph beschreibt deshalb einen Trie von Skip-Listen {S w } (Abbildung 5). Falls w i, bedeutet die Schreibweise w i im folgenden der Prefix von w mit der Länge i. Lemma 1. Sei {S w } ein Skip Graph mit dem Alphabet Σ. Für ein z Σ ist die Sequenz S 0 S 1... mit S i = S z i eine Skip-Liste mit dem Parameter p = Σ 1. Beweis. Die Liste S 0 entspricht der Basisliste S ɛ aller Knoten auf Ebene 0. Per Induktion von i lässt sich zeigen, dass ein Knoten x in S i enthalten ist, wenn die ersten i-stellen seines Mitgliedsverktors denen des Vektors z entsprechen (m(x) i = z i). Die Wahrscheinlichkeit, dass der Knoten x in der von der Skip-Liste benutzten Liste eine Ebene höher enthalten ist, entspricht der Wahrscheinlichkeit, dass m(x) (i + 1) = z (i + 1) gilt. Dies ist aber gleich der Wahrscheinlichkeit p = Σ 1, da die Zugehörigkeit des Knoten x von der Wahl jedes anderen Knoten unabhängig ist. Damit erfüllt die Sequenz S 0 S 1... die Anforderung einer Skip-Liste.

230 222 M. Borowski Abb. 5. Verwendet man nur alle Listen, die den Startknoten enthalten, so erhält man eine Skip-Liste 3 Operationen auf einem Skip-Graph In diesem Kapitel werden die verschiedenen möglichen Operationen auf einen Skip-Graphen vorgestellt und ihre Laufzeit analysiert. Ein Skip-Graph ist definiert über einem endlichen Alphabet Σ. Damit wird jede Liste in der nächsten höheren Ebene in maximal Σ Listen unterteilt. Die Menge Σ enthält alle endlichen Wörter dieses Alphabets, die Menge Σ aller unendlich langen Wörter. Für eine Wort w Σ enthält die Liste S w alle Knoten, bei denen w ein Präfix ihres Mitgliedvektors m(x) ist. S w befindet sich auf der Ebene i = w, wobei w = w 0 w 1 w 2... w i 1 gilt. 3.1 Die Suche In einem Skip-Graphen funktioniert die Suche ähnlich derer in Skip-Listen. Die Suche startet in der Liste der höchsten Ebene des Knotens. Ist der gesuchte Schlüssel größer als der eigene Schlüssel wird er mit dem rechten Nachbar in der Liste verglichen. Ist dieser kleiner oder gleich dem gesuchten Wert, wird die Suche dort fortgesetzt. Anderenfalls wird der Schlüssel mit den rechten Nachbarn der Liste einer Ebene tiefer verglichen. Ist der gesuchte Knoten gefunden oder die Ebene 0 erreicht bricht die Suche ab. Falls der gesuchte Schlüssel zu Beginn der Suche kleiner als der Startschlüssel ist, werden die Schlüssel der linken Nachbarn zum Vergleich herangezogen. Listing 1. Suchen in einem Skip-Graphen 1 suche ( StartKnoten s, S u c h s c h l ü s s e l k, Ebene e ) 2 3 F a l l s d i e s e r Knoten dem S u c h s c h l ü s s e l k e n t s p r i c h t 4 Melde e s an den StartKnoten s 5 6 F a l l s S u c h s c h l ü s s e l k k l e i n e r aktuellem S c h l ü s s e l 7 Sol ange Ebene e > 0 8 F a l l s S c h l ü s s e l des r echten Nachbarn k l e i n e r k 9 Sende Suchanfrage an ihn w e i t e r 10 Setze Suche auf Ebene e 1 f o r t 11 F a l l s S u c h s c h l ü s s e l k g r ö ß e r aktuellem S c h l ü s s e l

231 P2P: Skip-Graph Sol ange Ebene e > 0 13 F a l l s S c h l ü s s e l des l i n k e n Nachbarn k l e i n e r k 14 Sende Suchanfrage an ihn w e i t e r 15 Setze Suche auf Ebene e 1 f o r t F a l l s a k t u e l l e Ebene e < 0 18 Sende M i s s e r f o l g der Suche an s Abb. 6. Die Suche benutzt nur Knoten, die auch in der Skip-Liste des Startknoten B enthalten sind. Lemma 2. Die Such-Operation in einem Skip-Graphen S mit n Knoten benötigt eine erwartete Anzahl von O(log n) Nachrichten und O(log n) Zeit. Beweis. Sei z der Knoten an dem die Suche startet und Σ das Alphabet des Mitgliedvektors m(z). Nach Lemma 1 ist jedes Element der Sequenz S m(z) = S 0, S 1, S 2,... eine Skip-Liste. Eine Suche im Skip-Graphen S durchläuft die gleichen Elemente, wie eine Suche in der Skip-Liste S m(z). [PUGH90] zeigt das die durchschnittliche Anzahl von Elementen O(log n 1 ) mit p = log 1 p Σ 1 1 beträgt und in jeder Ebene durchschnittlich auf 1 p Knoten gesucht wird. Damit ergibt sich die erwartete Anzahl von Nachrichten verbunden mit der benötigten Zeit: 1 O log n ( ) = O(log n) (1) (1 p) log 1 p Aus dem Ergebnis ist ersichtlich, dass bei einem kleinen Alphabet, also einem großen p, die Suchzeit abnimmt, aber stattdessen die Anzahl der Ebenen zunimmt. Damit müssen jedoch mehr Nachbarknoten in jedem Knoten gepeichert werden. Deshalb muss hier eine Balance zwischen Suchzeit und Speicherverbrauch gefunden werden. Bereichssuche Im Gegensatz zu vielen anderen Netzwerktopologien ist es durch die Grundordnung im Skip- Graph möglich Bereichsanfragen zu stellen. Sind in den Knoten z.b. die Domainpfade als

232 224 M. Borowski Schlüsselwerte abgelegt, so ist z.b. eine Suche nach allen Schlüsseln unterhalb der Domaine de.upb möglich. Hierbei wird zunächst nach einem Knoten des Bereichs gesucht, der die Suche anschließend in seiner Umgebung broadcastet. 3.2 Einfügen neuer Peers Eine Grundvoraussetzung für P2P Netzwerke ist, dass neue Peers mind. einen Peer des existierenden Netzwerkes kennen müssen. Ist dies der Fall, kann der neue Peer dort mit einer Suche nach sich selbst starten und damit seinen Vorgänger und Nachfolger in der Liste der Ebene 0 finden. Abb. 7. Ein neuer Peer stellt zunächst eine Suchanfrage nach sich selbst um seine Nachbarn auf Ebene 0 zu finden. Nachdem sich der neue Peer in die Liste eingefügt hat, sucht er auf Ebene 0 anhand des Mitgliedvektors nach beiden Seiten nach seinem Nachbarn auf höheren Ebenen und fügt sich ebenfalls in diese Listen ein. Lemma 3. Ohne gleichzeitigen Zugriff benötigt das Einfügen einen Knoten in einem Skip- Graphen S mit n Knoten O(log n) Nachrichten und O(log n) Zeit. Beweis. Bei einem festen Alphabet mit p = Σ Elementen verwendet das Einfügen auf Ebene 0 eine Such-Operation nach 2 O(log n) Nachrichten und Zeit. Bei der Suche der Nachbarn für jede andere Ebene werden durchschnittlich 1 p Knoten durchlaufen. Die Anzahl der Ebenen im Skip-Graphen ist O(log n). Damit ergibt sich eine erwartete Anzahl benötigter Nachrichten: log n ( ) 1 O(log n) + O = O(log n + 1 log n) (2) p p 0 = O(log n) (3)

233 P2P: Skip-Graph 225 Abb. 8. Der eingefügte Knoten sucht durch Vergleichen des Mitgliedschaftsvektors seiner Nachbarn, seine Nachbarn auf höherer Ebene. 3.3 Entfernen von Peers Das Löschen von Knoten ist eine einfache und schnelle Operation. Zunächst entfernt sich der Peer von allen Listen der Ebenen gößer 0 - dies kann parallel erfolgen. Anschließend entfernt er sich auch aus der Liste von Ebene 0. 1 l ö s c h e ( Knoten u ) 2 3 Für a l l e Ebenen > 0 4 Lösche u aus der L i s t e 5 6 Lösche u aus der L i s t e auf Ebene 0 Listing 2. Suchen in einem Skip-Graphen Lemma 4. Ohne gleichzeitigen Zugriff benötigt die Lösch-Operation in einem Skip-Graphen O(log n) Nachrichtne und O(1) Zeit. Beweis. Wir nehmen an, dass die Lösch-Operation in einer verketteten Liste O(1) Nachrichten und Zeit braucht. Da dies in allen Liste bis auf Ebene 0 parallel geschehen kann, benötigen wir nur O(1) Zeit. Bei der Anzahl der Nachrichten müssen wir die Anzahl der Listen, die gleich der Höhe des Skip-Graphen ist, berücksichtigen: log n 0 O(1) = O(log n) (4)

234 226 M. Borowski 3.4 Operationen bei mehrfachem gleichzeitigen Zugriff Da jeder Peer sich selbst verwaltet, ist ein kontrollierter Zugriff von mehreren Peers auf den Skip-Graphen nicht möglich. Die vorgestellten Algorithmen stellen jedoch sicher, dass zu jedem Zeitpunkt die Liste auf Ebene 0 korrekt ist. Damit ist gegeben, dass auch mehrfache gleichzeitige Operationen korrekt durchgeführt werden. Die Listen höherer Ebenen dienen nur zur effizienteren Suche der Knoten und beeinträchtigen deshalb die Funktionalität des Skip-Graphen nicht. 4 Qualitätsanalyse Im vorherigen Kapitel wird die Effizienz und Korrektheit der Operationen auf einem Skip-Graphen gezeigt. Entwickelt wurde diese Datenstruktur für den Aufbau eines P2P- Netzwerkes. Hier ergeben sich jedoch viele Fehlerquellen, die die Qualität des Netzes beeinträchtigen. Im folgenden wird deshalb die Güte eines Skip-Graphen mit dem Alphabet {0, 1} für P2P-Netze untersucht. 4.1 Fehlertoleranz Eine große Herausforderung beim Design eines P2P-Netzes ist die Eigenschaft, dass sich die Topologie durch das Hinzufügen und Entfernen von Peers ständig ändern kann. Es kann nicht davon ausgegangen werden, dass jeder Peer, der das Netzwerk verlässt, vorher ordnungsgemäß die Lösch-Operation ausführt. Die Robustheit des Skip-Graphen ergibt sich deshalb aus dem Verhältnis von ausgefallenen Peers zu denen, die dadurch den Zusammenhang zum Netzwerk verloren haben. Randomisierter Ausfall von Peers Zunächst nehmen wir an, dass jeder Knoten mit der gleichen Wahrscheinlichkeit ausfallen kann. [AspnesS2003] zeigen in ihren Simulationen, dass bis du einer Ausfallwahrscheinlichkeit von 60% fast alle Knoten in der großen Zusammenhangskomponente verbleiben. Erst bei größeren Werten werden viele Knoten isoliert, wenn ihre gesamte Nachbarschaft ausfällt. Dies bedeutet, dass ein P2P Netz, dass auf einem Skip-Graphen aufbaut, sehr robust gegenüber zufälligen Fehlern ist. Ungünstige Ausfälle von Peers Neben dem Zufälligen und damit gleichmäßig verteilten Ausfall von Peers interessiert bei der Robustheit von Skip-Graphen auch der Ausfall größerer benachbarter Bereiche. Aufgrund der Sortierung der Peers im Skip-Graphen kann der Ausfall eines Rechners oder physikalischen Netzes den Ausfall großer benachbarter Knoten zur Folge haben. Im folgenden

235 P2P: Skip-Graph 227 versuchen wir deshalb eine Kombination von Peers zufinden, deren Ausfall den Zusammenhang zerstört. Hierzu untersuchen wir den Expansionsgrad vom Skip-Graphen G. Der Expansionsgrad von einer Menge Knoten A G ist definiert als δa / A, wobei δa die Anzahl der Knoten ist, die zu A benachbart, aber selbst nicht in A enthalten sind. Abb. 9. Beispiel für ein Set A und der damit erzeugten Menge δa Der Expansionsgrad des Graphen G ist der minimale Expansionsgrad aller Teilmengen A mit 1 A n 2. Fallen alle Knoten von A aus, haben alle Knoten von δa fehlerhafte Kanten. Im Folgenden wird deshalb eine untere Schranke für den Expansionsgrad bestimmt. Die Menge δ l A G enthält alle Knoten, die nicht in A liegen, aber durch eine Kante auf Ebene l mit einem Knoten aus A benachbart sind. Damit gilt: δa = l δ l A (5) δa max l δ l A (6) Lemma 5. Die Anzahl ) der Sets A mit A = m < n und δ 0 A < s ist kleiner als: s 1 r=1 ( m+1 r )( n m 1 r 1 Beweis. Zuerst werden alle Knoten von 1 bis n durchnummeriert und ein Bit-Vektor x = x 1 x 2... x n defininert, wobei gilt: { 1, falls Knoten i A x i = 0, sonst Damit sind alle Knoten, die durch eine 0 repräsentiert werden und zu einer 1 benachbart sind, in δa enthalten. Um sicher zu stellen, dass der Bit-Vektor immer mit einer 1 sowohl beginnt als auch aufhört, wird ein weiterer Vektor x = 1x1 definiert. Dieser Vektor besteht alternierend aus Einser- und Nuller-Folgen, wobei die Anzahl der Nuller-Folgen r um eins kleiner als die der Einser-Folgen (r + 1) ist. Da A eine echte Teilmenge ist (A G), ist

236 228 M. Borowski Abb. 10. Beispiel für ein Set A und der dazugehörigen Teilmenge δ 0A mit δ 0A = 2 und r = 2 mind. eine 0 im Bit-Vektor enthalten. Jede Nuller-Folge enthält einen oder zwei Knoten aus δa: r δ 0 A 2r (7) Nun Summieren wir die Anzahl der Bit-Vektoren x auf, die n m Nullen enthalten und aus r Nuller-Intervallen bestehen. Es gibt ( ) n m 1 r 1 Möglichkeiten n m Nullen auf die r Nuller-Intervalle zu verteilen. Für die m + 2 Einser gibt es ( ) m+2 1 r+1 1 Möglichkeiten sie auf r+1 Intervalle verteilt zu werden. Beide Verteilungen sind voneinander unabhängig, deshalb ergibt sich als obere Schranke: s 1 ( )( ) m n m 1 r r 1 r=1 s 1 ( )( ) m + 1 n m 1 = r r 1 Nun können wir mit hoher Wahrscheinlichkeit zeigen, dass für alle Ebenen l > 0 δ l A selten klein sein wird. Lemma 6. Sei A eine Teilmenge mit m n/2 Knoten in einem Skip-Graph S mit n Knoten. Dann gilt für jede Ebene l > 0: P [ δ l A 1 3 2l ] < 2 ( ( 2 l 2 ) m ) 2 3 2l 3 Beweis. Wenn für ein b Σ l ein Knoten u S existiert, sodass auch ein Knoten v S A mit b = m(u) h = m(v) h existiert, dann gibt es ein Knotenpaar v A und v S A, die benachbart sind. Da diese Paare verschieden für unterschiedliche b sind, können wir eine untere Schranke für δ l A berechnen. Sei T (A) die Menge von bs, für die A einen Knoten aus S b enthalten, Dann gilt: P [ T (A) < 23 ] 2l P [T (A) B] r=1 B S, B = 2 3 2l (8) ( ) ( ) 2 l 2 A 2 3 (9) 2l 3

237 und für die restliche Menge S A: P2P: Skip-Graph 229 P [ T (S A) < 23 ] ( ) ( ) 2 l 2 S A 2l 2 3 (10) 2l 3 Da beide Mengen T (A) und T (S A) mind. zwei Drittel aller b enthalten, muss die Schnittmenge mind. ein Drittel der b enthalten: P [ T (A) T (S A) < 13 ] ( ) ( ( ) 2 l 2 A ( ) ) 2 S A 2l l ( 2 l 2 3 2l ) ( 2 3) A (11) Damit gibt es nicht genug Teilmengen A G mit kleinem δ 0 A, damit die Wahrscheinlichkeit, dass eine Teilmenge auch ein kleines δ l A hat, groß genug ist. 4.2 Auslastung der Peers Bei einem Skip-Graph kann gezeigt werden, dass die Auslastung von Peers bei einer hohen Last Suchanfragen an ein bestimmtes Element mit der Distanz stark abnimmt. Die Wahrscheinlichkeit, dass die Suche einen bestimmten Knoten zwischen den Startknoten und dem Zielknoten benutzt, ist umgekehrt proportional zur Distanz des Knotens zum Ziel. Hierbei ist jedoch die Gleichverteilung des Mitgliedsvektors entscheident. Unglücklicherweise kann es sein, dass ein Knoten durch ungünstige Mitgliedsvektoren immer schnell zu einen Suchpfad führt, der einen Knoten in der Nähe eines sehr populären Knoten beinhaltet. Zudem wird für den Startknoten angenommen, dass er immer einen zufälligen Mitgliedvektor hat. Theorem 1. Gegeben sei ein Skip Graph S mit dem Alphabet {0, 1}. Bei einer Suche von s nach t ist die Wahrscheinlichkeit für einen Knoten u mit s < u < t und dem Abstand d nach t, dass der Suchpfad u durchläuft kleiner als 2 d+1. Beweis. u íst im Suchpfad von s nach t enthalten, wenn es keinen Knoten zwischen u und t gibt, der in einer höheren Ebene in einer gemeinsammen Liste mit s enthalten ist. Es existieren d + 1 Knoten in diesen Interval. Sei T eine Zufallsvariable, die alle Knoten der höchsten Ebene enthält.

238 230 M. Borowski Abb. 11. u ist im Suchpfad von s1 nach t enthalten. Im Suchpfad von s2 nach t nicht. d+1 k P (u T ) = P ( T = k) d + 1 = = = = = k=1 E( T ) d T T T T 1 T + T + ( n 2 1 T 1 k=1 T 1 k=1 ( n 1 ( ) n k ) E(1) + 2 ) P (1) + 2 (12) (13) E(k) /(d + 1) (14) T 1 k=2 T 1 k=2 ( n k ( ) n k P (k) /(d + 1) (15) ) P (k) /(d + 1) (16) ( ) n P (k)/(d + 1) (17) k = 2P ( T )/(d + 1) (18) 2 d + 1 (19) Der letzte Schritt ergibt sich, da P (n) mit P (0) = 0, P (1) = 1 und P (n) = 1 n 1 ( n ) 2 n 1 k=1 k P (k) kein Wert größer 1 ist. 5 Varianten und Erweiterungen Von der in den vorigen Kapiteln vorgestellten Datenstruktur Skip-Graph gibt es einige Variationen, die im folgenden vorgestellt werden.

239 P2P: Skip-Graph 231 Abb. 12. Erwartete und simulierte Nachrichtenlast in einen Skip-Graph mit Knoten und den Zielknoten (aus [AspnesShah]) 5.1 Mehrere Nachfolger James Aspnes zeigt in seiner Ausarbeitung [AspnesShah], dass es sinnvoll sein kann, statt nur eines Nachbarn in jeder Ebene mehrere Nachfolger zu speichern. Bei einer Ausfall- Abb. 13. Anzahl der fehlgeschlagenen Suchläufe in einen Skip-Graph mit Knoten und Nachrichten. Jeder Knoten hat bis zu 5 Nachfolger auf jeder Ebene (aus [AspnesShah]) wahrscheinlichkeit von 60% für jeden Knoten ist eine Suche im vorgestellten Skip-Graphen praktisch nicht mehr möglich. Speichert man aber zusätzlich immer die nächsten 5 Nachfol-

240 232 M. Borowski ger auf jeder Ebene, so ist eine Suche in mehr als 2 3 der Fälle weiterhin erfolgreich möglich. Der Speicherbedarf ändert sich hierbei nur um einen konstanten Faktor (siehe Abbildung 13). 5.2 SkipNet An der Universität von Washington in Seattle und bei Microsoft wurde unabhängig von der Entwicklung des Skip-Graphen eine sehr ähnliche Struktur für P2P-Netzwerke entwickelt. Harvey et al. [Harvey03] beschreibt eine Datenstruktur, die auf einfach, zirkular verketteten Listen aufbaut. Die Operationen sind wie beim Skip-Graphen implementiert, nur dass im Abb. 14. Aufbau eines SkipNet nach [Harvey03] SkipNet die Rechner einer Domain als ein Knoten auftauchen. Die einzelnen Daten werden innerhalb einer Domain wieder mittels der verteilten Hashtabelle aufgeteilt. Der Vorteil der zirkulären Listen ist die gleichmäßigere Auslaustung der Peers. [AspnesShah] zeigt jedoch auf, dass es bei Linkfehlern sehr schwer ist, die Struktur wieder zu reparieren. 5.3 Expander Graphen in Skip-Graphen J. Aspnes und U. Wieder [AspnesWieder2005] zeigen, dass in einen Skip-Graph mit hoher Wahrscheinlichkeit ein 4-regulärer Expander enthalten ist. Dies führt zu den Ergebnis, dass der Expansiongrad nicht wie vorher gezeigt Ω(1/ log n), sondern sogar Ω(1) ist und damit jede Teilmenge, die weniger als die Hälfte der Knoten (m < n/2) enthält Ω(m) Nachbarn hat. Damit ist die Fehlertoleranz besser als zuvor angenommen. Es kann gezeigt werden, dass bei einem Ausfall einer konstanten Anzahl von Knoten immer noch eine konstante Anzahl in einem Graphen verbleibt.

241 P2P: Skip-Graph Zusammenfassung und Fazit In dieser Ausarbeitung wurde die Datenstruktur des Skip-Graphen und einige Variationen vorgestellt. Sie ermöglicht die verteilte Datenspeicherung und bietet gegenüber dem gebräuchlichen DHT-Verfahren einige wichtige Vorteile. Im Vergleich mit CAN und Chord wird eine bessere Performance erreicht. Die Laufzeiten für das Erreichen von Knoten ist gleich, jedoch benötigt das Einfügen neuer Knoten mit O(log 2 n) mehr Zeit als im Skip-Graphen mit O(log n). Zudem sind Skip-Graphen auch robuster, da sie im Gegensatz zu verteilten Hashtabellen auch bei gezieltem ungünstigen Löschen von Knoten nur begrenzt Schaden nehmen. Ein weiterer großer Vorteil von Skip- Graphen ist aufgrund ihrer Sortierung die Möglichkeit einfach Bereichsanfragen zu stellen. Es existiert aber derzeit noch kein in der Praxis verwendetes P2P-Netz, das auf einem Skip- Graph aufbaut. Alle getroffenen Annahmen sind aufgrund von Simulationen entstanden. Es wird sich deshalb noch zeigen müssen, ob sich P2P-Netze basierend auf Skip-Graphen durchsetzen können. Literaturverzeichnis AspnesS2003. J. Aspnes and G. Shah Skip graphs. Fourteenth Annual ACM-SIAM Symposium on Discrete Algorithms, Jan 2003, AspnesShah. J. Aspnes and G. Shah. Skip graphs. ACM Journal AspnesWieder2005. J. Aspnes and U. Wieder The expansion and mixing time of skip graphs with applications. SPAA 05: Proceedings of the seventeenth annual ACM symposium on Parallelism in algorithms and architectures, 2005, Harvey03. J.A. Harvey, M.B. Jones, S. Saroiu, M. Theimer and Alec Wolman SkipNet: A Scalable Overlay Network with Practical Locality Properties NaorWieder06. M. Naor and U. Wieder. Novel Architectures for P2P Applications: the Continuous.Discrete Approach MahlSchindel07. Peter Mahlmann und Christian Schindelhauer Peer-T to-peer-netzwerke: Algorithmen und Methoden. Springer-Verlag Berlin, 1. auflage, Jul.2007, ISBN PUGH90. Pugh, W Skip Lists: A Probabilistic Alternative to Balanced Trees. Communications of the ACM 33,6 (June), Groli07. Dominik Grolimund P2P Online Storage Web 2.0 Expo Berlin, 2007 Rat00. S. Ratnasamy, P. Francis, M. Handley, R. Karp and S. Shenker. A Scalable Content- Addressable Network. Proceedings of ACM SIGCOMM 2001, Schoder02. Detlef Schoder, Kai FischbachPeer-to-Peer(2002) Springer Verlag SMK01. Stoica, Morris, Karger, Kasshoek, Balakrishnan Chord: A scalable Peer-To-Peer lookup service for internet applications. Proceesings of the 2001 ACM SIGCOMM Conference, 2001, OReilly01. Peer to Peer oder das Netz als Computer Ein Kommentar von Tim O Reilly 2001 O Reilly verlag Napster - P2P Filesharing - MP3 Suche ohne Suchmaschinen Freenet - statt Suchmaschinen - p2p Filesharing Gnutella - P2P Filesharing - MP3 Suche ohne Suchmaschinen Wua.la - Ihre kostenlose Online-Festplatte Herwig. Björn A.Herwig, Seminar Internet Computing Peer-to-Peer Networking PCWELT0803. PC-WELT : Peer-to-Peer-Netze (27. AUGUST 2003)

242

243 Kinetische Datenstrukturen für zweidimensionale Probleme Sabine Naewe Universität Paderborn Zusammenfassung. In meiner Seminararbeit werde ich mich mit kinetischen Datenstrukturen für zweidimensionale Probleme beschäftigen. Das Vorgehen hierbei werde ich am Beispiel zweier grundlegender Probleme erläutern, welche repräsentative Beispiele für Bewegungsprozesse sind. Das Problem der konvexen bzw. oberen Hülle von n Punkten gehört zur Kategorie der Umfangsprobleme, während das Problem des dichtesten Paares zur Kategorie der Nähe- und Schnittprobleme gehört. Für beide Probleme werden als erstes kinetische Datenstrukturen entwickelt und diese dann für die Bewegung der Elemente modifiziert. 1 Einführung Die konvexe Hülle Berechnung der oberen Hülle zweier Ketten Analyse des Beweisschemas Aktualisierung der konvexen Hülle Divide and Conquer Algorithmus für die obere Hülle Dichtestes Paar Statischer Algorithmus Die Bewegung der Elemente Zusammenfassung Literaturverzeichnis Einführung In meiner Seminararbeit werde ich die Idee einer kinetischen Datenstruktur für zwei zweidimensionale Probleme vorstellen. Kinestische Datenstrukturen sind ein Konzept zur Berechung bestimmter Attribute von kontinuierlichen Modellen, wobei sie diese während der betrachteten Zeitspanne aufrechterhalten. Eine Einführung in dieses Thema liefert [5]. Die Arbeit gliedert sich in zwei nicht aufeinander aufbauende Abschnitte. Der erste Abschnitt erläutert eine kinetische Datenstruktur für das Problem der konvexen Hülle einer zweidimensionalen Punktmenge. Im zweiten Abschnitt wird dann eine Datenstruktur für das Problem des dichtesten Paares einer zweidimensionalen Menge vorgestellt.

244 236 Sabine Naewe 2 Die konvexe Hülle In diesem Abschnitt betrachtet wir nun das Problem der konvexen Hülle. Gegeben seien n Punkte im zweidimensionalen Raum. Gesucht ist nun die konvexe Hülle dieser n Punkte. Definition 1. Die konvexe Hülle einer n elementigen Menge ist definiert als die kleineste konvexe Menge, welche die n Punkte enthält. Dabei heißt eine Menge M konvex, falls gilt: a, b M : t [0, 1] : ta + (1 t)b M Anschaulich enthält eine konvexe Menge M für jedes Paar von Elementen aus M auch die Strecke zwischen diesen beiden Punkten. Sie wird durch ihre Eckpunkte beschreiben. Eine konvexe Hülle kann man in obere und untere Hülle aufteilen. Um die obere Hülle zu berechnen, werden als erstes alle Punkte nach ihrer x-koordinate lexikographisch sortiert. Danach durchläuft man die Punkte im mathematisch positiven Sinne und verbindet alle geordneten Punkte. Ergibt sicht dabei eine Einbuchtung nach innen, werden die inneren Punkte entfernt. Eine innere Einbuchtung wird hierbei durch einen Winkel repräsentiert, welcher kleiner als 180 ist. Die untere Hülle erhält man analog. Um nun die konvexen Hülle zu berechnen, benutzt man einen Divide and Conquer Ansatz. Dabei wird zufällig unsere Ausgangsmenge in etwa zwei gleich große Untermengen geteilt, von denen man nun rekursiv die konvexe Hülle berechnet. Anschließend mischen wir diese beiden Ergebnisse, um die konvexe Hülle der gesammten Menge zu bekommen. Bei diesem Vorgang betrachtet man die parallelen Tangenten der beiden Hüllen um die endgültige Menge zu bekommen. In dieser Arbeit berechnen wir nur die obere konvexe Hülle und benutzten die duale Transformation um einem Punkt (p, q) die Linie y = px + q zuzuordnen, da es einfacher ist den Algorithmus für Linien zu beschreiben. Im dualen Raum ist es nun das Ziel, die obere Hülle einer Familie von Linien zu erhalten. Dabei können sich die Parameter der Linien kontinuierlich aber vorhersehbar ändern. Um dieser Bewegung Rechnung zu tragen, wird der Divide and Conquer Algorithmus modifiziert, indem man die obere konvexe Hülle der Untermengen berechnet. Der entscheidene Punkt ist hierbei die Berechnung der oberen Hülle aus den oberen Hüllen von zwei Untermengen. Dafür betrachten wir die Linien als konvexe, stückweise definierte lineare Funktionen. 2.1 Berechnung der oberen Hülle zweier Ketten Im Folgenden befinden wir uns im Dualen und betrachten die duale Tranformation der Ausgangsmenge. Wir definieren in unserem Algorithmus eine konvexe, stückweise definiert lineare Funktion als doppeltverkettete Liste mit Ecken und Kanten, welche von von links nach rechts geordnet ist. Diese Darstellung nennen wir eine Kette. In diesem Abschnitt betrachen wir nun zwei Untermengen als blaue und rote Kette und erläutern eine kinetische Datenstruktur, um die lila Menge zu erhalten, welche die obere Hülle der roten und blauen Kette darstellt. Um den Algorithmus darstellen zu können, definieren wir im nächsten Absatz hierfür wichtige Mengen und Begriffe. Da wir bei diesem Problem die Hauptaufmerksamkeit auf die Kanten richten werden, bezeichen wir die Kanten mit Kleinbuchstaben und nennen die Ecke zwischen den Kanten a und b die Ecke ab. Eine Konfiguration bezeichnet nun

245 Kinetische Datenstrukturen für zweidimensionale Probleme 237 eine Darstellung aller Ecken und Kanten, so dass beide Ketten konvex sind. Für eine Ecke ab bezeichnen wir die Kante der anderen Kette, welche darüber oder darunter liegt, als rivalisierende Kante (engl.: contender edge ) und kennzeichnen sie mit ce(ab). Jeder Knoten hat dann einen Zeiger auf die rivalisierende Kante. Wir kennzeichnen mit χ( ) die Farbe (rot oder blau) einer Ecke oder Kante. Schließlich bezeichnen wir mit ab.prev bzw. ab.next die blaue oder rote Ecke, welche auf der linken bzw. rechten Seite von ab am nächsten bei ab liegt. Diese Ecke kann leicht durch das Vergleichen der x-koordinaten der benachbarten Ecke in der Kette von ab mit einer der Eckpunkte der rivalisierenden Kante von ab berechnet werden. Um die rote und blaue Kette in einem Mischdurchlauf miteinander vergleichen zu können, benötigen wir zwei verschiedene Typen von Zertifikaten: Die x-zertifikate definieren die horizontale Ordnung der Ecken, während die y-zertifikate die vertikale Ordnung in Hinsicht auf die rivalisierende Kante untersucht. Wir bezeichnen diese mit < x bzw. < y. Wenn wir alle diese Vergleiche aber als Zertifikate behandeln, ist die erhaltende kinetische Datenstruktur nicht mehr lokal, da eine gegebene Kante die rivalisierende Kante von O(n) vielen Ecken der anderen Hülle sein kann. Deswegen definieren wir eine alternative Menge von Zertifikaten, welche auch Vergleiche zwischen Linienpaaren bzgl. der Steigung, mit < s gekennzeichnet, enthalten. Dadurch kann dann überprüft werden, ob der Winkel zwischen zwei Linien kleiner als 180 ist. Mit diesen drei Arten von Zertifikaten kann die Anzahl der Zertifikate erheblich einschränkt werden. Name Vergleich Bedingung x[ab] [ab < x cd] cd = ab.next χ(ab) χ(cd) yli[ab] [ab < y or > y ce(ab)] b ce(ab) yri[ab] [ab < y or > y ce(ab)] a ce(ab) yt[ab] [ce(ab) < y ab] a < s ce(ab) < s b slt[ab] [a < s ce(ab) ce(ab) < y ab srt[ab] [ce(ab) < s b] sl[ab] [b < s ce(ab)] b < s ce(ab) ab < y ce(ab) χ(ab) χ(ab.next) sr[ab] [ce(a) < s a] ce(ab) < s a ab < y ce(ab) χ(ab) χ(ab.prev) Tabelle 1. Zertifikate für die obere Hülle zweier Ketten In Tabelle 2.1 werden die modifizierten Zertifikate definiert. Die erste Spalte enthält den Namen der Zertifikate, die zweite enthält den Vergleich, welchen dieses Zertifikat garantiert und die dritte Spalte enthält zusätzliche Bedingungen für das Zertifikat, damit es in der kinetischen Datenstruktur enthalten ist. Die erste Zeile definiert ein Zertifikat mit Namen x[ab]. Dieses existiert nur in der Datenstruktur, wenn ab und cd Nachbarn sind und in unterschiedlichen Ketten liegen (Bedingung). Um dies zu überprüfen, müssen die x-koordinate der Ecken ab und cd miteinander verglichen werden. Die Ungleichung muss nun nach t gelöst werden, um den ersten Zeitpunkt zu berechnen, an dem das Zertifikat seine Gültigkeit verliert, also der Knoten cd nicht mehr der rechte Nachbar von ab ist.

246 238 Sabine Naewe Das Zertifikat x[..] definiert die exakte x-ordnung der Knoten, während die Zertifikate yli[..] und yri[..] den Schnitt zweier Kanten in verschiedenen Ketten darstellt. Wenn eine Kante nicht in der oberen Hülle liegt, ordnen die Zertifikate seine Steigung in die Folge aller Kantensteigungen ein. Entweder geschieht dies mit den drei tangetialen Zertifikaten yt[..], slt[..] und srt[..] oder das Zertifikat sl[..] bzw. sein symmetrisches Zertifikat sr[..] zeigt, dass keine Tangente vorhanden ist. Abhängig von den Positionen der roten und blauen konvexen Ketten werden in Abbildung 1 verschiedene Zertifikate benutzt um die Überschneidungsstruktur (oberer Fall) oder das Nichtüberschneiden (mittlerer und unterer Fall) zu zertifizieren. Die Pfeile zeigen dabei die Vergleiche zwischen Ecken oder Kanten an. Schließlich benötigen wir noch Abstandszertifikate zwischen den beide Kanten am linken bzw. rechten Rand der Kette. Abb. 1. Darstellung der modifizierten Zertifikate 2.2 Analyse des Beweisschemas In diesem Abschnitt beweisen wir die Lokaltität des Beweisschemas und ihre korrekte Berechnung der oberen Hülle. Lemma 1. Die Lokaltität des obrigen Beweisschemas hat Komplexität O(1). Beweis. Sei a eine beliebige Kante. Wir müssen nun die Anzahl der Zertifikate berechnen, in denen a im Gültigkeitsbeweis des Schemas vorkommt. Ohne Beschränkung der Allgemeinheit kommt a in einem Zertifikat vor, da einer der Eckpunkte in einem Zertifkat vorhanden ist. Jede Ecke kann höchsten in zwei x[..] Zertifikaten vorkommen, da jede Ecke jeweils

247 Kinetische Datenstrukturen für zweidimensionale Probleme 239 nur einen rechten und linken Nachbarn besitzt. Außerdem kann er nur in jeweils einem der anderen Zertifikattypen vorkommen. Deswegen müssen wir nur die Anzahl der Zertifikate berechnen, in denen a als rivalisierende Kante vorkommt. Wenn a im Schnitt mit der anderen Kette liegt, kann die Kante als rivalisierene Kante in den Zertifikaten yli[..] und yri[..] liegen. Diese Konstellation kann nur zweimal auftreten, da a nach Definition der oberen Hülle höchstens zweimal von der anderen Kette geschnitten werden kann. Wenn a nicht von der anderen Kette geschnitten wird, kann a in höchstens zwei Dreiergruppen der tangentialen Zertifikate vorkommen. Das eine Zertifikat gilt, wenn a über einem Teil der andere Kette liegt und das andere, wenn sie unter einem Teil der anderen Kette liegt. Schließlich nehmen wir an, dass a die rivalisierene Kante von vielen Ecken ist. Dann haben diese Knoten alle die gleiche Farbe. Damit können nur der linkeste und der rechteste Knoten a als rivalisierende Kante in sl[..] oder sr[..] enthalten. So besitzt die Lokalität des Beweisschemas Komplexität O(1). Lemma 2. Die Menge der obigen Zertifikate beschreiben die obere Hülle. Beweis. Sei Π ein Konfiguration mit der Zertifikatenmenge L und Π ein andere Konfiguration, in der diese Zertifikate gültig sind. Wir zeigen, dass die obere Hülle von Π die gleichen Ecken enthält wie die obere Hülle von Π. Die x-zertifikate beweisen die Korrektheit der Zeiger der rivalisierenden Kanten. Jeder Knoten, welcher in einem y-zertifikat in L enthalten ist, befindet sich nach Voraussetzung auch in Π und in Π. Es bleibt zu zeigen, dass Ecken ohne y-zertifikate nicht nur in Π oder Π liegen. Sei S eine maximale Menge von benachbarten Ecken ohne y-zertifikate in L. Ohne Beschränkung der Allgemeinheit nehmen wir an, dass die rote Kette in diesem Teilabschnitt von Π unter der blauen Kette liegt. Sei (x) die Differenz zwischen der roten und blauen Steigung bei x in Π. Diese Funktion steigt bei roten Ecken und fällt bei blauen Ecken. Sie ändert nicht ihr Vorzeichen bei einer roten Ecke von S, da dies ein yt[..] Zertifikat in L bedeuten würde. So ist (x) in dem Intervall von S positiv bis zu einer bestimmten blauen Ecke und ab dann negativ. Wenn nun a die rivalisierende Kante dieser Ecke ist, existieren sl[..] Zertifikate zu der linken Kante des linken Endpunktes von a und sr[..] Zertifikate zu der rechten Kante des rechten Endpunktes von a. Diese Zertifikate garantieren, dass die rote Kette auf dem Interval von S über der blauen Kette bleibt. 2.3 Aktualisierung der konvexen Hülle Das letzte Lemma zeigt, dass die obrige Liste der Zertifikate ausreichend ist, um die obere Hülle zu erhalten. Um eine kinetische Datenstruktur zu erhalten, speichern wir alle Zertifikate in einer globalen Queue, in der diese nach ihrem Fälligkeitsdatum gespeichert sind. Wenn das erste Ereignis in der Queue eintritt, müssen wir die Liste der Zertifikate aktualisieren. Die Algorithmen für diese Veränderungen sind für jeden Ereignistyp im Folgenden dargestellt. Die graphische Darstellung einer Veränderungen wird in Abbildung 2 gezeigt.

248 240 Sabine Naewe Dabei fehlen drei Fälle. Es fehlen die gespiegelten Fälle von Fall 1 und Fall 3, und die Ereignisse, welche von den x-zertifikaten abhängen. Abb. 2. Darstellung einiger Ereignisse Algorithmus 22 Ereignis: Ungültigkeit von yli[ab] 1: Lösche yri[ab.next], yli[ab]; 2: if yri[ab] then 3: Lösche yli[ab.prev], yri[ab]; 4: Erzeuge slt[ab], srt[ab], yt[ab]; 5: Hole ce(ab) von der Ausgabe; 6: else 7: Erzeuge yri[ab], yli[ab.prev]; 8: Füge a hinzu oder hole b aus der Ausgabe; Als Beispiel betrachten wir den Fall, dass das Zertifikat yt[ab], welches dem Fall 4 in Abbildung 2 entspricht, nicht mehr gültig ist. In diesem Fall bewegt sich eine rote Kante über eine blaue Ecke. Als erstes löschen wir die drei Zertifikate, welche beweisen, dass die rote Kante über der blauen liegt (letzter Fall in Abbildung 1). Dann fügen wir die Zertifikate

249 Algorithmus 23 Ereignis: Ungültigkeit von yt[ab] 1: Lösche yt[abt], slt[ab], srt[ab]; 2: Erzeuge yt[ab], yri[ab.next]; 3: Erzeuge yri[ab], yli[ab.prev]; 4: Füge ce(ab) zur Ausgabe hinzu; Kinetische Datenstrukturen für zweidimensionale Probleme 241 Algorithmus 24 Ereignis: Ungültigkeit von slt[ab] 1: Lösche slt[ab], srt[ab], yt[ab]; 2: cd ab.prev; 3: if d = a then 4: Erzeuge slt[cd], srt[cd], yt[cd]; {z.b. gleiche Farbe} 5: else 6: Erzeuge sl[cd]; Algorithmus 25 Ereignis: Ungültigkeit von sl[ab] 1: Lösche sl[ab]; 2: cd ab.prev; 3: if χ(cd) χ(ab) then 4: Erzeuge slt[cd], srt[cd], yt[cd]; 5: else 6: if ce(cd) cd(ab) then 7: Erzeuge sr[cd]; hinzu, welche die zwei neuen Schnitte darstellen. Schließlich fügen wir die neue Kante der oberen Hülle zur Ausgabe hinzu. Die zu den Zertifikaten yri[ab], sr[ab] und srt[ab] symmetrischen Ereignisse sind die Zertifikaten yli[ab], sl[ab] und slt[ab]. Im Allgemeinen muss die Ausgabe geändert werden, falls sich ein y-zertifikat ändert. Dabei werden entweder zwei Nachbarecken zu einer einzigen oder eine Ecke wird umgekehrt zu zwei verschiedenen Ecken, welche nun benachbart sind. Um dies rekuriv zu konstruieren, benötigen wir eine Möglichkeit lokale Strukturveränderungen in der Eingabe behandeln zu können. Damit erreichen wir, dass wir nur lokale Veränderungen vornehmen müssen und verringern die Laufzeit. Wenn nun zum Beispiel die Kante b zwischen den Kanten a und c verschwindet, existieren die Ecken ab und bc nicht mehr. Dafür entsteht nun die Ecke ac. Kurz bevor dieser Fall eintritt, kann b keine rivalisierende Kante zu einem anderen Knoten sein. Damit muss nur eine konstante Menge von Zertifikaten verändert oder gelöscht werden. Diese enthalten in der Klammer ihres Namens ab oder bc und enthalten nun stattdessen ac. Im umgekehrten Fall erscheint eine Kante b und teilt damit eine Ecke ac in zwei Ecken ab und bc. Damit müssen nur die Zertifikate mit ac im Namen geändert werden. Ein Steigungsvergleich zwischen b und der rivalisierenden Ecke von ac erfordert die Entscheidung, welcher der neuen Knoten die, falls vorhandenen, tangentialen Zertifikate erhalten muss. 2.4 Divide and Conquer Algorithmus für die obere Hülle In diesem Abschnitt wollen wir nun eine Struktur vorstellen, die eine Punktmenge und ihre Teilmengen verwaltet, um optimal die konvexe Hülle der Gesamtmenge berechnen zu können. Um diesen Divide and Conquer Ansatz umzusetzten, betrachten wir als erstes einen binären Baum. Ein Knoten ist nun dafür verantwortlich, die obere konvexe Hülle

250 242 Sabine Naewe Algorithmus 26 Ereignis: Ungültigkeit von x[ab, cd] 1: Lösche x[ab, cd]; 2: Erzeuge x[cd, ab]; 3: if x[cd, cd.next] then 4: Lösche x[ab.prev, ab]; 5: else 6: Erzeuge x[ab.prev, cd]; 7: if x[cd, cd.next] then 8: Lösche x[cd, cd.next]; 9: else 10: Erzeuge x[ab, cd.next]; 11: cd.prev ab.prev; 12: ab.next cd.next; 13: cd.next ab; 14: ab.prev cd; 15: ce(ab) d; 16: ce(cd) a; 17: /* Aktualisierung der Überschneidungszertifikate /* 18: if yri[ab] then 19: Lösche yri[ab]; 20: Erzeuge yri[cd]; 21: if yli[cd] then 22: Lösche yli[cd]; 23: Erzeuge yli[ab]; 24: /* Aktualisierung der Steigungszertifikate, wenn ab unter cd ist /* 25: if ab < y d then 26: if yt[cd] then 27: Lösche slt[cd], srt[cd], yt[cd] 28: if sl[ab] then 29: Lösche sl[ab]; 30: if χ(ab) χ(cd) & b < s d then 31: Erzeuge sl[ab]; 32: if χ(cd.prev) χ(cd) & cd.prev < y ce(cd.prev) & a < s c then 33: Erzeuge sl[cd.prev]; 34: else 35: if sr[ab] then 36: if a < s d then 37: Lösche sl[cd.prev]; 38: Erzeuge slt[cd], srt[cd], yt[cd]; 39: else 40: Aktualisiere sr[ab] mit dem Punkt des neuen cd(ab); 41: /* Analog für cd liegt unter ab/* der beiden Untermengen, die sich in den Kinderknoten befinden, zu berechnen. Wenn sich in einem der Kinderknoten etwas ändert, muss auch der Elternknoten neue Berechnungen durchführen und gibt wiederum seine neue Ausgabe an seinen Elternknoten weiter. So erhält man schließlich in der Wurzel die obere konvexe Hülle der Gesamtmenge. Diese Struktur besitzt Lokalität O(log n) und Antwortzeit O(log 2 n). Analog zur Tournament Datenstruktur in [5] anaysieren wir die Effizienz unser Datenstruktur, indem wir die Zeit als eine zusätzliche statische Dimension betrachten. Dann betrachten wir jedes Ereignis als Element einer drei-dimensionalen Struktur mit bekannter worst-case Komplexität. Die erste Version unseres Problems ist für diesen Analyseansatz schlecht geeignet, da die statische Struktur der konvexen Hülle während der Berechnung

251 Kinetische Datenstrukturen für zweidimensionale Probleme 243 nicht der konvexen Hülle der Trajektorien der eigentlichen Punkte entspricht. Andererseits entspricht die obere Hülle unser betrachteten Struktur genau der oberen Hülle der Fläche der eigentlichen Linien. Deswegen können wir auf bereits bewiesene Resultate für die obere Hülle von algebraischen Flächen zurückgreifen [1]. Sie liefern eine nahezu quadratische Komplexität. Agarwal, Schwarzkopf und Sharir haben bewiesen, dass die Oberfläche der Projektionen von zwei oberen Hüllen nahezu quadratische Komplexität hat [1]. Damit erhält man eine scharfe Grenze für die Anzahl der Ereignisse infolge von x-zertifikaten. Theorem 1. Die kinetische Datenstruktur zur Erhaltung der konvexen Hülle besitzt O(n 2+ε ) Effizienz für jedes ε > 0 in einem (δ, n)-szenario. Dabei hängt die Konstante in der O- Notation von δ und ε ab. Beweis. Ein (δ, n)-szenario ist ein Szenario mit n Elementen, bei dem die Trajektorie eines Objektes ein Vektor von Polynomen in t mit Grad kleiner δ bildet [5]. Sei n die Anzahl der roten und blauen Linien in dem Berechnungsbaum. Als erstes betrachtet man die Ereignisse, welche mit einem speziellen Knoten des Berechnungsbaumes verknüpft sind. Dabei sei die Zeit die statische dritte Dimension. Dann beschreibt eine Linie, deren Parameter polynomiale Funktionen abhängig von der Zeit sind, eine algebraische Fläche im Dreidimenisionalen. Die Familie der blauen (bzw. roten) Linien wird dann als Familie von bivariaten algebraischen Funktionen betrachtet. Wenn man nun die beiden oberen Hüllen und ihre gemeinsame Hülle betrachtet, sieht man, dass ein violetter Knoten in dem zugeordneten Maximierungsdiagramm einem Vorzeichenwechsel in einem y-zertifikat entspricht. Ein monochromatischer Knoten entspricht dann dem Erscheinen bzw. Verschwinden einer Kante, was durch einen Nachfahren ausgelöst wird. Da unsere Flächen algebraisch einen begrenzeten Grad haben, besitzt ihr Maximierungsdiagramm Komplexität O(n 2+ε ) für jedes ε > 0 (Theorem 2.7 [1]). Damit wird die Anzahl der Ereignisse abhängig von dem Vorzeichenwechsel der y-zertifikate durch diese Schranke begrenzt. Nun betrachten wir die Ereignisse, die von der Neuordnung der x Koordinaten von zwei Knoten mit verschiedenen Farben abhängen. Wir nennen diese im folgenden x-ereignisse. Im dreidimensionalen wird dann ein blauer Hüllenknoten zu einer Kante des blauen Maximierungsdiagramms. Damit entspricht ein x-ereignis einem Punkt (x, t), über dem sich eine Kante befindet, die sowohl in der blauen als auch in der roten Hülle enthalten ist. Das heißt, jedes x-ereignis ist mit einem bichromatischen Knoten auf der Oberfläche des Maximierungsdiagramms der roten und blauen oberen Familie verbunden. Wenn wir n bivariate algebraische Flächen mit begrenzeten Grad haben, ist die Komplexität also O(n 2+ε ) für jedes ε > 0 (Theorem 2.8) [1]. Damit haben wir höchstens so viele x-ereignisse. Schließlich liegt jedes Paar von Linien für eine konstante Anzahl von Zeitpunkten parallel zueinander. Damit ergeben sich O(n 2 ) Steigungs-Ereignisse, welche mit dem bis jetzt betrachteten Knoten verknüft sind. Wenn wir nun wieder den gesamten Berechnunsbaum betrachten, erhalten wir zusammenfassend die Ereignisanzahl C(n). Diese erfüllt die Rekurrenzgleichung C(n) = 2C( n 2 ) + O(n2+ε ). Damit ergibt sich C(n) = O(n 2+ε ). Im schlimmsten Fall ändert sich die konvexe Hülle von n Punkten mit linearem oder höherem Grad Ω(n 2 ) Mal; damit ist diese kinetische Datenstruktur effizient. Insgesamt ist diese Datenstruktur für die konvexe Hülle nicht sehr hilfreich, solange man keine Datenstruktur für die Anfragen benutzt. Diese kann man aber leicht erhalten, indem

252 244 Sabine Naewe man die gegebenen Ecken und Kanten nicht in einer doppelt verketteten Liste sondern in einem dynamischen binären Baum speichert. Dadurch wird die Effizienz nicht verändert, aber die Anfragen nach der Lage eines Punktes verbessert sich. 3 Dichtestes Paar Als nächstes betrachten wie das Problem des dichesten Paares. Bei diesem Problem ist wieder eine Menge M mit n Punkte gegeben. Gesucht wird nun ein Paar von Punkten x, y M mit: a, b M : x y a b. Es ist ziemlich einfach eine kinetische Datenstruktur zu finden, welche dieses Problem löst. Man erzeugt eine Prioritätsschlange, welche alle möglichen Abstände zwischen je zwei Punkten aus M enthält. Das Problem hierbei ist, dass diese kinetische Datenstruktur weder lokal noch kompakt ist, da jeder Punkt in O(n) vielen Zertifikaten enthalten ist. Um nun eine kompakte kinetische Datenstruktur zu erhalten, betrachten wir als erstes einen effizienten Algorithmus, welcher das dichteste Paar einer Punktemenge berechnet. Ein klassischer Divide and Conquer Algorithmus hierfür ist der von Shamos [4]: Man teilt die Menge der Punkte in zwei annähernd gleich große Mengen und berechnet rekurisiv die kleinsten Abstände δ L und δ R. Dann betrachtet man alle Paare von Punkten, welche einen Abstand kleiner oder gleich δ = min(δ L, δ R ) von der vertikalten Linie x = x 0 zwischen den beiden Teilmengen besitzen (Abbildung 3). Wenn man nun zulässt, dass sich die Punkte auch bewegen können, benötigt man für jeden Punkte p auf der linken Seite ein Zertifikat der Form [x p < x 0 δ] oder umgekehrt. Wenn dann ein Punktepaar δ viele Veränderungen durchführen würde, müssten alle Zertifikate der obrigen Form aktualisiert werden und das können O(n) viele sein. Deswegen hätte die daraus resultierende kinetische Datenstruktur eine so große Antwortzeit, so dass sie in diesem Fall nicht sinnvoll ist. Abb. 3. Algorithmus für das dichteste Paar Dieses Beispiel zeigt, dass nicht alle Algorithmen auf die Möglichkeit der Bewegung erweitert werden können. Bis jetzt wurde für keinen bekannten Algorithmus für das dichteste Paar eine Erweiterung auf die Bewegung der Elemente gefunden. In diesem Abschnitt erläutern wir nun einen neuen statischen Algorithmus für die Berechnung des dichtesten Paares einer Menge von Punkten in der Ebene. Er basiert auf dem

253 Kinetische Datenstrukturen für zweidimensionale Probleme 245 plane sweep paradigm bzw. ebenen Durchlaufmodell. Dannach betrachten wir die Erweiterung für sich bewegende Punkte. Jedes Element besitzt dann eine Position, welche eine kontinuierliche Funktion in Abhängigkeit von der Zeit ist. Dann benötigen wir einige Datenstrukturen um den Verlauf zu speichern. Für diese Datenstrukturen zeigen wir dann, dass sie während der Bewegung der Elemente aufrechterhalten werden können. Damit erhalten wir einen Algorithmus, welcher unsere Anforderungen erfüllt. 3.1 Statischer Algorithmus Der statische Algorithmus für das Problem des dichtesten Paares basiert auf der Idee der Teilung des Raumes um einen Punkt in sechs 60 Gebiete. Trivialerweise ist der nächste Nachbar jedes Punktes der nächste der nächsten Nachbarn in den sechs Gebieten. Wir werden zeigen, dass eine auf eindimensionalen Projektionen basierende approximative Definition des nächsten Nachbarn in jedem Gebiet ausreichend ist, um das dichteste Paar zu finden. Mit dieser Definition können wir dann die Nachbarn effizient berechnen und später die Bewegung der Objekte in den Algorithmus einbringen. In diesem Abschnitt betrachten wir eine Menge S von Elementen in einer festen Konfiguration. Um die Notation zu vereinfachen, unterscheidet man nicht zwischen den Elementen und ihrer Position in der Konfiguration. Wir bezeichen den Abstand zwischen zwei Punkten p und q mit d(p, q). Nun definieren wir drei verschiedene Ordnungen auf S. Für die erste Ordnung projektieren wir die Punkte orthogonal auf die x Achse. Die hierauf geltende Ordnung bezeichnen wir als die x-ordnung. Für die zweite Ordnung projektieren wir die Punkte orthogonal auf eine orientierte Linie, welche mit der x-achse einen 60 Winkel bildet. Wir definieren als die +60 Ordnung die Ordnung der orthogonalen Projektion auf ihrer Position auf einer orientierten Linie. Analog definieren wir die 60 Ordnung. Für diese drei Ordnungen schreiben wir < 0, < +, <. Die Annahme einer beliebigen Lage bedeutet, dass kein Element bezüglich dieser drei Ordnungen gleich einem anderen Element ist und dass keine zwei Paare von Elementen die gleiche Distanz besitzten. Mit diesen Annahmen sind diese Strukturen und das dichteste Paar eindeutig definiert. Im Folgenden leiten wir nun eine notwendige und hinreichende Bedingung für das dichteste Paar her. Dafür benötigen wir im Folgenden einige Sätze und Definitionen. Lemma 3. Sei T ein gleichseitigen Dreieck, u einer der Begrenzungsknoten und v ein Punkte auf der Begrenzungskante gegenüber von u. Dann gilt für jeden Punkt w im Inneren von T : d(w, v) < d(u, v) Beweis. Sei a die Länge einer Seite von T und b = d(u, v). Die Begrenzungskante, welche v enthält, besitzt zwei Endknoten. Sei z der Knoten, welcher von den beiden weiter von v entfernt liegt. Dann können wir schreiben d(v, z) = a 2 + c für ein c mit 0 c a 2. Mit dem Satz von Pythagoras gilt b 2 = c a2 und damit: (b (c + a 2 ))(b + (c + a 2 )) = b2 c 2 ac a2 4 = a2 2 ac 0

254 246 Sabine Naewe Dann gilt b c + a 2. Der Kreis mit dem Mittelpunkt v und dem Radius d(u, v) enthält alle drei Knoten der Begrenzung von T und damit alle alle inneren Punkte von T. Wir definieren den dominierenden Keil eines Elements p als den nach rechts erweiterten Keil, welcher durch die Linien durch p, die mit der x Achse einen 30 bzw. 30 Winkel bilden, begrenzt wird. Wir bezeichnen ihn mit Dom(p). Ein Element q liegt in Dom(p), genau dann wenn p < q und p < + q gelten. Mit der Bedeckung eines Elementes q bezeichnen wir das am weitesten rechts liegende Element, welches q in seinem dominierenden Keil enthält und bezeichnen sie als Cover(q). Damit die Bedeckung immer definiert ist, fügen wir ein Element (, 0) hinzu. Die Kandidatenmenge eines Elementes p, bezeichnet mit Cands(p), bezeichne die Menge von Elementen, dessen Bedeckung p ist und das von diesen am weitesten links liegende Element, bezeichnet mit lcand(p), nennen wir den linken Kandidaten von p. Ein Paar (p, lcand(p)) heißt ein Kandidatenmenge. Sie werden in Abbildung 4 dargestellt. Abb. 4. Darstellung von UpT arget(p), lcand(p), Cands(p), Maxima(p) Lemma 4. Sei S eine Menge von Elementen in beliebiger Lage. Wenn (p, q) das dichteste Paar in S ist und q Dom(p) gilt, ist q der linke Kandidat von p. Beweis. Den Beweis führen wir indirekt. Als erstes nehmen wir an, dass p nicht die Bedeckung von q sein. Das bedeutet, dass eine anderes Element r S rechts von p liegt und damit q Dom(r) gilt. In diesem Fall liegt r im Inneren eines gleichseitigen Dreiecks. Dieses Dreieck hat q als rechte Ecke und p liegt auf der linken Begrenzungslinie (Abbildung 5 a). Lemma 3 widerspricht dann der Annahme, dass (p, q) das dichsteste Paar ist. Also gilt p = cover(q). Nun nehmen wir an, dass ein Punkt q S Dom(p) existiert, welcher links von q liegt. Dann liegt q in Inneren eines gleichseitigen Dreiecks mit p als linker Ecke und q liegt auf der rechten Begrenzungslinie. Dann gilt mit Lemma 3, dass d(q, q ) < d(p, q). Das widerspricht wieder (p, q) als dichtestes Paar. Damit ist q der linke Kandidat von p (Abbildung 5 b). Nun haben wir nur noch n Kandidatenpaare für eine Menge mit n Elementen. Wir bezeichnen diese Elementenpaare verbunden der 0 Richtung. Um nun das dichteste Paar zu finden, definieren wir analog die obrigen Definitionen für die Richtungen +60 und 60. Dabei ist der dominierende Keil verbunden mit einem der Winkel einfach der Keil, welchen man nach den obrigen Definitionen erhält, wenn wir die Fläche mit um den Ursprung drehen.

255 Kinetische Datenstrukturen für zweidimensionale Probleme 247 Abb. 5. Wenn (p, q) das dichteste Paar ist und q Dom(p), dann ist p die Bedeckung von q (a); q der linke Kandidat von p (b). Korollar 1. Das dichteste Paar einer n elementigen Menge S in beliebiger Lage ist eines der höchstens 3n Kandidatenpaare, welche mit den drei Richtungen 0, +60, 60 verbunden sind. Beweis. Sei (p, q) das dichteste Paar der Menge S, wobei p links von q liegt. Die drei dominierenden Keile von p spannen die ganze rechte Halbebene von der Vertikalen durch p auf. Damit liegt q in einem dieser Keile. Mit dem Lemma 4 folgt, dass (p, q) ein Kandidatenpaar für diese Richtung ist. Für ein gegebenes Element p bezeichnen wir nun mit S p die Menge aller Elemente zu seiner rechten Seite. Die Elemente aus S p, dessen Bedeckung nicht in S p liegt, wird mit Maxima(p) bezeichnet. Diese Menge wird in Abbildung 4 dargestellt. Proposition 1. Wenn q, r Cands(p), dann gilt: q < + r r < q q < y Beweis. Nach Voraussetzung liegen q und r nicht im dominierenden Keil des anderen. Damit liegt r entweder unter oder über dem doppelten Keil, welcher durch die 30 und 30 Linien durch p begrenzt wird. Falls ein Punkt über oder unter einem anderen liegt, sind die Ordnung < + und < die entgegengesetze Ordnung der anderen. Damit ist die Ordnung < + die gleiche wie die y-ordnung. Der dominierende Keil von p teilt Maxima(p) in drei Mengen. Die zentrale Menge in dem dominierenden Keil enthält die Kandidaten von p. Das niedrigste Element in der Menge über Dom(p) wird als oberes Ziel von p mit U pt arget(p) bezeichnet. Analog bezeichnet man das größte Element in der Menge unter Dom(p) als unteres Ziel mit LowT arget(p) bezeichnet. Das obere Ziel ist genau der linke Kandidat von p in Richtung +60 (Abbildung 4). Widerum fügt man Markierungen für und + hinzu, damit die beiden Ziele wohldefiniert sind. Proposition 2. Wenn UpT arget(q) = UpT arget(r) und q < 0 r gilt, folgt q < r. Wenn LowT arget(q) = LowT arget(r) und q < 0 n r, gilt q < + r. Beweis. Wir beweisen nur die erste Behauptung. Die zweite Behauptung folgt dann analog. Sei P das gemeinsame obere Ziel von q und r. Wir nehmen an, dass q links von r liegt. Wenn r < q, dann liegt r über dem dominierenden Keil von q. Da aber r unter p liegt, kann p nicht oberes Ziel von q sein. Das ist ein Widerspruch zur Voraussetzung. Also gilt q < r. r

256 248 Sabine Naewe Nun skizzieren wir den statischen Algorithmus zur Berechnung aller Kandidatenpaare in Richtung 0 aus der Menge S. Dabei fügen wir die Elemente von rechts nach links ein und speichern die Menge M axima(p) in einem binären Baum Maxima. Dabei sortieren wir die Elemente nach der ansteigenden y-koordinate bzw. äquivalenterweise durch die 60 oder 60 Ordnung. Dieser Baum wird für jedem Knoten mit einem Feld erweitert. Dieses enthält das linkeste Element in dem Unterbaum, welcher diesen Knoten als Wurzel hat. Dieses Feld wird später für die Bewegung benötigt. Im statischen Fall ändert sich die Laufzeit nicht wesentlich ohne dieses Feld, da man auch alle Elemente aus Cands(p) betrachten kann. Der dazu gehörige Algorithmus wird unten dargestellt. Algorithmus 27 Berechnung aller Kandidatenpaare in 0 Richtung 1: Initialisiere Maxima mit 2: Für jeden Punkte p S von rechts nach links: 3: (a) Finde UpT arget(p) und LowT arget(p) in Maxima 4: (b) Setze Cands(p) = Maxima Dom(p) 5: (c) Setze lcand(p) als das linkeste Element von Cands(p) 6: (d) Ersetze die Elemente aus Cands(p) durch p in Maxima Man sieht, dass dieser plane sweep Algorithmus mit Laufzeit O(n log n) implementiert werden kann. Das Sortieren zur Vorbereitung des Durchlaufs benötigt O(n log n). Man speichert Maxima in einer erweiterten balancierten binären Baumstruktur, welche Einfügen, Suchen, Löschen, Trennen und Verbinden in logarithmischer Zeit unterstützt [1]. Die Berechnung von Cands(p) erfordert zwei O(log n) Suchen in Maxima, falls Cands(p) eine fortlaufende Untermenge von Maxima ist. Das Herausnehmen von Cands(p) aus Maxima und Einfügen von p auf diese Plätze benötigt O(log n) für jedes Element p. Dabei muss das Feld des linkesten Elements aktualisiert werden. Insgesamt beträgt die Laufzeit O(n log n). Der gleichen Algorithmus wird dann für die Flächen rotiert um 60 und 60 verwendet um alle Kandidatenpaare aus Korollar 1 zu bekommen. Aus diesen Paaren kann man in linearer Zeit das dichsteste Paar berechnen. So erhält man das dichteste Paar mit worstcase Laufzeit O(n log n). Der Algorithmus zur Berechnung der Kandidatenpaare benötigt nur Vergleiche in den drei Richtungen 0, 60 und 60. Damit sind die Bedeckung, das Ziel und der linke Kandidat für jeden Punkt durch die Ordnung entlang dieser drei Richtungen definiert. Wir sprechen von allen diesen Attributen als die Kegelstruktur von S. Proposition 3. Die folgende Menge von Zertifikaten auf einer Menge S reicht aus um die Kegelstruktur und das dichsteste Paar von S zertifizieren. 1. Zertifikate zur Bestätigung der 0 Ordnung auf S 2. Zertifikate zur Bestätigung der 60 Ordnung auf S 3. Zertifikate zur Bestätigung der 60 Ordnung auf S 4. Zertifikate zur Bestätigung der Ordnung der Kandidatenpaaren aus S. Diese Beweisstruktur hat lineare Größe und O(log n) Lokalität. Beweis. Die Gültigkeit des Beweises ist durch die Korrektheit des Algorithmus gegeben. Nun betrachten wir die Lokalität. Jedes Element kommt höchstens in zwei Zertifikaten in der geordneten Liste vor. Außerdem ist jedes Element für jede Richtung in höchstens zwei

257 Kinetische Datenstrukturen für zweidimensionale Probleme 249 Kandidatenpaaren enthalten. Das eine Paar enthält noch seinen linken Kandidaten. Das anderen enthält zusätzlich das Element zu dem das Ausgangselement der linke Kandidat ist. Daher erscheint ein Element in der Kanditatenpaarordnung in O(1) Blättern und in O(log n) inneren Knoten. Damit hat die Beweisstruktur O(log n) Lokalität. 3.2 Die Bewegung der Elemente Im vorherigen Abschnitt haben wir uns mit einer Struktur beschäftigt, welche das dichteste Paar einer Menge berechnet. Im folgenden betrachten wir nun, wie sich die Struktur ändern muss, wenn ein Zertifikat verfällt und zählen dabei die worst case Anzahl von Ereignissen, die in unserem polynomiellen Bewegungsmodell auftreten können. Im [5] wurde die Aktualisierung des Wettbewerbes zwischen Kandidatenpaaren betrachtet. Nun müssen wir die Kegelstruktur aktualisieren, wenn sich die Ordnung zweier Elemente auf einer der drei betrachteten Richtungen ändert. Wenn zwei Elemente ihre Plätze tauschen, kann dies höchstens eine Veränderung in der Bedeckung von O(n) vielen Elementen ändern. Genauso kann eine Veränderung in der 60 Ordnung höchstens linear viele Veränderungen von Zielen mit sich bringen. Um nun eine ansprechbare kinetische Datenstruktur zu bekommen, stellt man die Ziele und Bedeckungen implizit in drei verschiedenen Binärbäumen dar. 1. Cands(p) enthält alle Kandidaten von p. Diese werden nach ihrer y Ordnung sortiert. Die Folge dieser Elemente wird nun in einem balancierten Binärbaum gespeichert. Dieser unterstützt Suchen und Aktualisieren. Zusätzlich bekommt jeder Knoten einen Zeiger auf seinen Elternknoten in dem Baum und auf die Wurzel dieses Baumes. Damit kann man für jedes Element q S seine Bedeckung in O(log n) finden. Außerdem kennt jeder Knoten seinen in x-ordnung in seinem Unterbaum am weitesten links liegendes Element. Damit speichert die Wurzel von Cands(p) lands(p). Die Korrektheit des Elternzeigers kann in einer Standardbaumaktualisierungsoperation mit dem gleichen asymptotischen Aufwand wie das Feld des linkesten Kandidaten erhalten bleiben. Dieses Feld muss immer überprüft werden, falls sich die x-ordnung ändert. 2. Hits u (p) enthält alle Elemente, welche p als ein oberes Ziel besitzten. Sie werden nach der 60 Ordnung sortiert und in einem balancierten Binärbaum gespeichert. Dabei besitzt jeder Knoten einen Zeiger auf seinen Elternknoten und auf p in der Wurzel, so dass für jedes Element das obere Ziel in logarithmischer Zeit gefunden werden kann. 3. Analog enhält Hits l (p) alle Elemente, für die p ein unters Ziel ist. Mit diesen Datenstrukturen kann nun die Bewegung der Elemente simuliert werden, wobei wir die Maxima Datenstruktur selbst nicht mehr benutzen. Der statische Algorithmus ist nützlich, um diese Datenstrukturen nach dem Verfall eines Ereignisses in O(n log n) zu erzeugen, wobei die beiden Hits Strukturen taktweise nach jedem gefundenen Ziel aufgebaut werden können. Um nun die Arbeitsweise dieser Datenstrukturen zu verdeutlichen, betrachten wir als erstes den Algorithmus, welcher Cands(), Hits() und lands() aktualisiert, wenn zwei Elemente p und q bzgl. der x-ordnung ihre Positionen tauschen. Ohne Beschränkung der Allgemeinheit liegt p links von q und im Augenblick des Wechsels unter q.

258 250 Sabine Naewe 1: /*Schritt 1*/ 2: if q = UpT arget(p) then 3: (a) Hole aus Cands(q) die Elemente von Dom(p) und füge sie zur Spitze von Cands(p) hinzu. 4: (b) Sei w = LowT arget(q). Lösche q aus Hits l (w) und füge es in Hits l (p) hinzu. 5: (c) Sei v, falls vorhanden, das neue Bodenelement von Cands(q) oder sonst das obere Ziel von q. Lösche p aus Hits u(q) und füge es in Hits u(v) ein. 6: /*Schritt 2*/ 7: Sei p = Cover(p) und q = cover(q). 8: if p = q then 9: Aktualisiere lcand(p ) beginnend beim gemeinsamen Vorgänger von p und q im Baum für Cands(p ). Abb. 6. Ein x-ereignis und die Veränderung von Cands Abbildung 6 verdeutlicht diesen Algorithmus. Dabei gilt, dass sich die Kegelstruktur ändert, falls q ein Ziel von p ist und sich ihre x-koordinaten vertauschen. Dabei werden die Elemente aus Maxima(q) in Dom(q) Dom(p) von Cands(q) nach Cands(p) verschoben. Das Element p bekommt ein neues Ziel; der neue Punkt der Linie zwischen dem Abschnitt von p und seinem Ziel liegt in Dom(q). Ebenfalls bekommt q p als ein Ziel. Diese Veränderung geschieht in Schritt 1. Wir defininieren nun das Maximumdiagramm als die Vereinigung aller Punkte, welche auf dem Rand von Dom(p) liegen und die nicht in q Maxima(p) Dom(q) vorhanden sind. Die einzigen sich ändernden Kanten im Maximumdiagramm sind dann die, welche sich rechts von p und q erstrecken. Für Elemente rechts oder links von p, q ändert sich kein Ziel. Damit aktualisiert Schritt 1 auch das Maximumdiagramm. Wenn weder p noch q Ziel des anderen sind, ändert sich das Maximumdiagramm nicht und Cands() und Hits() Felder müssen nicht verändert werden. Ein lcand() Feld muss hingegen immer verändert werden. Falls p, q Cands(u) für ein u, muss sichergestellt werden, dass das Feld für den linkesten Kandidaten im Binärbaum für Cands(u) aktualisiert wird. Dafür wird jeder Vergleich von p und q in diesem Baum neu bewertet. Dadurch kann sich lcand(u) verändern. Dies geschied in Schritt 2. Jeder Schnitt des Algorithmus kann in logarithmischer Zeit durchgeführt werden. Dies gilt auch für Schritt 1(a), da Cands(q) nach der 60 Ordnung sortiert ist. Die Neuterminierung der modifizierten Zertifikate für die geänderte Ordnung benötigt ebenfalls logarithmische Zeit. Der folgende Pseudoalgorithmus aktualisiert das zugehörige Feld, wenn zwei Elemente p und q ihre Positionen in der +60 Ordnung von S wechseln. Während dieses Wechsels bildet die Linie durch p und q einen 30 Winkel mit der x-achse. Ohne Beschränkung der Allgemeinheit nehmen wir an, dass p links und überhalb von q liegt. Dann können zwei verschiedene Fälle auftreten. Entweder kommt q zu Dom(p) dazu oder q verlässt diese Menge.

259 Kinetische Datenstrukturen für zweidimensionale Probleme 251 Im ersten Fall kommt q zur Menge Dom(p) dazu. Dann wird die Datenstruktur wir folgt aktualisiert: 1: if q = LowT arget(p) then 2: (a) Sei v = Cover(q). Lösche q aus Cands(v) und füge es in Cands(p) ein. 3: (b) Sei t das linkeste Element in Hits u(q), welches rechts von p liegt. Falls nicht vorhanden, setzte t gleich dem linkestes Ziel von q. Lösches p aus Hits l (q) und füge p zu Hits l (t) hinzu. 4: (c) Lösche die Untermenge aus Hits u(q), dessen Elemente links von t (somit auch links von p) liegen füge sie an das Ende von Hits u(p). Im zweiten Fall verlässt q die Menge Dom(p). Der hierzu gehörige Pseudocode vertauscht nur die Aktionen des ersten Falles: 1: if q Cands(p) then 2: (a) Sei t = LowT arget(q). Lösche p aus Hits l (t) und füge es in Hits l (q) ein. 3: (b) Lösche aus Hits u(p) die Elemente kleiner als q bzgl. < und füge sie am Anfgang von Hits u(q) ein. 4: (c) Sei v das neue rechteste Element von Hits u(p). Falls Hits u(p) leer ist, sei v die Bedeckung von p. Lösche q aus Cands(p) und füge q zu Cands(v) hinzu. Diese Fälle werden in Abbildung 7 dargestellt. Von (a) nach (b) verdeutlicht den ersten Fall, während (b) nach (a) darstellt. Abb. 7. Ein 60 Ereignis Im ersten Fall kommt q zur Menge Dom(p) hinzu. Wenn q nicht das kleinste Ziel von p ist, gilt q Maxima(p) und damit verändert der Wechsel von p und q in der +60 Ordnung die Kegelstruktur nicht. Somit muss die Datenstruktur nicht verändert werden. Falls aber q das kleinste Ziel von p ist, verändert sich die Kegelstruktur. Dies geschieht aber nur in der Nähe von p und q. Ihr Wechsel verändert nicht die Ziele der Elemente rechts von p, nur das kleinste Ziel von p muss aktualisiert werden. Dies geschied in Schritt (b). Die Elemente links von p, welche q als ihr oberes Ziel haben, müssen p als ihr neues Ziel speichern. Diese Elemente liegen alle in Hits u (q). Diese Aktualisierung geschied in Schritt (c). Von den Mengen Cands() änderts dich nur die Menge Cands(p), da q zu dieser Menge hinzukommt (Schritt (a)). Die Felder für die linkesten Elemente werden während den Veränderungen in den binären Bäumen der Mengen Cands() aktualisiert und bleiben damit korrekt. Die Listen der Mengen Cands() und Hits() reichen aus um die kombinatorische Struktur des Maximumdiagramms darzustellen. Damit ist dieses korrekt, solange die Mengen korrekt sind.

260 252 Sabine Naewe Im zweiten Fall sind die Wechsel im Maximumdiagramm genau umgekehrt zu denen im ersten Fall. Die Aktualisierung geschied genau umgekehrt zu der ersten Prozedur. Die hierbei benutzten Operationen sind alle in logarithmischer Zeit möglich. Dies gilt auch für den Schritt (b) im ersten Fall, da die Elmente aus Hits u (q) in der x-ordnung geordnet sind. Die Anzahl sich hierbei wechselnder Zertifikate beträgt O(1). Sie können in logarithmischer Zeit in der Ereignisschlange aktualisiert werden. Somit kann das gesuchte Element in logarithmischer Zeit gefunden werden. Das letzte Element unserer kinetischen Datenstruktur ist der kinetische Wettbewerb der 3n vielen Abständen, welche zu den (p, lcand(p)) Paaren gehören. Damit bekommen wir 3n zusätzliche Zertifikate zu unserer Datenstruktur. Die Wurzel unseren Baumes für diesen Wettbewerb enthält zu jeder Zeit das dichteste Paar. Dabei muss man beachten, dass wenn sich lcand(p) ändert, dies zu einer Unstetigkeit des zugehörigen Abstandes im kinetischen Wettbewerb führt. Insgesamt bekommen wir nun eine Datenstruktur, welche auf einem dynamischen Szenario arbeitet. Theorem 2. Die kinetische Datenstruktur für das dichteste Paar hat eine Effizienz von O(nλ 2δ+2 (n) log 2 n) in einem dynamischen (δ, n, m) Szenario. Beweis. Ein (δ, n, m) Szenario ist ein dynmisches Szenario, bei dem maximal n Objekte gleichzeitig sichtbar sein können und es m verschiedene Bewegungsabschnitte gibt. Auf diesen sind die Trajektorien wieder Polynome in t vom Grad kleiner als δ [5]. Ein Ereignis in der Kegelstruktur ist der Wechsel der Ordnung zweier Elemente entlang einer der drei Ordnungen. Ein Paar von Elementen kann seine Ordnung höchstens δ mal wechseln. Es gibt O(n 2 ) solcher Ereignisse, welche wie vorher gesehen in O(log n) ablaufen. Das Quadrat des Abstandes zweier Elemente ist eine ganzrationale Funktion mit Grad 2δ. Damit ist das für den kinestischen Wettbewerb erzeugte Szenario ein dynamisches (2δ, n, n 2 ) Szenario und hat damit Effizienz O(nλ 2δ+2 (n) log 2 n) (Lemma 3.8) [1]. Damit haben wir eine kinetische Datenstruktur für das dichsteste Paar. Sie ist linear, hat konstante Lokalität und O(log 2 n) Antwortzeit, und fast optimale Effizienz und erfüllt damit unsere gewünschten Eigenschaften. 4 Zusammenfassung In diesem Kapitel haben wir nun am Beispiel der kinetischen Datenstruktur für die konvexe Hülle und die des dichstesten Paares einer Menge kinetische Datenstrukturen für zweidimensionale Probleme betrachtet. Das Vorgehen und die Analyse dieser beiden wichtigen geometrischen Probleme lässt sich nun auf andere Problem übertragen und anwenden. Mit ihnen lassen sich auch effiziente Algorithmen für Probleme in höheren Dimensionen finden. Somit stellen die kinetischen Datenstrukturen ein vielseitiges Hilfsmittel für viele Basisprobleme dar. Literaturverzeichnis 1. Julien Basch, 1999, Kinetic Data Structures, Seite 41-62

261 Kinetische Datenstrukturen für zweidimensionale Probleme Dietrich Travkin, 2003, Kinetische Datenstrukturen, Seite Leonidas J. Guibas, 1997, Kinetic Data Structures: A State of the Art Report, Seite F. P. Preparata und M. I. Shamos, 1985, Computational Geometry: An Indroduction, Springer-Verlag, 1st ed Corr. 5th printing edition (August 6, 1993), New York, NY 5. Peter Kling, 2007, Eine Einführung in kinetische Datenstrukturen, Technical report, University of Paderborn

262

263 Dynamische Steinerbäume Holger Hagedorn Universität Paderborn, Zusammenfassung. Diese Ausarbeitung beschreibt das Problem Dynamic Steiner Tree (DST). Praktische Anwendungen finden sich in Netzwerken, in denen sich die Menge der über Router zu verbindenden Rechner im Laufe der Zeit verändern. Im Teilproblem DST-N dürfen keine existierenden Verbindungen verändert werden. Hierfür zeigen wir, dass die Worst-Case Performanz für jeden Algorithmus mindestens 1 log n mal 2 die Kosten einer optimalen Lösung beträgt mit n als Anzahl der Rechner. Weiterhin präsentieren wir einen Greedy-Algorithmus, der maximal die zweifachen Kosten dieser Schranke verursacht. Letztlich wird noch ein Ausblick auf Ergebnisse für das Teilproblem DST-R gegeben, in dem Veränderungen an bestehenden Verbindungen erlaubt sind. 1 Einleitung Motivation Definitionen Kompetitive Analyse DST-N Add Requests Dynamischer Greedy-Algorithmus Remove Requests DST-R Fazit Literaturverzeichnis Einleitung 1.1 Motivation Stellen wir uns ein Netzwerk von Rechnern vor. Ein paar Arbeitsrechner sind dafür vorgesehen miteinander verbunden zu werden und Daten auszutauschen. Unser Ziel ist es die Arbeitsrechner so miteinander zu verbinden, dass die zu übertragenden Daten möglichst schnell übermittelt werden. Dazu können die restlichen Rechner im Netzwerk als Router benutzt werden. Überträgt man dieses Problem auf einen gewichteten Graphen als das Netzwerk, so hat man eine gewisse Teilmenge der Knoten gegeben, die man mit einem Baum verbinden möchte. Dies könnte man über einen Spannbaum lösen, wie in Abbildung

264 256 Holger Hagedorn 1 (a) für drei Knoten gezeigt. Allerdings kann es eine günstigere Verbindung geben, sofern man noch andere Knoten des Graphen mit einbezieht. Der entstehende Baum wird Steinerbaum genannt und ist in Abbildung 1 (b) dargestellt. Ein Steinerbaum ist also eine Verallgemeinerung des Spannbaums. In vielen Netzwerken sind aber die Arbeitsrechner nicht statisch, sondern es werden immer wieder welche hinzugefügt und entfernt. Wir befinden uns damit also im Gebiet der Online-Algorithmen. Dieses sogenannte Dynamic Steiner Tree (DST) Problem wird von Imase und Waxman [1] vorgestellt. Dabei gibt es zwei verschiedene Teilprobleme. Im ersten Fall können beim Hinzufügen und Entfernen von Knoten die bestehenden Verbindungen nicht geändert werden. Im zweiten Fall sind solche Veränderungen erlaubt, allerdings wird die Anzahl derer beschränkt. Wir werden in diesem Abschnitt zunächst die beiden Teilprobleme formal definieren und daraufhin die kompetitiven Analyse als Technik vorstellen, mit der wir die Performanz von Online-Algorithmen analysieren können. In Abschnitt 2 befassen wir uns mit dem ersten Teilproblem. Dort zeigen wir erst eine untere Schranke für alle Algorithmen die nur Knoten ins Netzwerk hinzufügen. Dann stellen wir einen Greedy-Algorithmus für das Problem vor und beweisen seine Performanz. Zuletzt zeigen wir noch, dass im Fall wo auch Knoten aus dem Netzwerk entfernt werden können, keine obere Schranke existiert. In Abschnitt 3 geben wir einen kurzen Überblick über die Ergebnisse zum Teilproblem in dem Veränderungen zugelassen sind. 1.2 Definitionen Wir bezeichnen mit G = (V, E) einen ungerichteten und zusammenhängenden Graphen. Dabei steht V (G) für die Knotenmenge und E(G) für die Kantenmenge. Der Grad deg(v) eines Knoten v ist definiert als die Anzahl inzidenter Kanten. Ein Teilgraph G von G wird mit G G notiert bzw. mit G G für einen echten Teilgraphen. Ein einfacher Pfad in einem Graphen ist ein Pfad in dem jeder Knoten nur einmal vorkommt. Mit dist : V V R + wird ein kürzester Weg zwischen zwei Knoten bezeichnet. Weiterhin gibt es zu jedem Graphen eine Kostenfunktion cost : E R +. Eine Instanz I des Problems DST besteht aus einem Graphen G, der Kostenfunktion cost und einer Folge von Anfragen σ = {σ 0,..., σ K } mit σ i = (v i, ρ i ) wobei v i V und ρ i {add, remove}. Definition 1 (Steinerbaum). Gegeben ein zusammenhängender, ungerichteter Graph G = (V, E), eine Gewichtsfunktion cost : E N + und eine Menge von Terminalen S V. Ein Steinerbaum T = (V, E ) ist ein zusammenhängender Teilbaum von G, in dem S V gilt. (a) (b) Abb. 1. Beispiel für (a) einen Spannbaum auf drei Knoten und (b) einen Steinerbaum auf denselben Knoten

265 Dynamische Steinerbäume 257 Bei einem minimalen Steinerbaum (man spricht auch von dem Steinerbaum-Problem ST) gilt zusätzlich, dass e E cost(e) minimal ist. Bei dem korrespondierenden Online-Problem Dynamic Steiner Tree verändert sich die Menge der Terminale. S i beschreibt dabei die Terminale zum Zeitpunkt i. Wir definieren nun die beiden Ausprägungen dieses Problems. Definition 2 (DST-N). Gegeben sei eine Instanz I = (G, cost, σ). Das Problem DST-N (Nonrearrangeable Dynamic Steiner Tree) besteht darin, eine Folge von Bäumen (T i ) 0 i K zu finden, so dass eine Funktion cost(t i ) für alle 0 i K minimiert wird. In diesem Fall ist cost(t i ) = e E(T i ) cost(e). Dabei müssen folgende Bedingungen eingehalten werden: 1. Jeder Baum T i ist ein Steinerbaum auf S i. 2. Falls σ i eine add-anfrage ist, dann muss T i 1 T i gelten. 3. Falls σ i eine remove-anfrage ist, dann muss T i T i 1 gelten. Definition 3 (DST-R). Gegeben sei eine Instanz I = (G, cost, σ). Das Problem DST-R (Rearrangable Dynamic Steiner Tree) besteht darin, eine Folge von Bäumen (T i ) 0 i K zu finden, so dass eine Funktion cost(t i ) für alle 0 i K minimiert wird. Dabei müssen die folgenden Bedingungen eingehalten werden: 1. Jeder Baum T i ist ein Steinerbaum auf S i. 2. Die Anzahl der Änderungen dürfen eine obere Schranke B nicht überschreiten. Offensichtlich ist in der letzteren Version die Einschränkungen um T i aus T i 1 zu konstruieren relaxiert. Zusätzlich sind allerdings die Anzahl der Veränderungen um von T i 1 nach T i zu gelangen beschränkt. Die Anzahl der Änderungen im Schritt i werden mit α i bezeichnet und entsprechen der Anzahl der Zusammenhangskomponenten in T i 1 T i abzüglich eins. 1.3 Kompetitive Analyse Wir führen in diesem Kapitel eine Analysetechnik für Online-Algorithmen ein, die Optimierungsprobleme lösen (vgl. [3]). In unserem Fall haben wir ein Minimierungsproblem vorliegen, denn wir wollen mit Hilfe eines Algorithmus A einen Steinerbaum für eine gegebene Instanz I = (G, cost, σ) von DST erzeugen, der möglichst geringe Kosten hat. Wir bezeichnen dabei mit A(S i ) die Kosten cost(t i ) des Baumes, den A für S i generiert hat. Weiterhin bezeichne OP T (S i ) die Kosten eines minimalen Steiner-Baumes auf S i. Im allgemeineren Fall sprechen wir von einem unter Betrachtung stehenden Online- Algorithmus A und einem optimalen Offline-Algorithmus OP T. Optimal bedeutet, dass er unter allen möglichen Instanzen I eine der Lösungen liefert, die geringstmögliche Kosten verursacht. Im Vergleich zu Offline-Algorithmen, wo die Eingabegröße bekannt ist, sind bei Online-Algorithmen zu Beginn des Berechnungsvorgangs nicht alle Eingabedaten verfügbar. Die Eingabedaten werden vielmehr zur Laufzeit ergänzt. Dies ist durch die Eingabefolge σ ausgedrückt. Berechnungen von A dürfen zum Zeitpunkt i immer nur von der Anfrage σ i abhängen. Es stellt sich nun die Frage, wie wir die Güte solcher Online-Algorithmen analysieren können. Die klassische Worst-Case Analyse mit dem O-Kalkül versagt an dieser Stelle, da die Eingabegröße nicht verfügbar ist. Daher hat sich eine Analysetechnik durchgesetzt, die kompetitive Analyse genannt wird. Die Idee dahinter ist, dass man einen Online-Algorithmus

266 258 Holger Hagedorn A gegen einen Gegner antreten lässt (daher kompetitiv). Der Gegner stellt Anfragen σ i immer gerade so, dass die Lösung die A produziert möglichst hohe Kosten hat. Das Verhältnis, wie schlecht A dabei abschneidet, wird gemessen indem man die Lösung von A der Lösung von OP T gegenüber stellt. Definition 4 (c-kompetitivität). Sei A ein Online-Algorithmus und OP T ein optimaler Offline-Algorithmus. A ist c-kompetitiv, genau dann wenn gilt: a 0 : 0 i K : A(σ i ) c OP T (σ i ) + a c wird hierbei kompetitiver Faktor genannt. Wenn a = 0 dann ist der Algorithmus strikt c-kompetitiv. Eine alternative (vielleicht intuitivere) Definition des kompetitiven Faktors die sich auch oft in der Literatur wiederfindet ist A(σ i ) c = max 0 i K OP T (σ i ). (1) Angewendet auf das Problem DST-N lässt sich dies auch formulieren als A(S i ) A(I) = max 0<i K OP T (S i ). (2) Die Worst-Case Performance Ratio von A für alle Instanzen I (mit I als maximaler Größe des Terminal-Sets) beträgt C A (n) = sup {A(I) I ist Instanz mit I = n}. 2 DST-N In diesem Abschnitt betrachten wir das Problem DST-N, also den Fall ohne Änderungen an bestehenden Verbindungen. Wir konzentrieren uns zunächst nur auf add-anfragen und zeigen hierfür eine untere Schranke. Danach geben wir den Greedy-Algorithmus DGA an und beweisen seine Kompetitivität. Zum Schluss betrachten wir den allgemeinen Fall in dem auch remove-anfragen zugelassen sind. Hierfür wird gezeigt, dass es keine obere Schranke für beliebige Algorithmen gibt. 2.1 Add Requests Dieser Unterabschnitt behandelt DST-N ausschließlich für add-anfragen. Um eine untere Schranke für diesen Fall herzuleiten, definieren wir zunächst eine spezielle Form von Graphen. Definition 5 (P-Graph). Ein P-Graph G k = (V k, E k ) mit k N und einer konstanten Kostenfunktion c k : E k R + ist wie folgt rekursiv definiert: 1. G 0 enthält zwei Knoten v 0, v 1 V 0 (Level 0 Knoten) die über eine Kante verbunden sind und es gilt c 0 = 1.

267 Dynamische Steinerbäume < i k : Für alle Kanten (u, v) E(G i 1 ) wird ein eindeutiges Paar von Knoten α, β (Level i Schwestern) eingeführt. Die Kante (u, v) wird durch die zwei Pfade (u, α, v) und (u, β, v) ersetzt. Der resultierende Graph ist G i. Jede Kante von G i besitzt Gewicht c i = 2 i. Abbildung 2 verdeutlicht die rekursive Konstruktion für die Graphen G 0,..., G 3. In G 1 sind exemplarisch die hinzugefügten Knoten α und β benannt. Man beachte auch die sich mit jedem Schritt halbierende Kostenfunktion. Eine wichtige Beobachtung ist, dass die Kosten eines einfachen Pfades von v 0 nach v 1 immer 1 betragen. Auf einem P-Graph kann weiterhin eine spezielle Form der Adjazenz definiert werden. Definition 6 (i-adjazenz). Zwei Knoten u, v V k eines P-Graphen G k sind i-adjazent, 0 i k, wenn es einen Pfad von u nach v gibt, so dass gilt: 1. Level von u und v ist höchstens i. 2. Auf dem Pfad gibt es nur Verbindungsknoten mit Level echt größer als i. Ein Beispiel für i-adjazenz in einem G 3 ist in Abbildung 3 gegeben. Exemplarisch sind hier je ein Pfad für 1-, 2- und 3-adjazente Knoten eingezeichnet. Man erkennt weiterhin, dass es nur beschränkte Möglichkeiten für i-adjazente Knoten gibt. In diesem Graphen können 1-adjazente Knoten nur von Level 1 nach 0, 2-adjazente nur von Level 2 nach 1 oder 0, und 3-adjazente nur von Level 3 nach 2, 1 oder 0 verbunden werden. Die einzigen Knoten die 0-adjazent sein können sind v 0 und v 1. Überdies folgt aus der Definition sofort, dass i-adjazente Knoten in einem P-Graphen G k mit k > i im P-Graphen G i adjazent sind. Lemma 1. Für alle P-Graphen G i mit i 2 gilt: 1. Jeder Knoten x auf Level i ist adjazent zu genau zwei Knoten, nämlich Knoten v auf Level i 1 und Knoten u auf Level j mit 0 j < i 1. Weiterhin hat x einen Schwesterknoten y auf Level i der ebenfalls zu u und v adjazent ist. 2. Für alle Knoten v auf Level i 1 gilt, dass sie immer adjazent sind zu genau vier Knoten auf Level i die aus zwei Schwesterpaaren bestehen. v 0 0 α β v 1 0 G 0 G 1 G 2 G 3 c c 1 = 1 0 = 1 2 c 2 = 1 4 c 3 = 1 8 Abb. 2. Beispiel für P-Graphen Level

268 260 Holger Hagedorn Level v adjazent 2-adjazent 3-adjazent v 1 G 3, c 3 = 1 8 Abb. 3. Beispiel für i-adjazenz Daraus folgt, dass für Graphen G k mit k i die Bedingungen 1 und 2 erhalten bleiben, wenn man das Wort adjazent durch i-adjazent ersetzt. Beweis. Das Lemma kann leicht per vollständiger Induktion bewiesen werden. Induktionsanfang ist bei i = 2. Für einen G 2 stimmt die Behauptung, was sich leicht anhand Abbildung 2 nachprüfen lässt. Nehmen wir nun an, die Behauptung gelte für i. Wir zeigen, dass die Behauptung dann auch für i + 1 gilt. In Abbildung 4 sehen wir auf der linken Seite einen Ausschnitt aus einem Graphen G i. Der Knoten x auf Level i hat genau wie verlangt einen Schwesterknoten y und zwei adjazente Knoten u und v. Per Definition eines P-Graphen werden nun um G i+1 zu erzeugen für jede Kante zwei Knoten α und β eingefügt. Diese befinden sich auf Level i + 1. Diese Transformation ist auf der rechten Seite in Abbildung 4 u u Level j (0 j < i 1) α = x y = β i + 1 x y v = x i i + 1 v i 1 Schritt i Schritt i + 1 Abb. 4. Induktionsschritt

269 Dynamische Steinerbäume 261 zu sehen. Wenn wir uns nun wieder einen Knoten als neues x herausnehmen (im Beispiel α), dann hat dieser wiederum einen Schwesterknoten y (im Beispiel β) und ist zu zwei Knoten u und v verbunden. Im Beispiel gilt u = u und der Knoten liegt damit zwangsläufig auf Level j mit 0 j < (i + 1) 1. Weiterhin wird aus dem alten x das neue v, welches auf Level i = (i + 1) 1 liegt. Damit gilt Behauptung 1 des Lemmas. Behauptung 2 gilt ebenfalls, da v zu genau vier Level i = (i + 1) 1 Knoten adjazent ist, von denen je zwei Geschwister sind. Anhand der Abbildung lässt sich erkennen, dass alle Eigenschaften nicht nur für die betrachteten x und y gelten, sondern für alle neu eingeführten Knoten α und β. Definition 7 (k-sequenz). Für einen P-Graphen G k wird eine Folge N = (N 0,..., N k ) k-sequenz genannt, wenn es einen Pfad p gibt der v 0 und v 1 verbindet und für alle 0 i k gilt: N i = {v V (p) v ist auf Level i} Als Beispiel für eine k-sequenz nehmen wir einen P-Graphen G 3 an und es sei ein Pfad gegeben als (v 0, a, b, c, d, e, f, g, v 1 ). Dann ist die korrespondierende 3-Sequenz dazu: N = ({v 0, v 1 }, {d}, {b, f}, {a, c, e, g}) An diesem Beispiel lässt sich auch leicht erkennen, dass für i 1 immer N i = 2 i 1 gilt. Eine weitere Folgerung aus der Definition ist, dass der von N induzierte Pfad immer die Kosten 1 hat. Definition 8 (Minimale Baum-Sequenz). Gegeben sei eine k-sequenz N für einen P- Graphen G k. Eine Folge ˆT = ( ˆT 0,..., ˆT k ) wird minimale Baum-Sequenz genannt und induktiv definiert wie folgt: 1. ˆT 0 ist ein beliebiger Steinerbaum für N 0 und kein ˆT 0 ˆT 0 ist Steinerbaum für N < i k : ˆT i 1 ˆT i und ˆT i ist Steinerbaum für N i und kein ˆT i ˆT i ist Steinerbaum für N i. Offensichtlich ist ˆT 0 immer ein einfacher Pfad zwischen v 0 und v 1. Mithilfe dieser und der vorherigen Definition können wir jetzt ein Lemma formulieren, welches eine untere Schranke für Algorithmen angibt, die minimale Baum-Sequenzen erzeugen. Ein beliebiger Algorithmus A erzeugt ˆT i immer basierende auf dem Wissen über ˆT i 1 und N i. Es kann gezeigt werden, dass Knotenmengen N i existieren, die immer die Kosten von A mindestens auf die Größe der unteren Schranke treiben. Wegen der Restriktion von σ auf eine k-sequenz existiert immer ein minimaler Steinerbaum mit Kosten 1, nämlich ein einfacher Pfad von v 0 nach v 1. Lemma 2. Sei A ein Algorithmus für DST-N, der für alle Instanzen I = (G k, cost, σ) eine minimale Baum-Sequenz ˆT konstruiert. Dann existiert eine Folge von Anfragen auf G k, die einer k-sequenz N entspricht, so dass für alle 0 i k gilt: cost( ˆT i ) i. (3)

270 262 Holger Hagedorn Beweis. Das Lemma wird per vollständiger Induktion über i für alle ˆT i mit 0 i k bewiesen. Wir konstruieren dazu eine Eingabe σ, die einer k-sequenz N entspricht, so dass Ungleichung (3) gilt. Der Induktionsanfang ist bei i = 0 und i = 1. Für i = 0 gilt die Behauptung, da N 0 nach Definition nur die Knoten v 0 und v 1 beinhaltet, die über einen einfachen Pfad ˆT 0 mit Kosten 1 im Graphen G k verbunden werden können (vgl. Abbildung 2). N 0 bildet somit den Präfix einer k-sequenz und Ungleichung (3) gilt. Für N 1 bleiben uns nun zwei Knoten auf Level 1 zur Auswahl. Wenn wir den Knoten nehmen, der nicht auf dem Pfad ˆT 0 liegt, dann ergibt sich für ˆT 1 ein Baum mit Kosten cost( ˆT 1 ) 1, 5 und Ungleichung (3) gilt. Natürlich existiert auch ein Pfad mit Kosten 1 über den neuen Knoten, aber da per Definition ˆT 0 ˆT 1 gelten muss, kann dieser von A nicht gewählt werden. Da der Pfad mit Kosten 1 für N 0 und N 1 existiert (unabhängig von ˆT 0 und ˆT 1 ), bilden (N 0, N 1 ) einen Präfix einer k-sequenz. Als Induktionsvoraussetzung nehmen wir an, dass Ungleichung (3) für alle j mit 0 j i 1 gilt und (N 0,..., N i 1 ) der Prefix einer k-sequenz ist. Der Induktionsschritt geht nun von i 1 nach i. Wieder wird ein Gegner angenommen, der immer unter Erhalt einer k-sequenz auf den Algorithmus A reagiert und Knoten so setzt, dass die gewünschten Kosten verursacht werden. Der Algorithmus A hat also einen Baum ˆT i 1 erzeugt, der Gegner wählt nun eine Folge von Anfragen N i gerade so, dass A nur einen Baum ˆT i erzeugen kann, der mindestens die gewünschten Kosten hat. Per Widerspruch können wir beweisen, dass zu jedem Knoten v N i 1 nur höchstens ein Knoten pro i-adjazentem Schwester-Paar in ˆT i 1 enthalten ist. Dazu betrachten wir einen Knoten v N i 1. Dieser ist nach Lemma 1 (2) i-adjazent zu genau vier Knoten auf Level i, aufgeteilt auf zwei Schwesterpaare. Angenommen ˆT i 1 würde beide Knoten eines Level i Schwesterpaares enthalten. Dann müsste ˆT i 1 entweder einen Zyklus enthalten, was aber der Minimalität dieses Steinerbaums widersprechen würde. Oder aber es gäbe einen Blattknoten z ˆT i 1, der sich auf einem Level größer als i 1 befinden würde. Da N j (0 j i 1) nach Definition nur Knoten der Level 0 bis i 1 enthält, gilt z N j. D.h. z könnte auch weggelassen werden, also ist wiederum die Minimalitätsbedingung verletzt. Damit kann es in ˆT i 1 zu jedem Knoten v N i 1 nur höchstens einen Knoten pro i-adjazentem Schwester- Paar geben. Um die Anfrage N i zu bilden, wählen wir nun für jedes v N i 1 jeweils einen der noch nicht in ˆT i 1 enthaltenen i-adjazenten Schwesterknoten x aus (vgl. Abbildung 5). Nach I.V. gibt es einen Pfad mit Kosten 1, der alle Knoten aus jedem N j, 0 j i 1 enthält. In der Abbildung würde dieser Pfad durch u und v verlaufen. Also existiert auch ein Pfad über x, da alle weiteren Knoten die zwischen u und v liegen einen Level größer als i besitzen und also nicht aus (N 0,..., N i 1 ) stammen. Damit gilt die k-sequenz Eigenschaft auch mit dem neuen Knoten x N i. Nach Lemma 1 (1) ist jeder Level i Knoten i-adjazent zu einem Knoten auf Level i 1. Daraus folgt, dass in N i alle Knoten des Levels i auf diesem Pfad enthalten sind. Somit ist auch (N 0,..., N i 1, N i ) Präfix einer k-sequenz. Kommen wir nun zu den Kosten des von A generierten Baumes ˆT i. Die Anzahl der Knoten in N i 1 beträgt genau 2 i 2. Da zu jedem dieser Knoten zwei Knoten auf Level i verbunden werden, sind insgesamt genau 2 i 1 Knoten in N i enthalten. Die kürzeste Verbindung dieser Knoten aus N i mit den Knoten aus ˆT i 1 entspricht einer Kante im G i bzw. einem korrespondierenden Pfad im G k. Per Definition des P-Graphen hat eine solche Verbindung Kosten 2 i.

271 Dynamische Steinerbäume 263 v N i 1 Level i 1.. Level > i ˆT i 1 x y ˆT i 1 Level i.. Level > i u Level j, 0 j < i 1 Abb. 5. Ausschnitt des Induktionsschritts = cost( ˆT i ) cost( ˆT i 1 ) + (2 i 1 2 i ) I.V. 1 + (i 1) = i Damit ist insgesamt das Lemma bewiesen. Theorem 1. Sei A ein beliebiger Algorithmus für DST-N. Dann existiert eine Instanz I = (G, cost, σ), so dass gilt 0 < i K : A(S i ) OP T (S i ) log( S i 1). (4) Diese Schranke gilt insbesondere, wenn wir uns auf das Hinzufügen von Knoten beschränken. Beweis. Die Idee hinter dem Beweis ist, dass wir uns eine k-sequenz auf einem P-Graphen konstruieren, so dass Lemma 2 zur Ungleichung (4) umformuliert werden kann. Wir definieren uns dazu eine Instanz I = (G k, c k, σ) von DST-N mit σ i = (u i, add) für alle 0 i K = 2 k. Dabei gilt u 0 = v 0, u 1 = v 1 und für i > 1 gilt u i N j mit j = log i für eine k-sequenz N. Diese entspricht genau der k-sequenz, die wir als Eingabe für den Algorithmus A aus Lemma 2 benötigen. Zuerst verdeutlichen wir warum σ durch diese Definition einer k-sequenz N entspricht. Man kann leicht nachrechnen, dass nach allen 2 i add-anfragen die Knoten für N i vollständig sind. Insbesondere brauchen wir also K = 2 k add-anfragen um eine k-sequenz zu erhalten. σ entspricht also einer k-sequenz N. Damit gilt auch die Ungleichung (3). Lemma 2 gilt allerdings nur im Bereich zwischen 0 und k. Darum ersetzen wir das i in (3) durch log(i), denn log(2 k ) = k. Wir runden diesen Wert zusätzlich ab, da wir nach Lemma 2 nur für eine j-sequenz mit j = log i die untere Schranke für die Kosten garantieren können. Nun haben wir immer noch eine Abhängigkeit von i, wir wollen die Ungleichung aber abhängig machen von der Menge der Terminale S i. Da S i 1 = i, kann dies leicht ersetzt werden. Damit gilt insgesamt die Ungleichung (4) und das Theorem ist bewiesen.

272 264 Holger Hagedorn Algorithmus 28 DGA Input: (G, cost, σ) Output: (T i) 0 i K 1: T 0 ({v 0}, ) 2: S 0 {v 0} 3: i 1 4: for i K do 5: if σ i is add request then 6: p i Shortest path from v i to T i 1 7: T i T i 1 p i 8: S i S i 1 {v i} 9: else if σ i is remove request then 10: T i T i 1 11: S i S i 1 \ {v i} 12: while w V (T i) \ S i : deg(w) = 1 do 13: T i T i \ w 2.2 Dynamischer Greedy-Algorithmus Der Online-Algorithmus DGA (Dynamic Greedy Algorithm) berechnet eine Lösung für das Problem DST-N mit einem Greedy-Ansatz. Im wesentlichen verbindet er neue Knoten mit dem nächstgelegenen Knoten des aktuellen Steinerbaumes. Algorithmus 28 beschreibt die Details in Pseudocode. Wir zeigen als nächstes, dass DGA strikt log S i -kompetitiv ist. Ein wesentlich einfacherer Beweis als der im Paper von Imase und Waxman stammt von Bartal [2]. Theorem 2. Sei I = (G, cost, σ) eine beliebige Instanz des Problems DST-N mit Anfragen σ = σ 0,..., σ K und Terminalen S i zum Zeitpunkt i. Wenn alle Anfragen in der Form σ i = (v i, add) sind, dann gilt: 1 i K : DGA(S i ) OP T (S i ) log S i (5) Beweis. Sei I = (G, cost, σ) eine Instanz von DST-N und Ti der minimale Steinerbaum, der alle Knoten in S i spannt. Weiterhin sei H i ein minimaler Kreis über alle Knoten in S i. Abbildung 6 illustriert diesen Zusammenhang. Der Kreis ist von oben beschränkt durch das zweifache des optimalen Steinerbaumes, also cost(h i ) 2 cost(t i ). Diese obere Schranke ergibt sich aus dem Kreis der entsteht, wenn man einfach an einem beliebigen Knoten von Ti startet und einmal aussen an dem ganzen Baum entlanggeht. Dabei muss jede Kante einmal in Hin- und einmal in Rückrichtung passiert werden, was die zweifachen Kosten verursacht. Natürlich kann H i aber auch andere Kanten verwenden und daher günstiger sein. Betrachten wir zwei beliebige adjazente Knoten u, v H i, wobei v nach u hinzugefügt wurde. Die Kosten für das Hinzufügen von v sind maximal die Kosten des Pfades zwischen u und v im Kreis H i, da alle benachbarten Knoten in H i durch einen kürzesten Pfad verbunden sind. Wir teilen nun alle Knoten entlang des Kreises H i in S i /2 Paare von adjazenten Knoten auf (vgl. Abbildung 6). Dabei können die Paare gerade so gewählt werden, dass die

273 Dynamische Steinerbäume 265 akkumulierten Kosten ihrer verbindenden Kanten nur halb so groß sind wie die des gesamten Kreises. Daraus folgt, dass die Kosten dieser Paare auch nur maximal so hoch sein können, wie die von Ti. Angewendet auf DGA befinden wir uns also in der Situation, in der jeweils genau einer der Knoten eines solchen Knotenpaares gegeben ist und der zweite als add-anfrage hinzugefügt wird. Die Kosten die DGA für diese halbe Menge der Terminale verursacht sind folglich höchstens so teuer wie die Kosten von Ti, also DGA( S i /2 ) OP T (S i ). Wichtig zu beachten ist dabei, dass diese halbe Menge der Terminale nicht zwingend der Suffix der Anfragen σ sein muss, sondern nur paarweise die zuletzt hinzugefügten Knoten betrachtet werden. Entfernen wir nun diese zuletzt hinzugefügten Knoten, dann können wir die übrig gebliebenen wiederum zu einem minimalen Kreis verbinden und in adjazente Knotenpaare aufteilen. Die Kosten von DGA entsprechen wiederum maximal den Kosten von Ti. Dies wird sukzessive so fortgeführt bis nur noch ein Knoten übrig bleibt. Die Frage ist nun also, wie oft wir diese Aufteilung vornehmen müssen wie oft wir also maximal die Kosten von Ti beanspruchen. Dazu können wir die obige Ungleichung als eine Rekurrenzgleichung auffassen. Nach Auflösen ergibt sich, dass wir log S i mal die Menge der Terminale wie beschrieben aufteilen müssen. Daraus folgt die Ungleichung (5) und das Theorem ist bewiesen. 2.3 Remove Requests Bislang haben wir nur add-anfragen betrachtet. Wenn jetzt noch zusätzlich remove- Anfragen hinzukommen, dann kann gezeigt werden, dass im Worst-Case die Kosten eines Algorithmus A für DST-N unbeschränkt sind. Die Kosten sind dann abhängig von der Anzahl der Terminale. Theorem 3. Sei A ein Algorithmus für DST-N. Für alle Paare M, l N + gibt es eine Instanz (G, cost, σ) von DST-N und ein j N +, so dass T i H i v u Abb. 6. Der minimale Steinerbaum Ti (schwarze Linien), der minimale Kreis H i (graue Linien) und dessen Aufteilung in S i /2 Paare von adjazenten Knoten (fett gestrichelte Linien).

274 266 Holger Hagedorn ɛ 1 ɛ 1 ɛ ɛ 1 1 ɛ 1 1 ɛ 1 1 ɛ ɛ Abb. 7. Spezieller Graph in dem V = 2M + 4 gilt, hierbei für M = 6. Die hellen Knoten bilden einen Kreis C mit M + 2 Knoten. A(S i ) M OP T (S i ) (6) für alle j < i j + l unabhängig von der Anzahl der Terminale in S i. Beweis. Wir betrachten folgenden gewichteten Graphen G = (V, E) mit V = 2M + 4. Hierin befindet sich ein Kreis C mit M + 2 Knoten in dem alle Kanten das Gewicht 1 haben. Die restlichen M + 2 Knoten sind jeweils durch genau eine Kante mit Gewicht ɛ zu einem der Knoten in C verbunden. Ein Beispiel dieses Graphen für M = 6 findet sich in Abbildung 7. Für einen Algorithmus A werden nun mit den ersten M + 2 Anfragen die Knoten des Kreises hinzugefügt. Also gilt für alle 0 i M + 1, dass σ i = (q i, add). Da immer der nächstliegende Knoten hinzugefügt wird, ist der vom Algorithmus A erstellte Steinerbaum T M+1 ein Pfad, der bis auf eine Kante dem Kreis C entspricht. Die Knoten dieses Pfades seien der Reihe nach durchnummeriert mit q 0,..., q M+1. Die Kosten entsprechen genau cost(t M+1 ) = M + 1. In den nächsten M Schritten wird immer wieder ein Knoten mit Kantengrad zwei aus dem Kreis entfernt. Formal gilt also für alle M +2 i 2M +2, dass σ i = (v i, remove) und deg(v i ) = 2. Der Algorithmus A wird die aus der Menge der Terminale entfernten Knoten trotzdem weiter benutzen, da er nach Definition von DST-N nur Kanten löschen, aber keine neuen einfügen darf. Daraus folgt, dass T M+1 = T M+2 =... = T 2M+1. Nach entfernen der Knoten sind nur noch gerade die zwei Knoten in der Menge der Terminale übrig, die zuvor die Start- und Endknoten des Pfades T M+1 waren, also S 2M+1 = {q 0, q M+1 }. Da T M+1 = T 2M+1 ist, gilt cost(t 2M+1 ) = M + 1. Allerdings wäre ein optimaler Steinerbaum lediglich die Verbindung der zwei Knoten q 0 und q M+1 durch deren verbindende Kante und somit OP T (S 2M+1 ) = 1. An dieser Stelle gilt also die Ungleichung (6). Um diese Eigenschaft aufrecht zu erhalten, werden nun für alle σ i mit i > 2M + 2 immer alternierend ein Knoten hinzugefügt und entfernt. Dieser Knoten ist genau einer der Knoten, die durch eine Kante mit Gewicht ɛ mit q 0, q M+1 T 2M+1 verbunden sind. Der Wert von ɛ kann beliebig klein gemacht werden, so dass M ɛ M (1 + ɛ) gilt. Somit gilt nach jedem Schritt die Ungleichung 6 und das Theorem ist bewiesen.

275 Dynamische Steinerbäume DST-R In diesem Abschnitt werden wir aus Platzgründen nur einen kurzen Überblick über die Ergebnisse in [1] zum Problem DST-R geben. Zur Erinnerung, der Unterschied zu DST- N war, dass nun Änderungen in existierenden Verbindungen zulässig sind. Die Anzahl der Änderungen ist aber beschränkt. Falls die Anzahl nicht beschränkt ist, dann ist das Problem in jedem Schritt äquivalent zum statischen Steinerbaum-Problem ST. Für DST-R gibt es eine Klasse von Algorithmen, die δ-kanten-beschränkte Algorithmen genannt werden. Jeder spezifische Algorithmus (EBA(δ)) ist bestimmt durch eine positive reelle Zahl δ 1. Doch bevor wir etwas über diese Algorithmen aussagen können, benötigen wir die folgenden zwei Definitionen. Definition 9 (δ-kanten-beschränkt). Seien u, v T und T ist ein Baum. Falls u und v die folgende Bedingung erfüllen, werden sie als δ-kanten-beschränktes Paar bezeichnet. Für ein beliebiges e p(u, v, T ) gelte cost(e) δ dist(u, v) (7) mit p(u, v, T ) als Menge von Kanten auf dem Pfad zwischen u und v in T. Weiterhin wird T als δ-kanten-beschränkter Baum bezeichnet, wenn jedes Knotenpaar in T δ-kantenbeschränkt ist. Definition 10 (Erweiterungsbaum). Für eine Knotenmenge S wird ein Baum T als Erweiterungsbaum bezeichnet, falls er die folgenden Eigenschaften erfüllt: S V. Für einen beliebigen Knoten x V \ S ist deg(x) > 2 in T. Der Algorithmus EBA(δ) basiert auf dem Algorithmus M ST A [4], der einen minimalen Spannbaum approximiert. Er liefert für eine gegebene Knotenmenge einen Spannbaum, der nie höhere Kosten hat als das Zweifache vom Optimum. Für DST-R jedoch verursacht er unter Umständen sehr viele Änderungen von Verbindungen. Die von M ST A generierten Spannbäume sind 1-Kanten-beschränkte Bäume, daher kann ein δ-kanten-beschränkter Baum als eine Generalisierung davon verstanden werden. Die nun folgenden Theoreme sind Folgerungen aus Lemmas, die diese Schranken für δ-kanten-beschränkte Bäume und Erweiterungsbäume zeigen. Da EBA(δ) solche Erweiterungsbäume für jedes S i berechnet, gelten die Schranken auch für die von diesem Algorithmus erzeugten Lösungen. Theorem 4. Für einen beliebigen von EBA(δ) erstellten Baum T i gilt, dass er ein δ- Kanten-beschränkter Erweiterungsbaum für S i ist und für alle 0 i K gilt weiterhin cost(t i ) 2δ MST A(S i ) 4δ OP T (S i ). (8) Theorem 5. Falls alle σ i auf add-anfragen beschränkt sind, dann genügt jeder von EBA(δ) erzeugte Baum T i der folgenden Ungleichung: cost(t i ) δ MST A(S i ) 2δ OP T (S i ). (9)

276 268 Holger Hagedorn Als letztes stellen wir noch eine obere Schranke für die Gesamtanzahl von Änderungen für EBA(δ) vor. Dabei bezeichne K a die Anzahl add-anfragen und K r die Anzahl remove- Anfragen. Theorem 6. Sei I = (G, cost, σ) eine beliebige Instanz. Falls δ 2, dann ist die obere Schranke für die totale Anzahl an Änderungen die von EBA(δ) benötigt werden gegeben durch K α i 1 2 K a( 4K a 3 3) + K r. (10) i=0 4 Fazit In dieser Ausarbeitung haben wir zwei Ausprägungen des Problems Dynamic Steiner Tree vorgestellt. Für DST-N konnten wir zeigen, dass es im allgemeinen Fall unbeschränkt ist. Lässt man jedoch nur das Hinzufügen von Knoten zu, so gibt es eine obere Schranke. Wir haben den Greedy-Algorithmus DGA vorgestellt, dessen Worst-Case Performanz innerhalb dem zweifachen des optimalen Falles liegt. Weiterhin haben wir für DST-R den Algorithmus EBA(2) vorgestellt, dessen Performanz im achtfachen des Optimums liegt. Literaturverzeichnis 1. Imase M, Waxman BM (1991) Dynamic Steiner Tree Problem. SIAM J. Disc. Math. Vol. 4 No. 3: Bartal Y (1994) Competitive Analysis of Distributed On-line Problems Distributed Paging. Ph.D. Thesis, Tel-Aviv University, Tel-Aviv 3. Borodin A, El-Yaniv R (1998) Online Computation and Competitive Analysis. Cambridge University Press, New York 4. Kou L, Markowsky G, Berman L (1977) A fast algorithm on Steiner trees. Acta Inform. 3:

277 Approximationen und Alternativen für Aspektgraphen David Schmelter Universität Paderborn Zusammenfassung. Ein wesentliches Problem bei der Verwendung von Aspektgraphen ist ihre Komplexität, sowohl was die Größe, als auch den Konstruktionsaufwand betrifft. Dies macht eine praktische Verwendung bereits für 3D Szenen mit wenigen hundert Polygonen unmöglich. In dieser Arbeit werden daher sowohl Approximationen (im Wesentlichen der Finite-Resolution Aspect Graph) als auch Alternativen (im Wesentlichen das Visibility Skeleton) für Aspektgraphen betrachtet, denen eine gewisse Praxisrelevanz zugeschrieben werden kann. Der Finite-Resolution Aspect Graph bietet für den Fall der orthografischen Projektion ein Verfahren, das einen Aspektgraphen mit geringerer Komplexität im Vergleich zum klassischen Aspektgraphen ermöglicht. Allerdings leidet dieses Verfahren unter einem hohen Konstruktionsaufwand, was eine praktische Verwendung bereits für einfache Szenen verwehrt. Mit dem Visibility Skeleton existiert eine interessante Alternative für Aspektgraphen, mit der eine Reihe unterschiedlicher Anfragen auch für nicht-triviale 3D Szenen effizient beantwortet werden können. 1 Einleitung Approximationen Alternativen Zusammenfassung Finite-Resolution Aspect Graphs Grundlagen Konstruktion des Finite-Resolution Aspect Graphs Anwendungen Zusammenfassung Visibility Skeleton Grundlagen Definitionen Datenstruktur des Visibility Skeletons Konstruktion des Visibility Skeletons Anwendungen Zusammenfassung Zusammenfassung und Diskussion Literaturverzeichnis

278 270 David Schmelter 1 Einleitung Viele Verfahren in der Computergrafik (beispielsweise globale Beleuchtungsverfahren wie Radiosity) benötigen detaillierte Information über globale Sichtbarkeiten von Objekten. Mit Aspektgraphen [8] existiert eine Datenstruktur, mit der diese Informationen exakt für jeden Punkt einer dreidimensionalen Szene gespeichert und abgefragt werden können. Die Kosten für die Erzeugung machen eine praktische Verwendung des Aspektgraphen bereits für Szenen mit wenigen hundert Polygonen allerdings unmöglich (unter Annahme perspektivischer Projektion ist die maximale Größe des Aspektgraphen für n Polygone O(n 9 ), die Konstruktionszeit beträgt O(n 9 log n)). Es gibt unterschiedliche Ansätze, um diesem Problem zu begegnen. Zum einen wurden Approximationen für Aspektgraphen entwickelt. Darüber hinaus gibt es alternative Verfahren, die sich auf eine etwas andere Weise dem Sichtbarkeitsproblem nähern. In dieser Arbeit werden sowohl unterschiedliche Approximationen (Finite-Resolution Aspect Graphs, Scale Space Aspect Graphs und Weighted Aspect Graphs) als auch alternative Verfahren (das Visibility Skeleton und der 3D Visibility Complex) vorgestellt und untersucht. Der Schwerpunkt soll hierbei auf Verfahren mit einer gewissen Praxisrelevanz liegen. Wir werden sehen, dass hierfür Aspektgraphen mit endlicher Auflösung (Finite-Resolution Aspect Graphs) und das Visibility Skeleton in Frage kommen. 1.1 Approximationen In diesem Abschnitt wird zunächst ein kurzer Überblick über die im vorherigen Abschnitt bereits erwähnten Approximationen für Aspektgraphen gegeben. Finite-Resolution Aspect Graphs Bei der Konstruktion von Aspektgraphen wurde bisher eine Kamera bzw. Projektion mit unendlicher Auflösung angenommen. Typischerweise besitzt eine reale Kamera aber nur eine endliche Auflösung. Daraus resultiert, dass in einem Aspektgraphen Details berücksichtigt werden, die vom Betrachter gar nicht unterschieden werden können. Abbildung 1 verdeutlicht dies an einem Beispiel: Auf der linken Seite der Abbildung ist eine Kante und ein Vertex in einer Projektion mit unendlicher Auflösung dargestellt. In diesem Fall ist der Abstand beider Elemente erkennbar. Auf der rechten Seite der Abbildung ist die gleiche Projektion mit endlicher Auflösung dargestellt. In diesem Fall scheinen sich beide Elemente zu berühren, der Abstand ist für einen Betrachter nicht erkennbar. Abb. 1. Projektion mit unendlicher Auflösung (links) und endlicher Auflösung (rechts). Nach [11]

279 Approximationen und Alternativen für Aspektgraphen 271 Shimshoni und Ponce haben in [11] einen Algorithmus zur Konstruktion eines Aspektgraphen für den Fall einer orthografischen Projektion vorgestellt, der die Einschränkung endlicher Auflösung einer realen Kamera berücksichtigt. Dieser Aspektgraph speichert Aspekte eines Objekts mit endlicher anstatt unendlicher Auflösung. Shimshoni und Ponce gehen davon aus, dass ein solcher Aspektgraph eine relativ geringe Komplexität besitzt und die entsprechenden Aspekte dennoch genug Details, z.b. zur Objekterkennung, enthalten. Hierzu wurde der Schwellenwert ɛ eingeführt. Beispielsweise können zwei Vertexe unterschieden werden, wenn sie in einer Projektion mit endlicher Auflösung mindestens um den Wert ɛ voneinander entfernt sind. Da der Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs vollständig implementiert wurde, wird dieses Verfahren in dieser Arbeit in Kapitel 2 näher untersucht. Scale Space Aspect Graphs Der von Eggert et al. in [6] vorgestellte Scale Space Aspect Graph kann in gewissem Sinne als eine Verallgemeinerung des Finite-Resolution Aspect Graphs aufgefasst werden. Man kann sich vorstellen, dass die Komplexität eines Aspektgraphen mit endlicher Auflösung immer mehr abnimmt, je größer der Schwellenwert ɛ gewählt wird. Die Idee ist, ɛ durch den Scale- Parameter σ mit einem stetigen Wertebereich zu ersetzen um so einen Aspektgraphen mit beliebig anpassbarer Komplexität zu erhalten. Für σ = 0 entspricht der Finite-Resolution Aspect Graph einem klassischen Aspektgraphen mit unendlicher Auflösung. Wird σ stetig erhöht erhält man schließlich einen Aspektgraphen mit nur einem Aspekt. In [6] geht es in erster Linie darum, unterschiedliche Interpretationen von Scale-Parametern zu identifizieren und zu untersuchen. Die Arbeit liefert allerdings keinen Algorithmus zur Konstruktion des Scale Space Aspect Graphs, bleibt also auf theoretischer Ebene und wird daher im Kontext dieser Ausarbeitung nicht weiter betrachtet. Weighted Aspect Graphs Arie stellt in [1] eine weitere Möglichkeit vor, um Aspektgraphen zu vereinfachen bzw. zu approximieren. Er gibt eine Wahrscheinlichkeit (bzw. das Gewicht) für ein Element eines Objektes an, mit der dieses Element im Bildraum sichtbar ist. Abbildung 2 zeigt zur Verdeutlichung einen Würfel unter orthografischer Projektion. Die markierte Fläche a ist exakt in der oberen Halbkugel von S 2 sichtbar. Somit ist das Gewicht dieser Fläche 1 2. Die Idee von Arie ist, für jeden Knoten des Aspektgraphen ein solches Gewicht zu berechnen. Aspekte mit einem relativ niedrigen Gewicht können als unwichtig aufgefasst und aus dem Aspektgraphen entfernt werden. Auch diese Arbeit bleibt allerdings auf theoretischer Ebene. 1.2 Alternativen In diesem Abschnitt wird ein kurzer Überblick über alternative Verfahren bzw. Datenstrukturen, die Informationen über globale Sichtbarkeiten zur Verfügung stellen, gegeben.

280 272 David Schmelter a Abb. 2. Würfel unter orthografischer Projektion Visibility Skeleton Das Visibility Skeleton [5] ist eine im Jahr 1997 von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur, die exakte, globale Sichtbarkeitsinformationen einer 3D Szene in Form einer Graphstruktur enthält. Verschiedene Verfahren, die Informationen über globale Sichtbarkeiten benötigen (z.b. Verfahren zum Occlusion Culling oder globale Beleuchtungsverfahren wie Radiosity) können diese Informationen effizient über das Visibility Skeleton abfragen. Da das Visibility Skeleton für unterschiedliche Anwendungen genutzt werden kann, wird es von den Autoren auch als multi-purpose Tool beworben. Das Visibility Skeleton enthält im Gegensatz zu Aspektgraphen allerdings keine Informationen über die unterschiedlichen Aspekte eines Objekts, eignet sich also nicht zur Objekterkennung. Wie auch der Finite-Resolution Aspect Graph wurde das Visibility Skeleton vollständig implementiert und wird in Kapitel 3 näher betrachtet. 3D Visibility Complex Der 3D Visibility Complex [3] ist eine im Jahr 1996 ebenfalls von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur die, ebenso wie das Visibility Skeleton, alle globalen Sichtbarkeitsinformationen einer 3D Szene enthält. Die nulldimensionalen und eindimensionalen Elemente des 3D Visibility Complex 1, sind die gleichen wie die des Visibility Skeletons (Hierdurch erklärt sich auch der Name Visibility Skeleton: Das Visibility Skeleton ist gewissermaßen das Skelett des 3D Visibility Komplex). Darüber hinaus enthält der 3D Visibility Complex Elemente mit zwei, drei und vier Dimensionen. Diese höher dimensionalen Elemente können für einige spezifische Berechnungen, z.b. zur Berechnung von Aspekten oder dynamische Updates, verwendet werden. Darüber hinaus macht die Verwendung des 3D Visibility Complex für spezielle Szenen Sinn, in denen Gitter hintereinander ausgerichtet und leicht gedreht sind (also viele Sichtbarkeitswechsel vorliegen). Im Gegensatz zum Visibility Skeleton ist der 3D Visibiliy Complex kompliziert zu implementieren und zu verwenden, da eine vierdimensionale Aufteilung der 3D Szene konstruiert werden muss. Tatsächlich wurden die in [3] vorgestellten Konzepte zum Zeitpunkt 1 Diese Elemente werden ausführlich in Abschnitt 3.1 vorgestellt

281 Approximationen und Alternativen für Aspektgraphen 273 der Veröffentlichung noch nicht implementiert. Aus diesem Grund wird auch der 3D Visibility Complex mit Bezug zu praxisrelevanten Arbeiten in dieser Ausarbeitung nicht näher betrachtet. 1.3 Zusammenfassung Es gibt sowohl eine Reihe von Approximationen für Aspektgraphen, als auch alternative Verfahren, die sich auf eine etwas andere Art und Weise dem Problem der globalen Sichtbarkeit nähern. Wirkliche Praxisrelevanz haben von den vorgestellten Ansätzen aber nur Aspektgraphen mit endlicher Auflösung (Finite-Resolution Aspect Graphs) und das Visibility Skeleton. Aus diesem Grund werden diese beiden Arbeiten in dieser Ausarbeitung näher betrachtet. 2 Finite-Resolution Aspect Graphs Der Finite-Resolution Aspect Graph wurde 1997 von Shimshoni und Ponce in [11] vorgestellt und ist ein Aspektgraph für den Fall einer orthografischen Projektion, dem ein Bildbereich mit endlicher Auflösung zugrunde liegt. Mit dem Finite-Resolution Aspect Graph sollen die folgenden beiden Probleme gelöst werden: 1. Ein wesentliches Problem von Aspektgraphen ist ihre Komplexität: Für eine Szene mit n Polygonen besitzt ein Aspektgraph unter Annahme einer orthografischen Projektion eine Größe von O(n 6 ) (vgl. [8]). Aus diesem Grund können Aspektgraphen mit unendlicher Auflösung nur bei sehr einfachen Objekten verwendet werden. Die Idee ist, durch Annahme einer Kamera mit endlicher Auflösung einen Aspektgraphen mit relativ geringer Komplexität zu erhalten. 2. In einem klassischen Aspektgraphen mit unendlicher Auflösung werden keine Aspekte gespeichert, die exakt an einem Sichtbarkeitswechsel auftreten, da diese Bereiche in der Theorie im VSP unendlich klein sind. In der Praxis treten diese Situationen allerdings häufig auf, da unterschiedliche Details eines Objekts aufgrund einer realen Kamera mit endlicher Auflösung im Bildbereich häufig verwaschen. Abbildung 3 zeigt hierfür ein Beispiel. Die grundsätzliche Idee ist, Aspekte dahingehend zu vereinfachen, dass unterschiedliche Details (z.b. Vertexe, Kanten, etc.), die im Bildraum weniger als um den Schwellenwert ɛ voneinander entfernt sind, vereinigt werden (vgl. Abbildung 3). Die Hoffnung liegt in der Entstehung eines Aspektgraphen mit relativ geringer Komplexität. Hierzu ist es notwendig, einige Besonderheiten bzgl. der Sichtbarkeitswechsel zu betrachten, wie wir im nächsten Abschnitt sehen werden. < ε Abb. 3. Links: Aspekt eines Objekts unter Annahme unendlicher Auflösung. Rechts: Der gleiche Aspekt unter Annahme endlicher Auflösung.

282 274 David Schmelter Die Autoren stellen in [11] einen vollständig implementierten Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs vor. Die Konstruktion erfolgt im Wesentlichen mit den folgenden Schritten: 1. Zunächst werden die kritischen Kurven (engl.: critical curves, vgl. [11]) berechnet, die aufgrund von Sichtbarkeitswechseln bei Annahme einer orthografischen Projektion entstehen. Diese Sichtbarkeitswechsel unterscheiden sich von denen klassischer Aspektgraphen, wie wir im folgenden Abschnitt sehen werden. 2. Im Anschluss daran werden die Schnittpunkte dieser kritischen Kurven berechnet. 3. Die kritischen Kurven und ihre Schnittpunkte werden im nächsten Schritt als Eingabe für einen Plane-Sweep Algorithmus benötigt, der den Sichtraum in nicht-kritische Regionen, also einen VSP, unterteilt. Das Resultat ist ein Aspektgraph bzw. VSP mit zunächst unendlicher Auflösung. 4. Jede dieser berechneten Regionen bzw. Aspekte wird nun vereinfacht, indem verschiedene Details (Vertexe, Kanten, etc.) die weniger als ɛ voneinander entfernt sind, vereinigt werden. 5. Dadurch, dass die einzelnen Aspekte vereinfacht werden, kann es passieren, dass adjazente Aspekte isomorph sind. Aus diesem Grund ist es notwendig, in einem dritten und letzten Schritt isomorphe Aspekte zu vereinigen. Wir werden sehen, dass der entstandene Finite-Resolution Aspect Graph eine geringere Größe als sein Pendant mit unendlicher Auflösung haben kann. Das große Problem ist allerdings, dass der Konstruktionsaufwand bereits für sehr einfache Objekte unter Umständen derart groß ist, dass die Konstruktion eines Aspektgraphen mit endlicher Auflösung nicht immer möglich ist. Im nächsten Abschnitt werden zunächst einige Grundlagen erläutert, die zum Verständnis des Algorithmus erforderlich sind. Hierzu gehören insbesondere einige Besonderheiten bzgl. der Sichtbarkeitswechsel, die bei Annahme einer Kamera mit endlicher Auflösung beachtet werden müssen. 2.1 Grundlagen In diesem Abschnitt werden einige Grundlagen, insbesondere zu Sichtbarkeitswechseln im Falle endlicher Auflösung, vermittelt. Insgesamt werden bei einer orthografischen Projektion unter Annahme endlicher Auflösung drei Arten von Sichtbarkeitswechseln unterschieden: VV, EV und EEE Sichtbarkeits-Ereignisse. Diese Ereignisse unterscheiden sich von denen im Falle unendlicher Auflösung, vereinfacht gesagt führen sie zu zusätzlichen kritischen Kurven im Sichtraum. Dies wird am Beispiel eines VV Sichtbarkeitswechsels verdeutlicht. Ein VV Ereignis tritt ein, sobald zwei Vertexe p und q exakt um den Wert ɛ voneinander entfernt sind (siehe Abbildung 4 (a)). Diese Bedingung führt zu exakt zwei gegenüberliegenden kritischen Kreisen im Sichtraum (vgl. Abbildung 4 (b)). Zur späteren Berechnung des VSPs ist eine explizite Darstellung dieser kritischen Kreise erforderlich. Am Beispiel des VV Sichtbarkeitswechsels wird diese Darstellung exemplarisch betrachtet: Sei v die Blickrichtung des Betrachters und p sowie q = p+u 1 die beiden Vertexe, die ein VV Ereignis hervorrufen. Das Ereignis tritt genau dann ein, wenn θ = arcsin( ɛ u 1 ) gilt. In diesem Fall ist der erste kritische Kreis, abhängig vom Winkel α, durch v(α) =

283 Approximationen und Alternativen für Aspektgraphen 275 p q p q ε (a) (b) u 3 d v α u 2 θ p u 1 q=p+u 1 (c) Abb. 4. VV Sichtbarkeitswechsel unter Annahme endlicher Auflösung u 1 +d(cos αu 2 +sin αu 3 ), α [0, 2π] gegeben (vgl. Abbildung 4 (c)), mit d = u 1 tan θ. u 1, u 2 und u 3 bilden eine orthonormale Basis des R 3. Der entgegengesetzte Kreis ist entsprechend durch v(α) gegeben. Ähnliche kritische Kurven existieren für VE und EEE Ereignisse. Abbildung 5 (a) zeigt ein Beispiel für ein VE Ereignis unter Annahme endlicher Auflösung. Der Sichtbarkeitswechsel tritt ein, sobald der Vertex v auf dem abgerundeten Rechteck liegt, das die Kante e in einem Abstand von ɛ umschließt. (b) zeigt ein Beispiel für ein EEE Ereignis. Es tritt ein, wenn der Abstand der beiden Schnittpunkte zwischen den Kanten e 1 und e 3 sowie e 2 und e 3 exakt ɛ beträgt. In [11] werden, ähnlich zu VV Sichtbarkeitswechseln, explizite Darstellungen der entsprechenden kritischen Kurven für VE und EEE Ereignisse eingeführt. Auf eine detaillierte Beschreibung dieser Darstellungen wird aus Gründen der Übersichtlichkeit an dieser Stelle verzichtet. e v ε ε e 1 (a) ε e 3 (b) e 2 Abb. 5. Beispiele für Sichtbarkeitswechsel unter Annahme endlicher Auflösung. (a) VE Ereignis (b) EEE Ereignis

284 276 David Schmelter 2.2 Konstruktion des Finite-Resolution Aspect Graphs In diesem Abschnitt wird die Konstruktion des Finite-Resolution Aspect Graphs am Beispiel des in Abbildung 6 (a) dargestellten L-förmigen Objekts betrachtet. (c) zeigt die durch die im vorigen Abschnitt vorgestellten Sichtbarkeitswechsel unter Annahme endlicher Auflösung induzierten kritischen Kurven dieses Objekts. Anstatt einer Kugel mit unendlichem Radius wird ein Würfel zur Repräsentation des Sichtraums verwendet. Dies ermöglicht die Konstruktion eines VSPs mit Hilfe eines Plane-Sweep Algorithmus. (d) zeigt schließlich den fertigen Finite-Resolution Aspect Graph. Teil (b) der Abbildung zeigt der Vollständigkeit halber die induzierten kritischen Kurven unter Annahme unendlicher Auflösung. Hierbei fällt auf, dass im Falle endlicher Auflösung wesentlich mehr kritische Kurven existieren, was, wie wir später sehen werden, ein wesentliches Problem dieses Verfahrens ist. 322 IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 19, NO. 4, APRIL 1997 (a) (b) (c) (d) Abb. 6. Beispielszene: (a) L-förmiges Objekt (b) die entsprechenden kritischen Kurven im Falle unendlicher Fig. 18. An L-shaped object and its aspect graph. (a) The object. (b) The infinite-resolution visual event curves. (c) The finite-resolution visual event Auflösung curves. (d) The (c) finite-resolution kritische Kurven aspect graph. im Falle endlicher Auflösung (d) Aspektgraph mit endlicher Auflösung. Quelle: [11] Berechnung der kritischen Kurven und ihrer Schnittpunkte Mit Hilfe der in Abschnitt 2.1 vorgestellten parametrisierten Darstellung der VV, VE und EEE Sichtbarkeitswechsel werden zunächst die kritischen Kurven und ihre Schnittpunkte berechnet. Die Berechnung der Schnittpunkte erfolgt mittels homotopischer Fortsetzung [7]. Abbildung 6 (c) zeigt eine Projektion der kritischen Kurven für das in (a) dargestellte Objekt. VSP Konstruktion mit Plane-Sweep Algorithmus Die zuvor berechneten kritischen Kurven und ihre Schnittpunkte dienen als Eingabe für einen Plane-Sweep Algorithmus. Abbildung 7 dient zur Illustration und zeigt ein einfaches Beispiel für eine Seite des Würfels, der den Sichtraum repräsentiert: Dargestellt sind drei Fig. 19. A series of aspects obtained by sweeping through adjacent views in the aspect graph. kritische Kurven in Form von durchgezogenen, schwarzen Linien. Die Schnittpunkte dieser Kurven sind grün hervorgehoben, ihre Endpunkte orange. Zusätzlich zu Schnitt- und Endpunkten sind ihre Extremal-Punkte in Bezug auf die Sweep-Richtung blau markiert. Schnitt-, End- und Extremal-Punkte werden im Folgenden als kritische Punkte bezeichnet. Die kritischen Punkte werden anhand der Sweep-Richtung und von oben nach unten sortiert und abgearbeitet. An jedem kritischen Punkt werden vertikale Linien zu den beiden to [8]). For the finite-resolution aspect graph we have chosen to be smaller than the length of edges of the object. The visual event curves of the finite-resolution aspect graph are shown in Fig. 18c. These curves bound 377 different regions. The aspect graph is shown in Fig. 18d: Adjacent regions yielding the same aspect have been merged, and the resulting 117 regions are shown in different shades of gray. Fig. 19 shows the qualitatively different aspects obtained by making a continuous sweep across some of the regions of the aspect graph. This sweep is indicated by the black diagonal line in Fig. 18d. The viewing direction corresponding to each aspect is indicated by a small circle. The aspects in Fig. 19 have been rendered by merging features curves are shown as heavy lines. The aspect graph shown Fig. 20c contains 357 regions. One of the main problems with aspect graphs is that as the object gets more complex the aspect graph itself becomes unmanageably complex. At the resolution used in Fig. 18, this problem is certainly not solved by our approach, since the finite-resolution aspect graph is larger than the infinite-resolution one. As grows larger, or object features get smaller, some of the aspect graph features disappear: Fig. 21 shows the finite-resolution visual event curves of an object and the aspect graph for which some of the edges are shorter than. The aspect graph is considerably more simple than the previous one; in fact, the features

285 Approximationen und Alternativen für Aspektgraphen 277 entsprechenden kritischen Kurven berechnet (in der Abbildung als gepunktete vertikale Linien dargestellt). Zusammen mit den kritischen Kurven induzieren diese vertikalen Linien Regionen. Zwei Regionen, deren gemeinsame Grenze eine vertikale Linie ist, gehören zur gleichen nicht-kritischen Region des VSPs, repräsentieren also einen Aspekt (an dieser Stelle noch mit unendlicher Auflösung). In Abbildung 7 sind die entsprechenden Aspekte durch unterschiedliche Grautöne hervorgehoben. Zusätzlich liefert der Plane-Sweep Algorithmus eine Blickrichtung für jede dieser Regionen. Die so berechneten nicht-kritischen Regionen bzw. Aspekte mit unendlicher Auflösung und ihre entsprechenden Blickrichtungen dienen als Eingabe für Schritt 4 des Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs. Sweep Richtung Abb. 7. Beispiel zur Verdeutlichung des Plane-Sweep Algorithmus zur Konstruktion des VSPs mit unendlicher Auflösung Vereinfachung der Aspekte Im nächsten Schritt wird jeder der zuvor berechneten Aspekte vereinfacht. Hierzu wird ein Aspekt mit Hilfe der zuvor berechneten Blickrichtung in den Sichtraum projeziert. Details (z.b. Vertexe), die weniger als ɛ voneinander entfernt sind, werden vereinigt. Das Resultat dieses Schritts ist ein Aspektgraph, der Aspekte mit endlicher Auflösung enthält. Vereinigung von isomorphen Aspekten Unter Umständen ist es möglich, dass nach dem vorigen Schritt einige adjazente Aspekte isomorph sind. Dies kann passieren, wenn unterschiedliche Ereignisse den gleichen vereinfachenden Effekt auf zwei adjazente Aspekte bewirken. Abbildung 8 zeigt hierfür ein Beispiel. Auf der linken Seite der Abbildung ist zunächst ein Aspekt mit unendlicher Auflösung dargestellt. Die obere und untere Kante der Vertexe p und q sind weniger als ɛ voneinander entfernt. Der entsprechende Aspekt mit endlicher Auflösung ist rechts dargestellt. In der Mitte der Abbildung ist ein weiterer Aspekt mit unendlicher Auflösung dargestellt. In diesem Fall sind die Vertexe p und q selbst weniger als ɛ voneinander entfernt, was den gleichen Aspekt mit endlicher Auflösung impliziert. Im letzten Schritt zur Konstruktion des Finite-Resolution Aspect Graphs werden daher adjazente Aspekte, die isomorph sind, vereinigt. Das Resultat ist der fertige Finite- Resolution Aspect Graph (vgl. Abbildung 6 (d)).

286 278 David Schmelter Laut Shimshoni und Ponce trägt dieser letzte Schritt im Wesentlichen zur geringeren Komplexität eines Aspektgraphen mit endlicher Auflösung gegenüber einem Aspektgraphen mit unendlicher Auflösung bei. q q <ε <ε p p Abb. 8. Unterschiedliche Ereignisse bewirken auf zwei adjazente Aspekte den gleichen vereinfachenden Effekt. Quelle: [11] Laufzeit und Komplexität Für eine Szene mit n Polygonen wird die Größe des Finite-Resolution Aspect Graphs in [11] mit O(n 8 ) angegeben. Der Konstruktionsaufwand für einen Aspektgraphen der Größe m, der im Wesentlichen durch den letzten Schritt, also die Vereinigung isomorpher, adjazenter Aspekte entsteht, beträgt O(m n 4 ), insgesamt also O(n 12 ) (vgl. [9]). 2.3 Anwendungen In diesem Abschnitt werden einige Beispielszenen vorgestellt und diskutiert, die in [11] untersucht wurden. Die erste Szene haben wir in Abbildung 6 bereits kennen gelernt. Das erste wesentliche Ziel von Shimshoni und Ponce war es, die Komplexität von klassischen Aspektgraphen in den Griff zu bekommen. Für die in Abbildung 6 verwendete Szene und Auflösung konnte dieses Problem nicht gelöst werden, der entstandene Finite-Resolution Aspect Graph ist komplexer als sein klassisches Gegenstück. Abbildung 9 zeigt eine weitere Beispielszene mit einem Objekt, das aus drei orthogonalen Streben besteht. In diesem Fall wurde die Auflösung so gewählt, dass sich der Aspekt des dargestellten Objekts zu drei Linien vereinfacht (vgl. (b)). Der in (c) gezeigte klassische Aspektgraph besteht aus 120 Regionen. Für den Fall endlicher Auflösung existieren 5060 Regionen, die in (d) dargestellt sind. Nachdem adjazente, isomorphe Aspekte vereinigt wurden, ergibt sich der in (e) dargestellt Finite-Resolution Aspect Graph, der aus lediglich 20 Regionen besteht. 324 IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 19, NO. 4, APRIL 1997 (a) (b) (c) (d) (e) Fig. 22. An object consisting of three orthogonal Abb. legs 9. Eine and its weitere aspect graph. Beispielszene. (a) The object. Quelle: (b) Its finite-resolution [11] aspect. (c) The infinite-resolution visual event curves. (d) The finite-resolution visual event curves. (e) The finite-resolution aspect graph.

287 (a) (b) (c) Approximationen und Alternativen für Aspektgraphen 279 Abbildung 10 (a) zeigt eine Szene mit einem einfachen nicht konvexen Objekt, (b) die kritischen Kurven bei unendlicher Auflösung. In diesem Fall war es aufgrund des hohen Konstruktionsaufwands nicht möglich, die für den Algorithmus zur Erstellung des Finite- Resolution Aspect Graphs benötigten kritischen Kurven unter Annahme endlicher Auflösung zu generieren. (d) Dieses Beispiel verdeutlicht das wesentliche Problem (e) an diesem Ansatz: Die Komplexität eines Finite-Resolution Aspect Graphs mag in der Tat geringer sein als die seines klassischen Gegenstücks. Die Kosten zur Berechnung sind unter Umständen aber bereits für Szenen mit wenigen Polygonen derart hoch, dass ein Aspektgraph mit endlicher Auflösung erst gar nicht generiert werden kann. Fig. 23. All qualitatively different finite-resolution aspects of an object consisting of three orthogonal legs. (a) All three legs are visible in the finiteresolution aspect. (b) One of the legs is foreshortened to a point in the finite-resolution aspect. (c) Two legs appear as one line in the finiteresolution aspect. (d) Two legs are close to each other but the width of the combined feature is more than and therefore they appear as a region in the finite-resolution aspect. (e) One of the legs is close to the other two legs but they are not close to each other causing all three of them to appear as a region in the finite-resolution aspect. (a) (b) Fig. 24. A very non-convex object and its infinite-resolution visual event curves. (a) The object. (b) The infinite-resolution visual event curves. Abb. 10. Beispielszene mit einem nicht konvexen Objekt. Quelle: [11] 2.4 Zusammenfassung Das wesentliche Problem von klassischen Aspektgraphen ist ihre Größe, die eine praktische Verwendung unmöglich macht. Mit dem Finite-Resolution Aspect Graph existiert eine Approximation, die dieses Problem teilweise löst. Das Problem bei dem Ansatz von Shimonshi und Ponce liegt allerdings in der aufwendigen Konstruktion, die bereits für relativ einfache Szenen fehlschlägt (vgl. Abbildung 10). 3 Visibility Skeleton Das Visibility Skeleton ist eine im Jahr 1997 von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur, die exakte globale Sichtbarkeitsinformationen einer 3D Szene enthält. Verschiedene Verfahren, die Informationen über globale Sichtbarkeiten benötigen (z.b. Verfahren zum Occlusion Culling oder globale Beleuchtungsverfahren wie Radiosity) können diese Informationen effizient über das Visibility Skeleton abfragen. Da das Visibility Skeleton für unterschiedliche Anwendungen genutzt werden kann, wird es von den Autoren auch als multi-purpose Tool beworben. Es zeichnet sich im Gegensatz zu klassischen Aspektgraphen durch eine gewisse Praxisrelevanz aus: In [5] wird gezeigt, dass die Komplexität des Visibility Skeletons für Testszenen mit etwas über 1000 Polygonen beherrschbar bleibt, sowohl was die Konstruktionszeit als auch die Größe des Visibility Skeletons angeht.

288 280 David Schmelter Um Informationen über globale Sichtbarkeiten effizient abfragen zu können, werden im Visibility Skeleton alle Sichtbarkeitswechsel einer 3D Szene gespeichert. Ein Sichtbarkeitswechsel (auch Line Swath) ist über eine dreidimensionale Fläche definiert, die durch exakt drei Polygonkanten gebildet wird (man spricht hier auch von Generator-Kanten). Die direkte Konstruktion dieser Sichtbarkeitswechsel ist allerdings sehr aufwendig. Aus diesem Grund betrachtet man Schnitte von Line Swaths, also Linien im dreidimensionalen Raum. Diese Linien werden maximal freie Liniensegmente oder auch MFLs (engl. Extremal Stabbing Line) genannt und sind durch exakt vier Generator-Kanten definiert. Das Visibility Skeleton einer 3D-Szene ist ein aus diesen maximal freien Liniensegmenten und Sichtbarkeitswechseln aufgebauter Graph. Zum besseren Verständnis werden die zentralen Elemente des Visibility Skeletons - maximal freie Liniensegmente und Sichtbarkeitswechsel - im Folgenden anhand von einigen Beispielen verdeutlicht um im Anschluss daran zu einer präzisen Definition dieser zentralen Elemente und des Visibility Skeletons zu kommen. 3.1 Grundlagen Abbildung 11 zeigt ein Beispiel für einen sogenannten EV Sichtbarkeitswechsel. Bewegt sich der Standpunkt des Betrachters von links nach rechts (verdeutlicht durch den oberen Teil der Abbildung), erscheint der Vertex v nicht länger über dem Boden, sondern über einem Polygon, das von der Kante e begrenzt wird. Es tritt also eine Änderung in der Topologie der Sichtbarkeit ein. Die Topologie ändert sich im Beispiel immer dann, wenn v und e auf einer Sichtlinie des Betrachters liegen. Die Menge aller Sichtlinien, die v und e schneiden, bildet den in der Abbildung blau dargestellten ev Line Swath mit einem Freiheitsgrad über die Kante e. ev ist also eine eindimensionale Fläche 2 (auch: 1D Element), die durch drei Generator-Kanten gebildet wird: Die beiden Polygonkanten des Vertex v und die Kante e. Abbildung 12 zeigt einen Sichtbarkeitswechsel, der aus drei unabhängigen Generator- Kanten gebildet wird, also einen EEE Line Swath. Wie zu erkennen ist, ist die durch einen Sichtbarkeitswechsel gebildete Fläche nicht notwendigerweise eben. v e 1 e 2 e ev e 3 e 1 e 2 e 3 Abb. 11. EV Line Swath. Quelle: [5] Abb. 12. EEE Line Swath. Quelle: [5] 2 Die Dimension bezieht sich hierbei auf den Freiheitsgrad über die Kante e

289 Approximationen und Alternativen für Aspektgraphen 281 Neben EV und EEE Line Swaths können noch Fv (für Face Vertex) und Fe (für Face Edge) Sichtbarkeitswechsel unterschieden werden. Tabelle 1 gibt eine Übersicht über die unterschiedlichen Ausprägungen von Sichtbarkeitswechseln und ihrer Generator-Elemente. Bezeichnung Generator-Elemente Erläuterung EV Eine Kante, ein Vertex Ein Vertex wird durch zwei Kanten definiert (siehe Abbildung 11) EEE Drei Kanten Entspricht der Definition eines Sichtbarkeitswechsels (siehe Abbildung 12) Fv Ein Polygon (Face), Ein Polygon wird durch mind. zwei Kanten ein Vertex definiert, der entsprechende Vertex dieses Polygons durch eine weitere Kante. Fe Eine Polygon, eine Kante Ähnlich zu Fv: Ein Polygon wird durch mind. zwei Kanten definiert, die dritte Kante stammt von einem anderen Polygon. Tabelle 1. Übersicht der möglichen Sichtbarkeitswechsel (nach [10]) Abbildung 13 zeigt ein Beispiel für ein VEE MFL. e 1 e 2 v (in der Abbildung rot dargestellt) wird durch den Schnitt der beiden EV Line Swaths e 1 v und e 2 v gebildet, also insgesamt durch vier Generator-Kanten (e 1 e 2 v ist somit zu e 1 v und e 2 v adjazent). Ein MFL ist somit eindeutig definiert und besitzt keinen Freiheitsgrad. Es besitzt also keine Dimensionen und wird im Folgenden als 0D Element bezeichnet. Abbildung 14 zeigt ein E4 MFL, das durch die vier voneinander unabhängigen Kanten e 1, e 2, e 3 und e 4 gebildet wird. v e 1 e 2 e 1 e 3 e 2 e 1 e 2 v e e 1 v 2 v e 4 Abb. 13. VEE Extremal Stabbing Line. Quelle: [5] Abb. 14. E4 Extremal Stabbing Line. Quelle: [5] Neben VEE und E4 Extremal Stabbing Lines existieren noch eine Reihe weiterer Ausprägungen. Tabelle 2 gibt eine Übersicht über die möglichen Ausprägungen von maximal freien Liniensegmenten und ihrer Generator-Elemente. Das Visibility Skeleton ist ein durch MFLs und Line Swaths aufgebauter Graph. Die Knoten dieses Graphen sind die maximal freien Liniensegmente. Eine Kante im Graphen ist ein Sichtbarkeitswechsel, der adjazent zu den beiden entsprechenden Knoten ist. Abbildung 15 zeigt zur Verdeutlichung einen Ausschnitt des Visibility Skeletons für das bereits aus Abbildung 13 bekannte Beispiel mit dem MFL e 1 e 2 v. Teil (a) der Grafik zeigt den Knoten

290 282 David Schmelter Bezeichnung Generator-Elemente Erläuterung VV zwei Vertexe, die Ein Vertex wird durch jeweils zwei Kanten definiert nicht zum selben Polygon gehören VEE ein Vertex, zwei Kanten Vgl. Abbildung 13 EVE ein Vertex, zwei Kanten Analog zu VEE, allerdings schneidet das MFL die Generator Kanten in der Reihenfolge EVE Fvv zwei Vertexe eines Das MFL ist eine Diagonale des Polygons Polygons, die keine gemeinsame Kante besitzen FvE ein Vertex eines Polygons MFL liegt in der Ebene des Polygons und und eine Kante, schneidet ein Vertex des Polygons sowie eine die die Ebene des Polygons Kante schneidet FEE 1 Polygon und zwei MFL liegt in der Ebene des Polygons und Kanten, die die schneidet zwei Kanten Ebene des Polygons schneiden EFE 1 Polygon und zwei Analog zu FEE, allerdings schneidet das MFL Kanten, die die die Generator Kanten in der Reihenfolge EFE Ebene des Polygons schneiden FF zwei Polygone, wobei Das MFL ist die durch die Ebenen der beiden sich die Ebenen der Polygone gebildete Schnittgerade Polygone gegenseitig schneiden E4 vier Kanten Vgl. Abbildung 14 Tabelle 2. Übersicht der möglichen maximal freien Liniensegmente (nach [10]) e 1 e 2 v des Visibility Skeletons, der dem MFL e 1 e 2 v entspricht. Er ist adjazent zu den Kanten e 1 v und e 2 v, die den zu dem MFL adjazenten Sichtbarkeitswechseln e 1 v und e 2 v entsprechen. Der Übersichtlichkeit halber sind nicht alle adjazenten Sichtbarkeitswechsel dargestellt. Teil (b) zeigt den Knoten e 1 e 2 v mit den vollständigen adjazenten Sichtbarkeitswechseln: e 1 v entsteht durch die Sichtlinien, die auf das durch die Kante e 2 begrenzte Polygon treffen. e 3 e 1 e 2 und e 4 e 1 e 2 sind die durch die Generator Kanten e 1 und e 2 sowie e 3 bzw. e 4 induzierten Sichtbarkeitswechsel. Bisher wurde lediglich die Konstruktion von Sichtbarkeitswechseln beschrieben. Die eigentlich wichtigste Information, nämlich die Sichtbarkeit welcher Extremal-Elemente durch einen Sichtbarkeitswechsel beschrieben wird, wurde noch nicht betrachtet. Abbildung 16 verdeutlicht, was unter einem Extremal-Element verstanden wird. Dargestellt sind die beiden rot hervorgehobenen MFLs N start und N end. N start ist durch die Generator-Elemente v, e 1 und e 3 definiert, N end durch v, e 1 und e 2. Die beiden MFLs definieren somit den Sichtbarkeitswechsel ve 1. Die Extremal-Elemente eines Sichtbarkeitswechsel sind die Elemente einer Szene, die als nächstes vor der ersten bzw. als nächstes hinter der letzten Generator- Kante geschnitten werden. Im Beispiel sind dies für den Sichtbarkeitswechsel ve 1 also die Polygone F up und F down. Da Sichtbarkeitswechsel durch MFLs begrenzt werden, können

291 Approximationen und Alternativen für Aspektgraphen 283 v e 2 v e 1 e 2 v e 1 v e e 4 3 v e e v 1 'v 1 e 1 e 2 v e 2 v e 3 e 1 e 2 e4 e 1 e 2 e 1 e 1 'v e 1 e 2 e 1 e 2 v e e 1 v 2 v e 2 e 2 v e 1 e 2 v e 4 e 1 e 2 e 3 e 1 e 2 e1 v (a) (b) Abb. 15. (a) Das Beispiel aus Abbildung 13 mit entsprechendem Knoten des Visibility Skeletons (Sichtbarkeitswechsel unvollständig). (b) Das gleiche Beispiel mit vollständigen Sichtbarkeitswechseln. Nach [5] die Extremal-Elemente eines Sichtbarkeitswechsel direkt aus den Extremal-Elementen der begrenzenden MFLs abgelesen werden. Dadurch, dass MFLs Linien im dreidimensionalen Raum sind, ist die Berechnung ihrer Extremal-Elemente leicht mit Ray-Casting Verfahren möglich. F up v N end N start e 1 e 2 e 3 F down Abb. 16. Extremal-Elemente F up und F down der MFLs N start und N end. Quelle: [5] Aus diesen Überlegungen folgt die grundsätzliche Idee des Visibility Skeletons: Durch Berechnung aller MFLs inkl. ihrer Extremal-Elemente und Zuordnung der adjazenten Sichtbarkeitswechsel können alle Sichtbarkeitsbeziehungen in einer 3D-Szene mit Hilfe einer Graphstruktur beschrieben werden. 3.2 Definitionen Nachdem eine kurze Übersicht über den Aufbau des Visibility Skeletons und seiner Bausteine (maximal freie Liniensegmente und Sichtbarkeitswechsel) gegeben wurde, werden die folgenden Definitionen deutlich:

292 284 David Schmelter Definition 1 (Maximal freies Liniensegment). Gegeben seien vier Polygonkanten e 1 bis e 4. Ein maximal freies Liniensegment ist definiert als die Linie, die jede dieser Vier Kanten schneidet. Ein maximal freies Liniensegment ist somit eine Linie ohne Freiheitsgrade, also ein Element mit 0 Dimensionen (auch 0D Element). Definition 2 (Sichtbarkeitswechsel). Gegeben sei ein maximal freies Liniensegment l. Ein Sichtbarkeitswechsel ist definiert durch die Oberfläche, die durch die Menge aller Schnittlinien dreier Polygonkanten e i von l aufgespannt wird, sofern die Schnittbedingung exakt einer Kante von l aufgehoben ist. Ein Sichtbarkeitswechsel ist also durch eine Oberfläche mit einem Freiheitsgrad über eine Kante eines maximal freien Liniensegments definiert. Er besitzt somit einen Freiheitsgrad, entspricht also einem Element mit 1 Dimension (auch 1D Element). Definition 3 (Visibility Skeleton). Das Visibility Skeleton ist ein ungerichteter Graph. Die Knoten dieses Graphen entsprechen maximal freien Liniensegmenten, eine Kante zwischen zwei Knoten entspricht einem zu beiden Knoten adjazenten Sichtbarkeitswechsel. 3.3 Datenstruktur des Visibility Skeletons Nachdem Sichtbarkeitswechsel und maximal freie Liniensegmente im Kontext des Visibility Skeletons definiert wurden, werden Ausschnitte einer möglichen (vereinfachten) Datenstruktur zur Implementierung des Visibility Skeletons betrachtet. Listing 1 zeigt die Klasse N ode, die einen Knoten im Graphen des Visibility Skeletons darstellt und einem MFL entspricht. In einem Knoten werden die folgenden Informationen gespeichert: Eine Liste der zu diesem MFL adjazenten Sichtbarkeitswechsel (Paramter adjacentarcs) sowie die beiden Extremal-Elemente, die dieses MFL begrenzen (Parameter F up und F down ). Listing 2 zeigt die Klasse Arc, die eine Kante im Visibility Skeleton repräsentiert und einem Sichtbarkeitswechsel entspricht. In einer Kante werden die folgenden Informationen gespeichert: Der Start- und Endknoten, also die beiden MFLs, die diesen Sichtbarkeitswechsel begrenzen (Parameter N start und N end ) sowie wiederum die beiden Extremal-Elemente dieses Sichtbarkeitswechsels (Parameter F up und F down, vgl. auch Abbildung 16). Für jede Ausprägung von Sichtbarkeitswechseln (EV, EEE, Fv und Fe) existieren entsprechende Klassen, die die Klasse Arc erweitern. Listing 3 zeigt ein Beispiel für einen EV Sichtbarkeitswechsel. Zusätzlich zu den Start- und Endknoten sowie den Extremal-Elementen werden in der Klasse EV die Generator-Elemente des Sichtbarkeitswechsels gespeichert, im Beispiel also die Kante e und der Vertex v. Listing 4 zeigt die Klasse V isibilityskeleton, die das eigentliche Visibility Skeleton repräsentiert. Für jede Ausprägung von Sichtbarkeitswechseln (EV, EEE, Fv und Fe) existiert ein zweidiemensionales Array von binären Suchbäumen. Im Beispiel sind die beiden Arrays für EV und EEE Sichtbarkeitswechsel dargestellt. Das Array eines Sichtbarkeitswechsels wird über die beiden Extremal-Elemente indiziert. Somit existiert für jede Kombination von Extremal-Elementen genau ein binärer Suchbaum. Auf diese Art und Weise sind die Sichtbarkeitsinformationen einer 3D Szene für eine Kombination von Extremal-Elementen effizient abrufbar.

293 Approximationen und Alternativen für Aspektgraphen c l a s s Node { 2 List <Arcs> adjacentarcs 3 Face Fup, Fdown 4 } Listing 1. Klasse Node 1 c l a s s Arc { 2 Node Nstart, Nend 3 Face Fup, Fdown 4 } Listing 2. Klasse Arc 1 c l a s s EV : c h i l d o f Arc { 2 Edge e 3 Vertex v 4 } Listing 3. Klasse EV 1 c l a s s V i s i b i l i t y S k e l e t o n { 2 tree <EV>ev [ Fup ] [ Fdown ] 3 tree <EEE>eee [ Fup ] [ Fdown ] } Listing 4. Klasse VisibilitySkeleton 3.4 Konstruktion des Visibility Skeletons Nachdem das Visibility Skeleton und seine Elemente definiert und eine Datenstruktur vorgestellt wurde, wird seine Konstruktion betrachtet. Algorithmus 29 verdeutlicht die prinzipielle Konstruktion. Der Algorithmus ist anhand von Definition 1 aufgebaut und betrachtet der Übersichtlichkeit halber keine Sonderfälle wie VV, VEE o.a. MFLs. Die Konstruktion ist prinzipiell einfach: In einer äußeren Schleife werden zunächst alle Knoten des Visibility Skeletons erzeugt. Für jede Kombination G von vier Kanten der Szene wird überprüft, ob diese Kanten ein gültiges MFL bilden (Zeilen 1 und 2). Vier Kanten bilden ein gültiges MFL, wenn eine Linie l exisitiert, die diese Kanten schneidet und l zwischen der ersten und letzten Kante keine weiteren Elemente der Szene schneidet. Diese Überprüfung kann durch einfache Ray-Casting Abfragen erfolgen. Wurde ein gültiges MFL gefunden, werden die entsprechenden Extremal-Elemente berechnet und ein neuer Knoten in das Visibility Skeleton eingefügt (Zeilen 3 und 4). Die Erzeugung aller adjazenten Sichtbarkeitswechsel eines MFLs L erfolgt direkt nach dessen Erzeugung (Zeile 5): Für jede dreielementige Teilmenge A L, die einen zu L adjazenten Sichtbarkeitswechsel definiert, wird überprüft, ob im Visibility Skeleton bereits ein Sichtbarkeitswechsel A mit den gleichen Extremal-Elemente wie A vorhanden ist (Zeile 6). Ist dies der Fall, wird der bestehende Sichtbarkeitswechsel A mit A verschmolzen (Zeile 7). Ansonsten wird eine neue Kante in das Visibility Skeleton eingefügt (Zeile 9). Algorithmus 29 Konstruktion des Visibility Skeletons 1: for all Kombinationen von Generator-Kanten G = {g 0, g 1, g 2, g 3} do 2: if G bildet ein gültiges maximal freies Liniensegment L then 3: Berechne Extremal-Elemente von L 4: Füge L in Visibility Skeleton ein 5: for all Sichtbarkeitswechsel A = {g i0, g i1, g i2} adjazent zu L do 6: if Visibility Skeleton enthält Sichtbarkeitswechsel A mit denselben Generator-Kanten wie A then 7: Verschmelze A mit A 8: else 9: Füge A in das Visibility Skeleton ein

294 286 David Schmelter Abbildung 17 veranschaulicht die Konstruktion an einem Beispiel. In einem ersten Schritt seien die Kanten der Vertexe v und v e als mögliche Generator-Kanten eines MFLs ausgewählt worden. Diese Kanten bilden das gültige MFL vv e ; vv e wird somit in das Visibility Skeleton eingefügt. Ein möglicher adjazenter Sichtbarkeitswechsel ve ist durch den Vertex v und die Kante e definiert. Im Visibility Skeleton ist zu diesem Zeitpunk noch kein Sichtbarkeitswechsel mit den gleichen Generator-Kanten vorhanden. Aus diesem Grund wird ve einfach zum Visibility Skeleton hinzugefügt, das nun die Struktur wie in Abbildung 17 (a) besitzt. Die weiteren zu vv e adjazenten Sichtbarkeitswechsel werden der Übersichtlichkeit halber an dieser Stelle nicht weiter betrachtet. Als nächstes seien die Generator-Kanten des Vertex v, Polygons f und e ausgewählt worden. Diese Kanten bilden das gültige MFL f ve, das somit in das Visibility Skeleton eingefügt wird. Ein möglicher adjazenter Sichtbarkeitswechsel von f ve ist wiederum ve. Da im Visibility Skeleton bereits ein Sichtbarkeitswechsel enthalten ist, wird f ve über ve mit vv e verbunden. Das Visibility Skeleton hat nun die in Abbildung 17 (b) gezeigte Struktur. Nun seien die Generator-Kanten des Vertex v sowie e 3 und e ausgewählt worden. Diese Kanten bilden das gültige MFL ve 3 e, das in das Visibility Skeleton eingefügt wird. Erneut ist ve ein zu ve 3 e adjazenter Sichtbarkeitswechsel. Da im Visibility Skeleton sowohl der Startals auch der Endknoten von ve bereits gesetzt ist, wird ve gesplittet. Der Zielknoten von vv e ist zunächst undefiniert, ve verbindet die beiden MFLs ve 3 e und fve (vgl. Abbildung 17 (c)). Im letzten Schritt seien die Generator-Kanten des Vertex v sowie e 2 und e ausgewählt worden. Diese Kanten bilden das gültige MFL ve 2 e. Erneut ist ve adjazent zu ve 2 e. ve 2 e wird über ve mit vv e verbunden. Das Visibility Skeleton besitzt nun die in Abbildung 17 (d) dargestellte Struktur. Insgesamt können also die folgenden Operationen beim Einfügen von Sichtbarkeitswechseln in das Visibility Skeleton unterschieden werden (Zeilen 7 und 9 in Algorithmus 29): Add: Ein neuer Sichtbarkeitswechsel wird in das Visibility Skeleton eingefügt (vgl. Abbildung 17 (a)). Merge: Ein bestehender Sichtbarkeitswechsel wird mit einem neuen vereinigt (vgl. Abbildung 17 (b)). Split: Ein bestehender Sichtbarkeitswechsel wird gesplittet (vgl. Abbildung 17 (c)). Zum Schluss dieses Abschnitts wird die Laufzeit des vorgestellten Algorithmus und die Komplexität des Visibility Skeletons untersucht. Behauptung (Größe des Visibiliy Skeletons). Für eine Szene mit n Polygonen beträgt die theoretische Größe des Visibility Skeletons im Worst-Case O(n 4 ). Beweis. Der Beweis ist recht trivial: Jedes Quadrupel von Kanten kann theoretisch ein gültiges MFL bilden. Behauptung (Konstruktionszeit des Visibiliy Skeletons). Für eine Szene mit n Polygonen beträgt die theoretische Konstruktionszeit des Visibility Skeletons im Worst-Case O(n 5 ). Beweis. Auch dieser Beweis ist einfach: Es existieren O(n 4 ) Kombinationen von Kanten, die potentiell ein gültiges MFL bilden können. Für jede dieser Kombinationen muss überprüft werden, ob sie eine gültige MFL bildet. Hierzu muss die gesamt Szene mittels Ray-Casting

295 Approximationen und Alternativen für Aspektgraphen 287 v v f e e v e v e?? vv e ve????? vv e ve fve? (a)??? (b) e 3 v f e e 2 e 3 v f e v e v e?????? ve? ve vv e ve 3 e fve???????? ve ve vv e ve 2 e ve 3 e fve????? (c)??????? (d) Abb. 17. Erzeugung der Kanten des Visibility Skeletons. Quelle: [5] Verfahren auf Verdeckungen überprüft werden. Somit ergibt sich eine Komplexität von O(n 5 ). Laut Durand, Drettakis und Puech werden diese Worst-Cases allerdings nur in bestimmten Szenen erreicht. Für die in [5] untersuchten Testszenen ergab sich eine durchschnittliche Konstruktionszeit von O(n 2.4 ). 3.5 Anwendungen Nachdem die Konstruktion des Visibiltiy Skeletons vorgestellt wurde, werden einige Anwendungen betrachtet, für die das Visibility Skeleton eine effiziente Datenstruktur zur Verfügung stellt. In [5] werden im Wesentlichen drei Anwendungen vorgestellt: Bei globalen Beleuchtungsverfahren wie Radiosity wird zur Berechnung der Form- Faktoren häufig die Information benötigt, welche Teile einer Fläche von einem bestimm-

296 288 David Schmelter ten Punkt einer 3D Szene aus gesehen sichtbar sind. Diese Information kann mittels dem Visibility Skeleton effizient abgefragt werden. Eine weitere Anwendung des Visibility Skeletons ist die Berechnung von sogenannten Discontinuity Meshes, die zur Berechnung von Schatten und Halbschatten eingesetzt werden können. Zur Berechnung von Discontinuity Meshes ist allerdings eine kleine Erweiterung am Visibility Skeletons nötig. Hierbei handelt es sich um das Array DM(i, j), in dem alle Sichtbarkeitswechsel zwischen zwei Polygonen f i und f j abgelegt werden. Die Verwaltung dieses Arrays ist in konstanter Zeit möglich. Als dritte und letzte Anwendung wird die Berechnung von exakten Blockern vorgestellt. Eine Liste von exakten Blockern enthält die exakte Menge von Objekten, die eine Fläche von einer bestimmten Betrachterposition aus gesehen verdecken. Auch zur Berechnung von exakten Blockern wird das Array DM(i, j) verwendet. In dieser Arbeit geht es in erster Linie darum, die vielfältigen Einsatzmöglichkeiten des Visibility Skeletons zu motivieren und weniger darum, diese Anwendungen sehr detailliert zu betrachten. Aus diesem Grund wird im Folgenden exemplarisch vorgestellt, wie mit Hilfe des Visibility Skeletons berechnet werden kann, welche Teile einer Fläche von einer bestimmten Betrachterposition sichtbar sind. Auf Details zur Berechnung von Discontinuity Meshes oder exakten Blockerlisten wird verzichtet und auf [5] verwiesen. Abbildung 18 zeigt hierfür ein Beispiel. (a) zeigt eine Stadtszene. Die blau umrandeten Flächen des grünen Untergrunds sind vom dem gelben Vertex des dargestellten Flugzeugs nicht sichtbar. (b) zeigt ein Zimmer. Die blau umrandeten Flächen des Fußbodens sind vom gelben Vertex der dargestellten Lampe ebenfalls nicht sichtbar. Diese Informationen können mit dem Visibility Skeleton wie folgt berechnet werden: Um die globale Sichtbarkeit eines Vertex v in Bezug zu einer Fläche f zu bestimmen, werden zunächst alle EV Sichtbarkeitswechsel berechnet, die zu f in Beziehung stehen. Diese Abfrage kann erfolgen, indem die entsprechenden Suchbäume des Visiblity Skeletons mit f als Extremal-Element abgefragt werden. Für jeden dieser Sichtbarkeitswechsel wird überprüft, ob er mit dem Vertex v in Beziehung steht. Die Menge der so erhaltenen EV Sichtbarkeitswechsel sind exakt diejenigen, die die Sichtbarkeitsgrenzen von f, ausgehend von v, definieren. Die Abfragezeiten für die dargestellten Szenen betrugen für Abbildung 18 (a) 1.2 ms (312 Polygone) und für Abbildung 18 (b) 1.5 ms (1488 Polygone). Somit eignet sich das Visibility Skeleton also durchaus für Echtzeitanwendungen in diesem Anwendungsbereich. 3.6 Zusammenfassung Das Visibility Skeleton ist eine interessante Alternative zu Aspektgraphen, mit dem eine Reihe von Anwendungen, die Informationen über globale Sichtbarkeiten benötigen, effizient realisiert werden können. Es besticht durch seine Einfachheit: Zur Konstruktion werden nur Standard-Verfahren aus der Computergrafik, beispielsweise Ray-Casting, benötigt. Das Visibility Skeleton wurde vollständig implementiert und konnte für die in [5] untersuchten Testszenen trotz seiner zunächst eher schlechten Worst-Case Komplexität erfolgreich eingesetzt werden. Im Gegensatz zu klassischen Aspektgraphen ist es also auch für relativ komplexe Szenen praktisch einsetzbar.

297 Approximationen und Alternativen für Aspektgraphen 289 (a) Abb. 18. (a) Teile des Untergrunds, die von dem gelben Vertex des Flugzeugs aus sichtbar sind (b) Teile des Fußbodens, die von dem gelben Vertex einer Lampe aus sichtbar sind. Quelle: [5] (b) 4 Zusammenfassung und Diskussion In dieser Arbeit wurden sowohl Approximationen (im Wesentlichen der Finite-Resolution Aspect Graph) als auch Alternativen für Aspektgraphen (im Wesentlichen das Visibility Skeleton) vorgestellt und untersucht. Für den Fall einer orthografischen Projektion existiert mit dem Finite-Resolution Aspect Graph eine Approximation für Aspektgraphen, die vollständig implementiert wurde. Obwohl die Größe eines Aspektgraphen mit endlicher Auflösung je nach Auflösung drastisch kleiner als im unendlichen Fall sein kann, muss die praktische Relevanz dieses Verfahrens bezweifelt werden: Einerseits funktioniert das vorgestellte Verfahren nur für den Fall einer orthografischen Projektion. Andererseits versagt es bereits für relativ einfache Szenen aufgrund des hohen Konstruktionsaufwands. Mit dem Visibility Skeleton existiert eine interessante (und vollständig implementierte) Alternative zu Aspektgraphen, mit der eine Reihe unterschiedlicher Anfragen an eine 3D Szene beantwortet werden können. Im Gegensatz zum Finite-Resolution Aspect Graph wurde gezeigt, dass es auch für nicht triviale Szenen mit mehreren tausend Polygonen erfolgreich eingesetzt werden kann. Eine Objekterkennung wie mit Aspektgraphen ist mit dem Visibility Skeleton allerdings nicht möglich. Literaturverzeichnis 1. Arie, Jezekiel Ben (1990) Probabilistic Models of Observed Features and Aspects with Application to Weighted Aspect Graphs. Pattern Recognition Letters, Volume 11, Issue 6 2. Durand, Frédo; Drettakis, George; Puech, Claude (1999) Fast and Accurate Hierarchical Radiosity Using Global Visibility. ACM Transactions on Graphics (TOG), Volume 18, Issue 2, S Durand, Frédo; Drettakis, George; Puech, Claude (1996) The 3D visibility complex: a new approach to the problems of accurate visibility. Proceedings of the eurographics workshop on Rendering techniques 96, S Durand, Frédo; Drettakis, George; Puech, Claude (2002) The 3D Visibility Complex. ACM Transactions on Graphics (TOG), Volume 21, Issue 2, S

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone Was bisher geschah Motivation, Beispiele geometrische Objekte im R 2 : Punkt, Gerade, Halbebene, Strecke, Polygon, ebene Zerlegung in Regionen (planare Graphen) maschinelle Repräsentation geometrischer

Mehr

Punktlokalisierung. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Punktlokalisierung. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 22.05.2012 Nachtrag: Dynamische Bereichsabfragen Letzte Woche: kd-trees und Range-Trees

Mehr

Uberblick 1. Kurzeste Wege 2. Sichtbarkeitsgraphen 3. Berechnung des Sichtbarkeitsgraphen 4. Kurzeste Wege fur polygonale Roboter 1

Uberblick 1. Kurzeste Wege 2. Sichtbarkeitsgraphen 3. Berechnung des Sichtbarkeitsgraphen 4. Kurzeste Wege fur polygonale Roboter 1 Vorlesung Geometrische Algorithmen Sichtbarkeitsgraphen und kurzeste Wege Sven Schuierer Uberblick 1. Kurzeste Wege 2. Sichtbarkeitsgraphen 3. Berechnung des Sichtbarkeitsgraphen 4. Kurzeste Wege fur polygonale

Mehr

Algorithmische Geometrie 7. Punktsuche (Teil 2)

Algorithmische Geometrie 7. Punktsuche (Teil 2) Algorithmische Geometrie 7. Punktsuche (Teil 2) JProf. Dr. Heike Leitte Computergraphik und Visualisierung Inhaltsverzeichnis 1. Einführung 2. Konvexe Hülle 3. Schnitte von Liniensegmenten 4. Schnitte

Mehr

Geometrische Algorithmen Punkt-in-Polygon-Suche. Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche

Geometrische Algorithmen Punkt-in-Polygon-Suche. Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche Folie 1 von 51 Geometrische Algorithmen Punkt-in-Polygon-Suche Folie 2 von 51 Punkt-in-Polygon-Suche Übersicht Praxisbeispiel/Problemstellung Zählen von Schnittpunkten Schnitt einer Halbgerade mit der

Mehr

Punkt-in-Polygon-Suche Übersicht

Punkt-in-Polygon-Suche Übersicht Folie 1 von 43 Punkt-in-Polygon-Suche Übersicht! Praxisbeispiel/Problemstellung! Zählen von Schnittpunkten " Schnitt einer Halbgerade mit der Masche " Aufwandsbetrachtung! Streifenkarte " Vorgehen und

Mehr

Vorlesung Algorithmische Geometrie Konvexe Hülle im R 3

Vorlesung Algorithmische Geometrie Konvexe Hülle im R 3 Vorlesung Algorithmische Geometrie Konvexe Hülle im R 3 LEHRSTUHL FÜR ALGORITHMIK I INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Andreas Gemsa 26.06.2012 Prüfung! Termine: 20. Juli 27.

Mehr

Geradenarrangements und Dualität von Punkten und Geraden

Geradenarrangements und Dualität von Punkten und Geraden Vorlesung Algorithmische Geometrie von Punkten und Geraden INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 12.06.2012 Dualitätsabbildung Bisher haben wir Dualität für planare

Mehr

Geometrische Algorithmen

Geometrische Algorithmen Geometrische Algorithmen Thomas Röfer Motivation Scan-line-Prinzip Konvexe Hülle Distanzprobleme Voronoi-Diagramm Rückblick Manipulation von Mengen Vorrangwarteschlange Heap HeapSort swap(a, 0, 4) 1 5

Mehr

Triangulierung von einfachen Polygonen

Triangulierung von einfachen Polygonen Triangulierung von einfachen Polygonen - Seminarvortrag von Tobias Kyrion - Inhalt: 1.1 Die Problemstellung Quellenangabe 1.1 Die Problemstellung Definition Polygon: endlich viele paarweise verschiedene

Mehr

KD-Bäume. ein Vortrag von Jan Schaefer

KD-Bäume. ein Vortrag von Jan Schaefer ein Vortrag von Jan Schaefer Überblick - Kurzer Rückblick: Quad Trees - KD-Baum bauen - Effizienz des Konstruktionsalgorithmus - Regionen - Bereichssuche - Effizienz des Suchalgorithmus - Anwendungsgebiete

Mehr

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete.

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete. Worst-case Zeit für Search: Θ(n). In der Praxis jedoch sehr gut. Unter gewissen

Mehr

Graphentheorie. Eulersche Graphen. Eulersche Graphen. Eulersche Graphen. Rainer Schrader. 14. November Gliederung.

Graphentheorie. Eulersche Graphen. Eulersche Graphen. Eulersche Graphen. Rainer Schrader. 14. November Gliederung. Graphentheorie Rainer Schrader Zentrum für Angewandte Informatik Köln 14. November 2007 1 / 22 2 / 22 Gliederung eulersche und semi-eulersche Graphen Charakterisierung eulerscher Graphen Berechnung eines

Mehr

Anwendungen des Fréchet-Abstandes Das Constrained Free Space Diagram zur Analyse von Körperbewegungen

Anwendungen des Fréchet-Abstandes Das Constrained Free Space Diagram zur Analyse von Körperbewegungen Anwendungen des Fréchet-Abstandes Das Constrained Free Space Diagram zur Analyse von Körperbewegungen David Knötel Freie Universität Berlin, Institut für Informatik Seminar über Algorithmen Leitfaden Wiederholung

Mehr

Algorithmen II Vorlesung am

Algorithmen II Vorlesung am Algorithmen II Vorlesung am 0..0 Minimale Schnitte in Graphen INSTITUT FÜR THEORETISCHE INFORMATIK PROF. DR. DOROTHEA WAGNER KIT Universität des Landes Baden-Württemberg und Algorithmen nationales Forschungszentrum

Mehr

Ausarbeitung zum Modulabschluss. Graphentheorie. spannende Bäume, bewertete Graphen, optimale Bäume, Verbindungsprobleme

Ausarbeitung zum Modulabschluss. Graphentheorie. spannende Bäume, bewertete Graphen, optimale Bäume, Verbindungsprobleme Universität Hamburg Fachbereich Mathematik Seminar: Proseminar Graphentheorie Dozentin: Haibo Ruan Sommersemester 2011 Ausarbeitung zum Modulabschluss Graphentheorie spannende Bäume, bewertete Graphen,

Mehr

4 Greedy-Algorithmen (gierige Algorithmen)

4 Greedy-Algorithmen (gierige Algorithmen) Greedy-Algorithmen (gierige Algorithmen) Greedy-Algorithmen werden oft für die exakte oder approximative Lösung von Optimierungsproblemen verwendet. Typischerweise konstruiert ein Greedy-Algorithmus eine

Mehr

7. Sortieren Lernziele. 7. Sortieren

7. Sortieren Lernziele. 7. Sortieren 7. Sortieren Lernziele 7. Sortieren Lernziele: Die wichtigsten Sortierverfahren kennen und einsetzen können, Aufwand und weitere Eigenschaften der Sortierverfahren kennen, das Problemlösungsparadigma Teile-und-herrsche

Mehr

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5 Robert Elsässer Paderborn, den 15. Mai 2008 u.v.a. Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5 AUFGABE 1 (6 Punkte): Nehmen wir an, Anfang bezeichne in einer normalen

Mehr

Übung zur Vorlesung Berechenbarkeit und Komplexität

Übung zur Vorlesung Berechenbarkeit und Komplexität RWTH Aachen Lehrgebiet Theoretische Informatik Reidl Ries Rossmanith Sanchez Tönnis WS 2012/13 Übungsblatt 7 26.11.2012 Übung zur Vorlesung Berechenbarkeit und Komplexität Aufgabe T15 Entwickeln Sie ein

Mehr

10.1 Geometrische Wegplanung im Konfigurationsraum

10.1 Geometrische Wegplanung im Konfigurationsraum 10 Pfadplanung 10.1 Geometrische Wegplanung im Konfigurationsraum Vorausetzungen Roboter bewegt sich in der Ebene, ohne sich zu drehen Hindernisse sind konvexe Polygone Beispiel Grundgedanke Problem wird

Mehr

14. Rot-Schwarz-Bäume

14. Rot-Schwarz-Bäume Bislang: Wörterbuchoperationen bei binären Suchbäume effizient durchführbar, falls Höhe des Baums klein. Rot-Schwarz-Bäume spezielle Suchbäume. Rot-Schwarz-Baum mit n Knoten hat Höhe höchstens 2 log(n+1).

Mehr

Polygontriangulierung

Polygontriangulierung Vorlesung Algorithmische Geometrie Polygone triangulieren INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 03.05.2012 Das Kunstgalerie-Problem Aufgabe: Installiere ein Kamerasystem

Mehr

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem Andreas Moser Dietmar Ebner Christian Schauer Markus Bauer 9. Dezember 2003 1 Einführung Der in der Vorlesung gezeigte Algorithmus für das Steiner

Mehr

Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre 1990.

Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre 1990. Ein polynomieller Algorithmus für das N-Damen Problem 1 Einführung Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre

Mehr

Übung zur Vorlesung Algorithmische Geometrie

Übung zur Vorlesung Algorithmische Geometrie Übung zur Vorlesung Algorithmische Geometrie Dipl.-Math. Bastian Rieck Arbeitsgruppe Computergraphik und Visualisierung Interdisziplinäres Zentrum für Wissenschaftliches Rechnen 8. Mai 2012 B. Rieck (CoVis)

Mehr

Dynamisches Huffman-Verfahren

Dynamisches Huffman-Verfahren Dynamisches Huffman-Verfahren - Adaptive Huffman Coding - von Michael Brückner 1. Einleitung 2. Der Huffman-Algorithmus 3. Übergang zu einem dynamischen Verfahren 4. Der FGK-Algorithmus 5. Überblick über

Mehr

Algorithmische Bioinformatik 1

Algorithmische Bioinformatik 1 Algorithmische Bioinformatik 1 Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 2009 Übersicht Paarweises

Mehr

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14 Eidgenössische Technische Hochschule Zürich Ecole polytechnique fédérale de Zurich Politecnico federale di Zurigo Federal Institute of Technology at Zurich Institut für Theoretische Informatik 2. April

Mehr

Übungsblatt 6. Vorlesung Theoretische Grundlagen der Informatik im WS 16/17

Übungsblatt 6. Vorlesung Theoretische Grundlagen der Informatik im WS 16/17 Institut für Theoretische Informatik Lehrstuhl Prof. Dr. D. Wagner Übungsblatt 6 Vorlesung Theoretische Grundlagen der Informatik im WS 16/17 Ausgabe 22. Dezember 2016 Abgabe 17. Januar 2017, 11:00 Uhr

Mehr

Proseminar Online Algorithmen, Prof. Dr. Rolf Klein

Proseminar Online Algorithmen, Prof. Dr. Rolf Klein Proseminar Online Algorithmen, Prof. Dr. Rolf Klein Vortrag von Michael Daumen am 13.12.2000 Thema : Minimum Spanning Tree und 2-Approximation der TSP-Tour Inhalt des Vortrags : 1. genaue Vorstellung des

Mehr

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14 Eidgenössische Technische Hochschule Zürich Ecole polytechnique fédérale de Zurich Politecnico federale di Zurigo Federal Institute of Technology at Zurich Institut für Theoretische Informatik 26. März

Mehr

Wiederholung zu Flüssen

Wiederholung zu Flüssen Universität Konstanz Methoden der Netzwerkanalyse Fachbereich Informatik & Informationswissenschaft SS 2008 Prof. Dr. Ulrik Brandes / Melanie Badent Wiederholung zu Flüssen Wir untersuchen Flüsse in Netzwerken:

Mehr

4.4.1 Statisches perfektes Hashing. des Bildbereichs {0, 1,..., n 1} der Hashfunktionen und S U, S = m n, eine Menge von Schlüsseln.

4.4.1 Statisches perfektes Hashing. des Bildbereichs {0, 1,..., n 1} der Hashfunktionen und S U, S = m n, eine Menge von Schlüsseln. 4.4 Perfektes Hashing Das Ziel des perfekten Hashings ist es, für eine Schlüsselmenge eine Hashfunktion zu finden, so dass keine Kollisionen auftreten. Die Größe der Hashtabelle soll dabei natürlich möglichst

Mehr

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung Gliederung 1. Motivation / Einordnung / Grundlagen 2. Analyse der Laufzeit von Algorithmen 3. Untere Schranken für algorithmische Probleme 4. Sortier- und Selektionsverfahren 5. Paradigmen des Algorithmenentwurfs

Mehr

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete Kapitel 4: Dynamische Datenstrukturen Algorithmen und Datenstrukturen WS 2012/13 Prof. Dr. Sándor Fekete 4.4 Binäre Suche Aufgabenstellung: Rate eine Zahl zwischen 100 und 114! Algorithmus 4.1 INPUT: OUTPUT:

Mehr

Aufgabensammlung zur algorithmischen Geometrie

Aufgabensammlung zur algorithmischen Geometrie 1 Aufgabensammlung zur algorithmischen Geometrie 2012WS Andreas Kriegl 1. Konvexe Hülle als Durchschnitt. Zeige, daß der Durchschnitt konvexer Mengen wieder konvex ist und somit die konvexe Hülle einer

Mehr

PROSEMINAR ONLINE ALGORITHMEN

PROSEMINAR ONLINE ALGORITHMEN PROSEMINAR ONLINE ALGORITHMEN im Wintersemester 2000/2001 Prof. Dr. Rolf Klein, Dr. Elmar Langetepe, Dipl. Inform. Thomas Kamphans (Betreuer) Vortrag vom 15.11.2000 von Jan Schmitt Thema : Finden eines

Mehr

Geometrische Algorithmen

Geometrische Algorithmen Geometrische Algorithmen Bin Hu Algorithmen und Datenstrukturen 2 Arbeitsbereich für Algorithmen und Datenstrukturen Institut für Computergraphik und Algorithmen Technische Universität Wien Einführung

Mehr

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität Datenstrukturen und Algorithmen Christian Sohler FG Algorithmen & Komplexität 1 Clustering: Partitioniere Objektmenge in Gruppen(Cluster), so dass sich Objekte in einer Gruppe ähnlich sind und Objekte

Mehr

Konvexe Hülle. Konvexe Hülle. Mathematik. Konvexe Hülle: Definition. Mathematik. Konvexe Hülle: Eigenschaften. AK der Algorithmik 5, SS 2005 Hu Bin

Konvexe Hülle. Konvexe Hülle. Mathematik. Konvexe Hülle: Definition. Mathematik. Konvexe Hülle: Eigenschaften. AK der Algorithmik 5, SS 2005 Hu Bin Konvexe Hülle Konvexe Hülle AK der Algorithmik 5, SS 2005 Hu Bin Anwendung: Computergraphik Boundary Kalkulationen Geometrische Optimierungsaufgaben Konvexe Hülle: Definition Mathematik Konvex: Linie zwischen

Mehr

Informatik II, SS 2014

Informatik II, SS 2014 Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 13 (18.6.2014) Binäre Suchbäume IV (Rot Schwarz Bäume) Algorithmen und Komplexität Rot Schwarz Bäume Ziel: Binäre Suchbäume, welche immer

Mehr

Klausur Algorithmen und Datenstrukturen II 29. Juli 2013

Klausur Algorithmen und Datenstrukturen II 29. Juli 2013 Technische Universität Braunschweig Sommersemester 2013 Institut für Betriebssysteme und Rechnerverbund Abteilung Algorithmik Prof. Dr. Sándor P. Fekete Stephan Friedrichs Klausur Algorithmen und Datenstrukturen

Mehr

Algorithmische Geometrie 1. Einführung

Algorithmische Geometrie 1. Einführung Algorithmische Geometrie 1. Einführung JProf. Dr. Heike Leitte Computergraphik und Visualisierung Algorithmische Geometrie Veranstaltung: 2 SWS Vorlesung: Mi, 9:15 10:45 1 SWS Übung: Do 14:00 16:00 Übungen:

Mehr

Triangulierung von einfachen Polygonen

Triangulierung von einfachen Polygonen Triangulierung von einfachen Polygonen Tobias Kyrion Inhaltsverzeichnis 1.1 Die Problemstellung....................... 1 2.1 Ein naiver Algorithmus...................... 2 3.1 Zerlegung in monotone Teilpolygone..............

Mehr

Übersicht über Informatik und Softwaresystemtechnik WS 99/00, Prof. Dr. Andreas Schwill

Übersicht über Informatik und Softwaresystemtechnik WS 99/00, Prof. Dr. Andreas Schwill Konvexe Hülle Hierbei handelt es sich um ein klassisches Problem aus der Algorithmischen Geometrie, dem Teilgebiet der Informatik, in dem man für geometrische Probleme effiziente Algorithmen bestimmt.

Mehr

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 Bäume: Grundlagen und natürliche Suchbäume) Prof. Dr. Susanne Albers Bäume (1) Bäume sind verallgemeinerte Listen (jedes Knoten-Element kann mehr

Mehr

Seminarvortag zum Thema Virtual Private Network Design im Rahmen des Seminars Network Design an der Universität Paderborn

Seminarvortag zum Thema Virtual Private Network Design im Rahmen des Seminars Network Design an der Universität Paderborn Seminarvortag zum Thema Virtual Private Network Design im Rahmen des Seminars Network Design an der Universität Paderborn Ein 5.55-Approximationsalgorithmus für das VPND-Problem Lars Schäfers Inhalt Einführung:

Mehr

Lineares Programmieren

Lineares Programmieren Vorlesung Algorithmische Geometrie LEHRSTUHL FÜR ALGORITHMIK I INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 03.05.2011 Nachtrag Art Gallery Problem Lässt sich der Triangulierungs-Algorithmus

Mehr

Bäume und Wälder. Seminar: Graphentheorie Sommersemester 2015 Dozent: Dr. Thomas Timmermann

Bäume und Wälder. Seminar: Graphentheorie Sommersemester 2015 Dozent: Dr. Thomas Timmermann Bäume und Wälder Seminar: Graphentheorie Sommersemester 2015 Dozent: Dr. Thomas Timmermann Ida Feldmann 2-Fach Bachelor Mathematik und Biologie 6. Fachsemester Inhaltsverzeichnis Einleitung 1 1. Bäume

Mehr

Randomisierte Algorithmen 2. Erste Beispiele

Randomisierte Algorithmen 2. Erste Beispiele Randomisierte Algorithmen Randomisierte Algorithmen 2. Erste Beispiele Thomas Worsch Fakultät für Informatik Karlsruher Institut für Technologie Wintersemester 2016/2017 1 / 35 Randomisierter Identitätstest

Mehr

2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung

2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung 2 Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung 2 Woche: Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung 24/ 44 Zwei Beispiele a 0

Mehr

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Fortgeschrittene Netzwerk- und Graph-Algorithmen Fortgeschrittene Netzwerk- und Graph-Algorithmen Prof. Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Wintersemester

Mehr

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie Gliederung 1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie 4/3, Folie 1 2010 Prof. Steffen Lange - HDa/FbI

Mehr

KAPITEL 4 FLÜSSE IN NETZWERKEN

KAPITEL 4 FLÜSSE IN NETZWERKEN KAPITEL 4 FLÜSSE IN NETZWERKEN F. VALLENTIN, A. GUNDERT 1. Das Max-Flow-Min-Cut Theorem Es sei D = (V, A) ein gerichteter Graph, s, t V zwei Knoten. Wir nennen s Quelle und t Senke. Definition 1.1. Eine

Mehr

Rolf Wanka Sommersemester Vorlesung

Rolf Wanka Sommersemester Vorlesung Peer-to to-peer-netzwerke Rolf Wanka Sommersemester 2007 12. Vorlesung 12.07.2007 rwanka@cs.fau.de basiert auf einer Vorlesung von Christian Schindelhauer an der Uni Freiburg Aufbau Viceroy Knoten in Viceroy

Mehr

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g: TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen SS 2009 Grundlagen: Algorithmen und Datenstrukturen Übungsblatt 2 Prof. Dr. Helmut Seidl, S. Pott,

Mehr

Isomorphie von Bäumen

Isomorphie von Bäumen Isomorphie von Bäumen Alexandra Weinberger 23. Dezember 2011 Inhaltsverzeichnis 1 Einige Grundlagen und Definitionen 2 1.1 Bäume................................. 3 1.2 Isomorphie..............................

Mehr

Quadtrees und Meshing

Quadtrees und Meshing Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 24.06.2014 Motivation: Meshing von Platinenlayouts Zur Simulation der Hitzeentwicklung

Mehr

Kombinatorische Optimierung

Kombinatorische Optimierung Juniorprof. Dr. Henning Meyerhenke 1 Henning Meyerhenke: KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Vorlesung 4 Programm des

Mehr

Datenstrukturen & Algorithmen

Datenstrukturen & Algorithmen Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Dynamische Programmierung Einführung Ablaufkoordination von Montagebändern Längste gemeinsame Teilsequenz Optimale

Mehr

Informatik II, SS 2014

Informatik II, SS 2014 Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 7 (21.5.2014) Binäre Suche, Hashtabellen I Algorithmen und Komplexität Abstrakte Datentypen : Dictionary Dictionary: (auch: Maps, assoziative

Mehr

7. Triangulation von einfachen Polygonen

7. Triangulation von einfachen Polygonen 1 7. Triangulation von einfachen Polygonen 2 Ziel Bessere Laufzeit als O(n log n) durch schnelleres Berechnen der Trapezzerlegung des Polygons. 3 Idee Finde Methode, den Anfangspunkt einer Strecke in der

Mehr

Literatur. Dominating Set (DS) Dominating Sets in Sensornetzen. Problem Minimum Dominating Set (MDS)

Literatur. Dominating Set (DS) Dominating Sets in Sensornetzen. Problem Minimum Dominating Set (MDS) Dominating Set 59 Literatur Dominating Set Grundlagen 60 Dominating Set (DS) M. V. Marathe, H. Breu, H.B. Hunt III, S. S. Ravi, and D. J. Rosenkrantz: Simple Heuristics for Unit Disk Graphs. Networks 25,

Mehr

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6 Robert Elsässer u.v.a. Paderborn, 29. Mai 2008 Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6 Aufgabe 1 (6 Punkte): Zunächst sollte klar sein, daß ein vollständiger Binärer

Mehr

Die Kopplung von Markovketten und die Irrfahrt auf dem Torus

Die Kopplung von Markovketten und die Irrfahrt auf dem Torus Die Kopplung von Markovketten und die Irrfahrt auf dem Torus Verena Monschang Vortrag 20.05.20 Dieser Seminarvortrag thematisiert in erster Linie die Kopplung von Markovketten. Zu deren besseren Verständnis

Mehr

Beschriftung in Dynamischen Karten

Beschriftung in Dynamischen Karten Vorlesung Algorithmische Kartografie Teil 2 LEHRSTUHL FÜR ALGORITHMIK I INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 11.06.2013 Die Ära der dynamischen Karten Die meisten

Mehr

Polyeder und Platonische Körper

Polyeder und Platonische Körper Polyeder und Platonische Körper Ausarbeitung zum 30.11.2016 Linus Leopold Boes Matrikelnummer: 2446248 Algorithmen für planare Graphen Institut für Informatik HHU Düsseldorf Inhaltsverzeichnis 1 Einleitung

Mehr

Einführung in die linearen Funktionen. Autor: Benedikt Menne

Einführung in die linearen Funktionen. Autor: Benedikt Menne Einführung in die linearen Funktionen Autor: Benedikt Menne Inhaltsverzeichnis Vorwort... 3 Allgemeine Definition... 3 3 Bestimmung der Steigung einer linearen Funktion... 4 3. Bestimmung der Steigung

Mehr

Übung zur Vorlesung Berechenbarkeit und Komplexität

Übung zur Vorlesung Berechenbarkeit und Komplexität RWTH Aachen Lehrgebiet Theoretische Informatik Reidl Ries Rossmanith Sanchez Tönnis WS 2012/13 Übungsblatt 9 10.12.2012 Übung zur Vorlesung Berechenbarkeit und Komplexität Aufgabe T20 Beweisen Sie die

Mehr

3. Übungsblatt zu Algorithmen I im SoSe 2017

3. Übungsblatt zu Algorithmen I im SoSe 2017 Karlsruher Institut für Technologie Prof. Dr. Jörn Müller-Quade Institut für Theoretische Informatik Björn Kaidel, Sebastian Schlag, Sascha Witt 3. Übungsblatt zu Algorithmen I im SoSe 2017 http://crypto.iti.kit.edu/index.php?id=799

Mehr

Featurebasierte 3D Modellierung

Featurebasierte 3D Modellierung 1 Featurebasierte 3D Modellierung Moderne 3D arbeiten häufig mit einer Feature Modellierung. Hierbei gibt es eine Reihe von vordefinierten Konstruktionen, die der Reihe nach angewandt werden. Diese Basis

Mehr

Das Steinerbaumproblem

Das Steinerbaumproblem Das Steinerbaumproblem Natalie Richert Fakultät für Elektrotechnik, Informatik und Mathematik, Universität Paderborn 4. Februar 008 / 3 Überblick Problembeschreibung Vorstellung von zwei Approimationsalgorithmen

Mehr

Fünf-Farben-Satz. Seminar aus reiner Mathematik, WS 13/14. Schweighofer Lukas, November Seite 1

Fünf-Farben-Satz. Seminar aus reiner Mathematik, WS 13/14. Schweighofer Lukas, November Seite 1 Der Fünf- Farben-Satz Seminar aus reiner Mathematik, WS 13/14 Schweighofer Lukas, November 2013 Seite 1 Inhaltsverzeichnis Vorwort...3 Graphentheoretische Grundlagen...4 Satz 2 (Eulerscher Polyedersatz)...7

Mehr

Kollisionserkennung

Kollisionserkennung 1 Kollisionserkennung von Jens Schedel, Christoph Forman und Philipp Baumgärtel 2 1. Einleitung Wozu wird Kollisionserkennung benötigt? 3 - für Computergraphik 4 - für Simulationen 5 - für Wegeplanung

Mehr

Algorithmen und Komplexität Teil 1: Grundlegende Algorithmen

Algorithmen und Komplexität Teil 1: Grundlegende Algorithmen Algorithmen und Komplexität Teil 1: Grundlegende Algorithmen WS 08/09 Friedhelm Meyer auf der Heide Vorlesung 8, 4.11.08 Friedhelm Meyer auf der Heide 1 Organisatorisches Am Dienstag, 11.11., fällt die

Mehr

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 - Balancierte Bäume, AVL-Bäume) Prof. Dr. Susanne Albers Balancierte Bäume Eine Klasse von binären Suchbäumen ist balanciert, wenn jede der drei

Mehr

Der Alpha-Beta-Algorithmus

Der Alpha-Beta-Algorithmus Der Alpha-Beta-Algorithmus Maria Hartmann 19. Mai 2017 1 Einführung Wir wollen für bestimmte Spiele algorithmisch die optimale Spielstrategie finden, also die Strategie, die für den betrachteten Spieler

Mehr

Algo&Komp. - Wichtige Begriffe Mattia Bergomi Woche 6 7

Algo&Komp. - Wichtige Begriffe Mattia Bergomi Woche 6 7 1 Kürzeste Pfade Woche 6 7 Hier arbeiten wir mit gewichteten Graphen, d.h. Graphen, deren Kanten mit einer Zahl gewichtet werden. Wir bezeichnen die Gewichtsfunktion mit l : E R. Wir wollen einen kürzesten

Mehr

Abschnitt 18: Effizientes Suchen in Mengen

Abschnitt 18: Effizientes Suchen in Mengen Abschnitt 18: Effizientes Suchen in Mengen 18. Effizientes Suchen in Mengen 18.1 Vollständig ausgeglichene binäre Suchbäume 18.2 AVL-Bäume 18.3 Operationen auf AVL-Bäumen 18.4 Zusammenfassung 18 Effizientes

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Lösungen zur 1. Klausur. Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie

Lösungen zur 1. Klausur. Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie Hochschuldozent Dr. Christian Schindelhauer Paderborn, den 21. 2. 2006 Lösungen zur 1. Klausur in Einführung in Berechenbarkeit, formale Sprachen und Komplexitätstheorie Name :................................

Mehr

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen 186.172 Algorithmen und Datenstrukturen 1 VL 4.0 Übungsblatt 4 für die Übung

Mehr

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)). 8. Untere Schranken für Sortieren Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)). Werden nun gemeinsame Eigenschaften dieser Algorithmen untersuchen. Fassen gemeinsame

Mehr

Das Voronoi Diagramm. 1. Definition. 2. Eigenschaften. 3. Größe und Speicherung. 4. Konstruktion. 5. Verwendung

Das Voronoi Diagramm. 1. Definition. 2. Eigenschaften. 3. Größe und Speicherung. 4. Konstruktion. 5. Verwendung Das Voronoi Diagramm 1. Definition 2. Eigenschaften 3. Größe und Speicherung 4. Konstruktion 5. Verwendung Das Voronoi- Diagramm Voronoi Regionen Euklidische Distanz: d(p,q) = (px-qx)^2+(py-qy)^2 Das Voronoi-Diagramm

Mehr

Bipartite Graphen. Beispiele

Bipartite Graphen. Beispiele Bipartite Graphen Ein Graph G = (V, E) heiÿt bipartit (oder paar), wenn die Knotenmenge in zwei disjunkte Teilmengen zerfällt (V = S T mit S T = ), sodass jede Kante einen Knoten aus S mit einem Knoten

Mehr

2.7.1 Inside-Test Konvexe Hülle Nachbarschaften Schnittprobleme

2.7.1 Inside-Test Konvexe Hülle Nachbarschaften Schnittprobleme 2.7 Geometrische Algorithmen 2.7.1 Inside-Test 2.7.2 Konvexe Hülle 2.7.3 Nachbarschaften 2.7.4 Schnittprobleme 1 2.7 Geometrische Algorithmen 2.7.1 Inside-Test 2.7.2 Konvexe Hülle 2.7.3 Nachbarschaften

Mehr

Grundlagen: Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen Grundlagen: Algorithmen und Datenstrukturen Prof. Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 00

Mehr

Teil III. Komplexitätstheorie

Teil III. Komplexitätstheorie Teil III Komplexitätstheorie 125 / 160 Übersicht Die Klassen P und NP Die Klasse P Die Klassen NP NP-Vollständigkeit NP-Vollständige Probleme Weitere NP-vollständige Probleme 127 / 160 Die Klasse P Ein

Mehr

Algorithmen und Datenstrukturen Bereichsbäume

Algorithmen und Datenstrukturen Bereichsbäume Algorithmen und Datenstrukturen Bereichsbäume Matthias Teschner Graphische Datenverarbeitung Institut für Informatik Universität Freiburg SS 12 Überblick Einführung k-d Baum BSP Baum R Baum Motivation

Mehr

3. Musterlösung. Problem 1: Boruvka MST

3. Musterlösung. Problem 1: Boruvka MST Universität Karlsruhe Algorithmentechnik Fakultät für Informatik WS 06/07 ITI Wagner. Musterlösung Problem : Boruvka MST pt (a) Beweis durch Widerspruch. Sei T MST von G, e die lokal minimale Kante eines

Mehr

Lokalisierung von inneren und äußeren Grenzen in Sensornetzwerken

Lokalisierung von inneren und äußeren Grenzen in Sensornetzwerken Lokalisierung von inneren und äußeren Grenzen in Sensornetzwerken Seminararbeit: Algorithmen für Sensornetzwerke Thomas Gramer 1 Thomas Gramer: KIT Universität des Landes Baden-Württemberg und nationales

Mehr

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung Theoretische Informatik Rainer Schrader Zentrum für Angewandte Informatik Köln 14. Juli 2009 1 / 40 2 / 40 Beispiele: Aus den bisher gemachten Überlegungen ergibt sich: aus der Chomsky-Hierarchie bleiben

Mehr

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können. 8. A & D - Heapsort Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können. Genauer werden wir immer wieder benötigte Operationen durch Datenstrukturen unterstützen.

Mehr

5. Clusteranalyse Vorbemerkungen. 5. Clusteranalyse. Grundlegende Algorithmen der Clusteranalyse kennen, ihre Eigenschaften

5. Clusteranalyse Vorbemerkungen. 5. Clusteranalyse. Grundlegende Algorithmen der Clusteranalyse kennen, ihre Eigenschaften 5. Clusteranalyse Vorbemerkungen 5. Clusteranalyse Lernziele: Grundlegende Algorithmen der Clusteranalyse kennen, ihre Eigenschaften benennen und anwenden können, einen Test auf das Vorhandensein einer

Mehr

Die Euler-Mascheroni-Konstante

Die Euler-Mascheroni-Konstante Die Euler-Mascheroni-Konstante Niloufar Rahi Ausarbeitung zum Vortrag in Überraschungen und Gegenbeispiele in der Analysis (Sommersemester 009, Leitung PD Dr. Gudrun Thäter) Zusammenfassung: Wenn von der

Mehr

Algorithmen & Komplexität

Algorithmen & Komplexität Algorithmen & Komplexität Angelika Steger Institut für Theoretische Informatik steger@inf.ethz.ch Kürzeste Pfade Problem Gegeben Netzwerk: Graph G = (V, E), Gewichtsfunktion w: E N Zwei Knoten: s, t Kantenzug/Weg

Mehr

22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet

22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet 22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet Autor Volker Claus, Universität Stuttgart Volker Diekert, Universität Stuttgart Holger Petersen, Universität Stuttgart

Mehr

Technische Universität München Zentrum Mathematik Propädeutikum Diskrete Mathematik. Weihnachtsblatt

Technische Universität München Zentrum Mathematik Propädeutikum Diskrete Mathematik. Weihnachtsblatt Technische Universität München Zentrum Mathematik Propädeutikum Diskrete Mathematik Prof. Dr. A. Taraz, Dipl-Math. A. Würfl, Dipl-Math. S. König Weihnachtsblatt Aufgabe W.1 Untersuchen Sie nachstehenden

Mehr

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v) Ein Baum T mit Knotengraden 2, dessen Knoten Schlüssel aus einer total geordneten Menge speichern, ist ein binärer Suchbaum (BST), wenn für jeden inneren Knoten v von T die Suchbaumeigenschaft gilt: Der

Mehr