Rheinische Friedrich-Wilhelms-Universität Bonn Institut für Informatik I Jan Paul Imhoff Das Finden von Wasserstellen 9. Mai 2008 Seminararbeit im Sommersemester 2008 Zusammenfassung Das Studium der Bewegung von Tieren und anderen Gruppen wird durch neue Verfahren wie dem GPS-Tracking zu einer interessanten Disziplin. Die hierbei aufgezeichneten Bewegungen können auf viele Arten von Mustern hin untersucht werden. Eines dieser Muster ist das Finden von Bereichen, in denen sich häufig Individuen aufhalten. Dies soll hier am Beispiel von Wasserbüffeln, die sich in an Wasserstellen in der Ebene treffen verdeutlicht werden. Es werden Algorithmen und Schranken für die Härte des Problems geliefert. Diese Seminararbeit basiert auf dem Artikel Findig Popular Pla” ces“ von Marc Benkert, Bojan Djordjevic, Joachim Gudmundsson und Thomas Wolle [2]. Inhaltsverzeichnis 1 Einleitung 2 2 Ein Algorithmus im diskreten Modell 2.1 Die Sweep-Status-Struktur . . . . . . . . . . . . 2.1.1 Einfügen in die Sweep-Status-Struktur . 2.1.2 Anfragen an die Sweep-Status-Struktur 2.2 Laufzeit des Sweep . . . . . . . . . . . . . . . . 2.3 Erweiterungen auf andere Ausgaben . . . . . . 2.4 Die Komplexität des Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 6 7 11 14 15 3 Das kontinuierliche Modell 3.1 Aufbau des Algorithmus . . . . . . 3.1.1 Die Sweep-Status-Struktur 3.1.2 Ereignisse . . . . . . . . . . 3.1.3 Ereignisverarbeitung . . . . 3.1.4 Erstellen der Ausgabe . . . 3.2 Komplexität der Problemstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 17 18 19 20 23 24 4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1 1 Einleitung Die Verfolgung von Tieren wie Wasserbüffeln, um deren Verhalten zu Studieren, erfolgte in der Vergangenheit zumeist mit Peilsendern und der direkten Beobachtung der Tiere. Neue Techniken halten aber auch hier Einzug, wie zum Beispiel die exakte Aufzeichnung der Tierpfade mittels GPS und einem Datenspeicher. So ausgestattete Tiere erzeugen dann ein genaues Bewegungsabbild des von dem Tier eingeschlagenen Weges. Ein interessanter Aspekt bei der Beobachtung ist nun, mehrere Individuen in verschiedenen Herden mit solchen Sendern auszustatten und im Nachhinein aus den Daten Schlüsse zu ziehen. So kann man versuchen, Wasserstellen in der Ebene dadurch zu identifizieren, ob und wie viele Tiere sich in einem bestimmten Bereich aufhalten. Da eine solche Analyse aber von Hand aufgrund der großen Datenmengen sehr aufwendig und ungenau ist, soll hier ein Verfahren vorgestellt werden, um diese Analyse zu automatisieren. Um also mithilfe von in der Algorithmischen Geometrie bekannten Verfahren an dieses Problem herangehen zu können, ist es zuerst nötig eine formale Beschreibung der Problemstellung zu liefern. Bezeichne also im weiteren P die Gruppe der Tiere Λ1 , . . . , Λn , die mit einem Ortungsgerät ausgestattet sind. Die Positionen der Tiere werden zu den Zeitpunkten t1 , . . . , tτ aufgezeichnet. Zur Vereinfachung wird nun angenommen, dass sich jedes Tier zwischen zwei Zeitpunkten geradlinig und mit konstanter Geschwindigkeit bewegt. Damit kann nun der Pfad eines Wasserbüffels als eine polygonale Kette angesehen werden. Die Kriterien für eine Wasserstelle werden dabei durch zwei Parameter r ∈ R und k ∈ N festgelegt. Dabei bestimmt r die Kantenlänge eines achsenparallelen Quadrates, welches die Wasserstelle umschließt und k die Anzahl an Tieren, die sich an innerhalb dieses Quadrates befinden müssen, um es als Wasserstelle zu auszuzueichnen. Da sich die Tiere in verschiedenen Herden befinden können, ist es offensichtlich nicht notwendig, dass sich die k Wasserbüffel zur selben Zeit in einem solchen Quadrat befinden. Zur weiteren Vereinfachung werden wir im folgenden den Parameter r = 1 setzen. 1 q 2 2 3 q 1 Abbildung 1: Ein Beispiel, in dem die Positionen von drei Tieren über sechs Zeitschritte aufgezeichnet wurde. Die grau hinterlegten Quadrate sind Wasserstellen für k = 3 im diskreten (q2 ) und im kontinuierlichen Modell(q1 ). 2 Um nun ein schnelles Verfahren zur Berechnung des Problems zu konstruieren, werden wir zunächst nur die aufgezeichneten Positionen der Tiere verwenden und nicht die von ihnen in der Zwischenzeit zurückgelegte Strecke. Dieses Modell soll im Weiteren das diskrete Modell genannt werden und wird in Kapitel 2 erleutert. Im Gegensatz dazu kann es natürlich auch nötig sein, die so ausgeblendeten zurückgelegten Strecken zu betrachten. Dies ist zum Beispiel dann der Fall, wenn aufgrund der Datenmenge die Position nur in relativ großen Abständen gespeichert wird. Dies ist der kontinuierliche Fall und wird in Kapitel 3 behandelt. Für die Anwendung sind nun verschiedene Ausgaben eines zu entwerfenden Algorithmus sinnvoll, die eine unterschiedliche Herangehensweise an das Problem begründen würden: 1. Die Ausgabe der am meisten besuchten Wasserstelle 2. Die Ausgabe der ungefähren Positionen aller Wasserstellen 3. Die Ausgabe von allen Wasserstellen und deren Lage in der Ebene. Denn möchte man z.B. die Wasserstelle ausfindig machen, die von den meisten Tieren besucht wird, ist es unnötig, sich alle Gebiete zu merken und auszugeben. Andererseits muss man, wenn man nur die Anzahl bestimmen will, die exakte Lage nicht wissen. Der in Kapitel 2 im diskreten Modell vorgestellte Algorithmus erzeugt eine Ausgabe vom Typ 1. Im Anschluss wird er so modifiziert, dass er auch eine Antwort von Typ 2 und 3 liefern kann. Für das kontinuierliche Modell wird in Kapitel 3 lediglich ein Algorithmus vom Typ 3 vorgestellt. 2 Ein Algorithmus im diskreten Modell Wir befinden uns nun also im diskreten Modell. Damit ignorieren wir zunächst die polygonalen Verbindungslinien der Zugwege der Tiere. Mit dieser Einschränkung lässt sich nun eine genaue Definition einer Wasserstelle im diskreten Model aufschreiben. Definition 1 Wasserstelle (diskrete Variante) Ein Bewegungsablauf Λ der Länge τ eines Wasserbüffels in der Ebene, ist eine Menge von τ Punkten aus R2 , die in einer vorgegebenen Reihenfolge verknüpft sind. Sie können daher angesehen werden als eine geordnete Menge von Punkten in der Ebene, Λ ∈ (R2 )τ . Gegeben seien n Bewegungsabläufe Λ1 , . . . , Λn von Wasserbüffeln in der Ebene und Zahlen k ∈ N und r ∈ R. Ein achsenparalleles Quadrat σ der Kantenlänge r ist eine Wasserstelle im diskreten Modell, wenn σ Eingabepunkte von mindestens k Büffeln enthält. 3 Im weiteren werden wir die einzelnen Tiere mit ihren Bewegungsabläufen Λi identifizieren. Unsere Eingangsdaten sind also n Mengen Λi von Punkten in der Ebene, wobei jeweils |Λi | = τ gilt. Gesucht wird ein achsenparalleles Quadrat mit Kantenlänge r = 1, in dem sich eine maximal mögliche Anzahl von Punkten unterschiedlicher Mengenzugehörigkeit befinden. Definition 2 Eine maximale Wasserstelle, oder Wasserstelle maximaler Größe, ist dasjenige achsenparallele Quadrat σ, welches innerhalb eines Bereiches B ∈ R2 die größtmöliche Anzahl an Punkten enthält und dabei ganz in B enthalten ist. Um dieses Quadrat zu finden, werden wir im Folgenden einen Sweep-Algorithmus mit der Laufzeit O (τ n log (τ n)) entwerfen, der sich in Form einer vertikalen Geraden l von links nach rechts über die Ebene bewegt. Es soll nun für jeden Punkt der Ebene dasjenige Quadrat gesucht werden, welches den Punkt selbst und eine maximale Anzahl von Punkten anderer Mengen enthält. Die Idee ist, l einen Streifen strl der Breite 1 folgen zu lassen und als Ereignisse das Auftreffen eines Punktes p auf l bzw. sein Verlassen von strl zu betrachten. Wenn nun der Streifen auf einen neuen Punkt p trifft, suchen wir innerhalb des Streifens nach der größten Wasserstelle, die p enthält. Die in Frage kommenden Quadrate liegen innerhalb des Streifens um p und sind bis zu 1 nach oben bzw. nach unten verschoben. Das umschließende Rechteck Rp ist also achsenparallel und hat eine Kantenlänge von 1 in horizontaler bzw. 2 in vertikaler Richtung. Es ist also für den Streifen eine geeignete Datenstruktur mitzuführen, die uns auf eine Eingabe von Rp die größte Wasserstelle innerhalb dieses Bereiches zurückgibt. Um die gegebene Problemstellung zu lösen, genügt es, die τ n Punkte der Reihe nach zu durchlaufen, für jeden Punkt eine Anfrage an die Datenstuktur zu stellen, wo in Rp die größte Wasserstelle liegt, und anschließend diejenige Ausgabe auszuwählen, die die meisten Punkte aus verschiedenen Mengen enthält. Diese Vorgehensweise liefert das gewünschte Ergebnis, da wir zur Zeit nur nach einer maximalen Wasserstelle suchen. Lemma 3 Das oben genannte Verfahren liefert das gewünschte Ergebniss. Beweis. Angenommen wir würden mit dem Verfahren ein Quadrat σ finden welches in dem Rechteck Rp zum Punkt p liegt. Nehmen wir weiterhin an, dass diese Wasserstelle sich durch Verschieben des Quadrates nach rechts vergrößern ließe, sei dieses Quadrat σ 0 . Dann gibt es einen Punkt q, der durch das Verschieben nun auf dem rechten Rand von σ 0 liegt, desweiteren ist σ 0 ⊂ Rq . Da wir diese Konfiguration bei Auftreffen der Sweep-Line auf q bereits geprüft haben wissen wir, dass in einem solchen σ 0 höchstens genauso viele Punkte unterschiedlicher Tiere sein können wie in σ. So kann mit Hilfe dieser 4 Vorgehensweise die maximale Wasserstelle in der Ebene gefunden werden. 2 Dies stellt uns vor die Herausforderung, O(τ n) Anfragen an die Datenstruktur zu stellen und diese schnell zu beantworten. Um unsere gewünschte Laufzeit zu erreichen, bleibt damit für die Verarbeitung eines Einzelereignisses lediglich O(log τ n) Zeit übrig. Diese muss also möglichst schnell von statten gehen. Eine einfache Lösung wäre, mit einem zweiten Sweep, innerhalb von Rp , die Positionenen der Wasserstelle durchzuprobieren und die maximale Wasserstelle zurückzugeben. Dies führt, wie zu erwarten, nicht zu dem gewünschten Ergebnis. Wenn nämlich alle τ n Punkte innerhalb von Rp liegen, würde ein solcher Sweep mindestens eine Zeit von O(τ n) benötigen. 2.1 Die Sweep-Status-Struktur Wir wollen nun eine schnelle Datenstruktur für den Streifen entwerfen. Dazu überlegen wir uns, auf welche Weise wir die Datenmenge geeignet reduzieren können. Zunächst vereinfachen wir die genaue Lage der Datenpunkte pΛ eines Tieres Λ und berechnen eine geeignete Menge von y-Intervalle IΛ . Diese Intervalle sind nun von der Gestalt, dass ein Quadrat σ, welches sich in strl und dessen Mittelpunkt sich in Höhe y ∈ I mit I ∈ IΛ befindet, einen Datenpunkt von Λ enthält (siehe Abbildung 2). Um nun die maximale Wasserstelle innerhalb von Rp zu ermitteln, müssen wir nur denjenigen Punkt suchen, in dem sich die meisten dieser y-Intervalle überschneiden. a) b) s t rl s t rl l l Rp I 1 p I2 Abbildung 2: a) Die Menge IΛ , bestehend aus den Teilstücken I1 und I2 . In b) markiert der Pfeil die Stelle an der sich die meisten Intervalle Überlagen. Das Quadrat σ mit Mittelpunkt in Höhe des Pfeils, enthält Punkte der drei verschiedenen Farben. Um einen schnellen Zugriff auf die IΛ zu erhalten, konstruieren wir für jedes Λ zwei balancierte Binärbäume. Um eine Laufzeit von O(log n) für die benötigten Operationen zu erreichen, können z.B. Rot-Schwarz-Bäume 5 verwendet werden, siehe [3]. Im ersten Baum BΛ speichern wir die nach y-Koordinaten sortierten Punkte, die sich zur Zeit in strl befinden. Der andere Baum TΛ enthält die Anfangs- und Endpunkte der IΛ , die ebenfalls nach ihrer y-Koordinate sortiert sind und jeweils einen Pointer auf ihren entsprechenden Endpunkt enthalten (siehe Abbildung 3). l y s t rl 1 I4 8 y 7 y I3 6 y 5 I2 1 y I1 1 y y 2 3 y 4 y 5 y 6 y 7 y 8 4 y 3 1 y y 2 I1 I2 I3 I4 y 1 Abbildung 3: Der Baum TΛ am Beispiel von I1 , . . . , I4 . In den Blättern des Baums ist der Start- bzw. Endwert des zugehörigen Intervalls gespeichert. 2.1.1 Einfügen in die Sweep-Status-Struktur Trifft nun l auf einen Punkt p = (x, y) von Λ, so wird dieser zunächst in die zugehörigen Datenstrukturen eingefügt. Um in den Baum BΛ aufgenommen zu werden, benötigt man O(log(τ )) Schritte, da der Baum maximal τ Blätter haben kann. Nun muss das von p erzeugte Intervall I = [y − 1/2, y + 1/2] auf geeignete Weise mit den Intervallen aus IΛ vereinigt werden. Dazu führen wir eine Bereichsanfrage im Baum TΛ aus, die uns die Intervalle zurückgibt, die sich mit I schneiden. Da sich allerdings höchstens zwei solcher Schnitte ergeben können (die einzelnen Intervalle haben eine Mindestlänge von 1 und sind disjunkt), kann auch diese Anfrage in Zeit O(log(τ )) durchgeführt werden. Schneidet sich nun kein Intervall mit I, so wird I in den Baum TΛ aufgenommen. Liefert die Bereichsanfrage einen Schnitt mit einem Intervall (I1 ) so wird I1 durch I ∪I1 ersetzt. Bei einem Schnitt mit zwei Intervallen I1 und I2 ersetzt I1 ∪ I ∪ I2 die beiden Intervalle. Soll nun der Punkt p = (x, y) aus dem Streifen entfernt werden, müssen auch hier die Bäume BΛ und TΛ aktualisiert werden. Um den Baum TΛ zu aktualisieren, benötigen wir das Intervall aus TΛ , welches den Punkt p 6 enthält. Dieses nennen wir im weiteren I 0 . Zudem benötigen wir die beiden zu p benachbarten Punkte p1 = (x1 , y1 ) und p2 = (x2 , y2 ), die wir aus BΛ erhalten. Es sind nun drei verschiedene Fälle zu unterscheiden, die unterschiedliche Veränderungen an TΛ nach sich ziehen: 1. Es gilt |y2 − y1 | ≤ 1. Hier wird sich nichts an TΛ ändern, da die Intervalle der benachbarten Punke I überdecken. 2. Wenn min{|y − y1 |, |y − y2 |} > 1, dann muss I 0 = I gelten, da die Nachbarn weiter als 1 entfernt sind. I 0 kann also komplett aus TΛ gelöscht werden. 3. Es gilt |y − y1 | > 1 und |y − y2 | ≤ 1. Dann handelt es sich bei I um ein Randstück von I 0 . Es muss dann I 0 aus TΛ entfernt und in modifizierter Form wieder eingefügt werden. Handelt es sich bei I um ein oberes Randstück (y > y2 ), so muss das Stück [y2 +1/2, y+1/2] von I 0 entfernt werden. Ist es ein unteres, entfernt man [y − 1/2, y2 − 1/2]. Analog dazu ist der Fall |y − y1 | ≤ 1 und |y − y2 | > 1 zu behandeln. 2.1.2 Anfragen an die Sweep-Status-Struktur Um nun auch die Bereichsanfragen nach der größten Wasserstelle in Rp beantworten zu können, konstruieren wir einen weiteren balancierten Binärbaum Tint . Dieser soll nun, anders als die TΛ , die Intervalle IΛ aller Tiere enthalten. Zur Vereinfachung nehmen wir dabei an, dass die IΛ der verschiedenen Tiere paarweise disjunkte Start- und Endpunkte haben. Die Blätter von Tint enthalten die Start- und Endpunkte aller Intervalle der IΛ , sortiert nach ihren y-Koordinaten. Definition 4 Ein Punkt p = (x, y) durchstößt ein Intervall [a, b], wenn y ∈ [a, b] gilt. Die Stoßzahl von p in Bezug auf eine Menge von Intervallen I ist die Anzahl der Intervalle, die von p durchstoßen werden. Innerhalb unseres Rechtecks Rp suchen wir nun diejenige y-Koordinate, die die höchste Stoßzahl hat. Diese entspricht auch der Anzahl an durchstoßenen Intervallen, bei denen nur unterschiedliche Tiere berücksichtigt werden, da die Intervalle aus IΛ disjunkt sind. Die maximale Stoßzahl und den zugehörigen Punkt soll nun Tint liefern. Offensichtlich ändert sich diese Zahl jeweils am Beginn und Ende eines jeden Intervalls. Die Möglichkeit, in jedem Blatt direkt die Anzahl der jeweiligen durchstoßenen Intervalle zu speichern, besteht jedoch leider nicht. Denn angenommen, ein Intervall I überlappt alle anderen Intervalle in strl und dieses muss nun, wegen Entfernen eines zugehörigen Punktes aus dem Streifen, gelöscht werden, dann wäre die Korrektur aller im Baum Tint vorhandenen Blätter nötig, was im schlimmsten Fall Ω(τ n) Schritte dauern würde und zu quadratischer Laufzeit führen würde. 7 Um die Anfragen zu beantworten, wird die Stoßzahl mit Hilfe von Tint ermittelt. Dazu speichern wir in jedem Knoten V aus Tint zwei Werte: sum(V ) und maxpre (V ). Diese sind wie folgt definiert: Definition 5 Sei V die Wurzel eines Teilbaums von Tint , bezeichne L1 (V ), . . . , Lm (V ) die Blätter des Teilbaums. Dann sind sum(V ) und maxpre (V ) wie folgt definiert: sum(V ) := m X sum(Li (V )), und maxpre (V ) := max 1≤i≤m i=1 i X sum(Lj (V )). j=1 Ist V ein Blatt von Tint , gilt: ½ +1, wenn V Startpunkt eines Intervalls ist sum(V ) = maxpre (V ) := −1, wenn V Endpunkt eines Intervalls ist Dazu werden diese rekursiv aus den Kindern berechnet. Den Blättern von Tint wird zunächst gemäß der Definition einer der Werte {−1, +1} zugewiesen. Bezeichne nun V den aktuell betrachteten Knoten und Vlef t bzw. Vright das linke bzw. rechte Kind von V . Dann können sum(V ) und maxpre (V ) wie folgt aus den Werten der Kinder berechnet werden: sum(V ) = sum(Vlef t ) + sum(Vright ) maxpre (V ) = max{maxpre (Vlef t ), sum(Vlef t ) + maxpre (Vright )} Verwenden wir nun den oben beschriebenen Baum, so müssen wir, sollte ein Intervall hinzugefügt bzw. aus Tint gelöscht werden, nur die Werte sum(V ) und maxpre (V ) der Knoten ändern, die auf dem Weg von der Wurzel zu den entsprechenden Blättern liegen. Um nun eine Anfrage nach der größten Wasserstelle um p zu beantworten, müssen wir uns zunächst überlegen, was dies in unserem Baum bedeutet. Lemma 6 Sei p ein Punkt eines Tieres Λ, für den die maximale Wasserstelle innerhalb von Rp gesucht wird. Seien dabei p und die zugehörigen Änderungen an den Bäumen bereits geschehen. Weiterhin seien L1 , L2 , . . . die Blätter des Baumes Tint von links nach rechts sortiert und es bezeichne Ll bzw. Lr das am weitesten links bzw. rechts liegende Blatt im Anfragerechteck Rp . Dann ist die Anzahl der Tiere einer maximalen Wasserstelle zum Punkt p in strl gegeben durch: maxl,r = max l≤m≤r 8 m X j=1 sum(Lj ) Beweis. Wir suchen also die größte Anzahl an überlappenden Intervallen IΛ in unserem Anfragerechteck Rp . Relevant sind dabei alle Intervalle, die • ihren Startpunkt vor Ll haben und in Rp hineinragen • ihren Startpunkt zwischen Ll und Lr haben. P Offensichtlich ist li=1 sum(Li ) gerade die Anzahl an Intervallen, die in Rp hineinragen. Die Anzahl, der sich im Knoten Lm mit l ≤ m ≤ r überlappenP den Intervalle, ist m sum(L i ). Da aus der Maximalität sich schneidender i=0 Intervalle folgt, dass es sich an dieser Stelle um ein Quadrat mit der maximalen Anzahl an Tieren handelt, folgt die Behauptung. 2 Die oben genannte Summe gilt es nun also zu berechnen. Zu diesem Zweck werden wir sie in drei Teile aufspalten, die getrennt voneinander berechnet werden. Zum einen ist dies die Zahl sumpref ix der Intervalle, die in das Anfragerechteck hineinragen, zum anderen wird die Maximumsbildung in zwei Schritten vollzogen. Bezeichne im Weiteren R die Wurzel von Tint und R0 den letzten gemeinsamen Vorfahren von Ll und Lr . Weiterhin sei Lmid das am weitesten rechts stehende Blatt des linken Teilbaums von R0 . Setze nun zunächst sumpref ix = 0. Wir durchlaufen dann den Suchpfad von R nach Ll und aktualisieren sumpref ix jedes mal, wenn wir von einem Knoten V in dessen rechten Teilbaum absteigen. In diesem Fall wird sumpref ix ← sumpref ix + sum(VP lef t ) gesetzt. Erreichen wir Ll , so steht in sumpref ix der gewünschte Wert 1≤j≤l Lj (V ). R R’ R’ R’ left L right L l mid Lr Abbildung 4: Bezeichnungen der Knoten in Tint . Seien nun maxl := maxr := max m X l≤m≤mid sum(Lj ), j=l r X max mid+1≤m≤r 9 j=mid+1 sum(Lj ), sumlef t := mid X sum(Lj ). j=l Da gilt, dass maxl,r = sumpref ix + max{maxl , sumlef t + maxr }, können wir mithilfe dieser Werte das gewünschte Ergebnis berechnen. Algorithmus 1 maxl wird nun auf dem Rückweg vom Blatt Ll zum lin0 0 0 1 k ken Kind Rlef t von R berechnet. Sei V , V , . . . , V , der dabei durchlaufene 0 Pfad, wobei V 0 = Ll und V k = Rlef t . Desweiteren wird eine Hilfsvariable sumseen benötigt, die initial auf sumseen = sum(Ll ) gesetzt wird, maxl hat zu Begin ebenfalls den Wert maxpre (Ll ) = sum(Ll ). Wir befinden uns nun im Schritt i des Laufs. Wenn der Knoten Vi den Knoten Vi−1 als sein rechtes Kind hat, so fahren wir mit i + 1 fort. Andernfalls gibt es neue Kandidaten für die Bildung des linken Maximums, die berücksichtigt werden müssen. In diesem Fall aktualisieren wir maxl und anschließend sumseen i maxl ← max{maxl , sumseen + maxpre (Vright )} i sumseen ← sumseen + sum(Vright ) Nach Erreichen von R0 wird nun noch sumlef t ← sumseen gesetzt. 0 Sei V j ein Knoten, der bei dem Durchlauf von Ll nach Rlef t besucht wird j−1 und V als linkes Kind hat (nur dann werden die Variablen geändert). Die Variable sumseen enthält vor der Verarbeitung des Knotens die Summe aller Blätter des linken Teilbaums von V j , die rechts von Ll liegen. Nach der Definition von maxpre wird mit dieser Zahl die maximale Anzahl der im rechten Teilbaum hinzukommenden Intervalle beschrieben. Enthält nun maxl vor der Verarbeitung den Wert der im linken Teilbaum maximal hinzukommenden Intervalle, so wird sich diese nur erhöhen, wenn die Summe der Blätter des linken Teilbaumes zusammengenommen mit der Zahl auf der rechten Seite hinzukommenden Intervallen größer wird. Nach Ablauf des Algorithmus enthält also auch maxl und sumlef t den gewünschten Wert. Es lässt sich nun maxr auf ähnliche Weise berechnen. 0 = V 0 , V 1 , . . . , Lr , die Algorithmus 2 Wir durchlaufen die Knoten Rright 0 dem Suchpfad von Rright zum Blatt Lr entsprechen. Die beiden Variablen maxr und sumseen werden auf null gesetzt. Nur in dem Fall, in dem V i rechtes Kind seines Vaters ist, suchen wir nach einem neuen Maximum in diesem Teilbaum: i−1 maxr ← max{maxr , sumseen + maxpre (Vlef t )} i−1 sumseen ← sumseen + sum(Vlef t ). Nach Erreichen von Lr wird abschließend maxr = max{maxr , sumseen + maxpre (Lr )} gesetzt. 10 Nachdem wir nun mithilfe der oben beschriebenen Algorithmen die größte Stoßzahl in unserem Anfragebereich gefunden haben, bleibt nur noch der Punkt p zu bestimmen, bei dem diese Zahl auch angenommen wird. Dazu steigt man von dem letzten gemeinsamen Vorfahr R0 bis zu p ab. Wir müssen jedoch zuvor den Baum Tint ein wenig erweiten. In den einzelnen Knoten des Baumes sei zusätzlich, zu den Informationen sum(V ) und maxpre (V ), auch ein Pointer maxdir gespeichert, der angibt, ob bei der Bildung von maxpre (V ) der linke Knoten (also maxpre (Vlef t )) oder der rechte Knoten (sum(Vlef t ) + maxpre (Vright )) den größeren Wert hatte. Haben beide den gleichen Wert, so soll maxdir auf das linke Kind zeigen. Desweiteren speichern wir uns in den o.g. Algorithmen in den einzelnen Schritten, durch welches Kind maxl bzw. maxr in den einzelnen Schritten gebildet wurde. Wieder gilt, sollten die Werte maxl und sumseen + i−1 i maxpre (Vright ) bzw. maxr und sumseen + maxpre (Vlef t ) gleich groß sein, speichert man einen Pointer auf das linke Kind. Sei Lp das zu p korrespondierende Blatt in Tint . Wir suchen nun diejenigen Knoten V 0 , V 1 , . . . , V k , die auf dem Weg von R0 nach Lp liegen, klar ist V 0 = R0 und V k = Lp . Zunächst schauen wir ob sumpref ix + maxl größer 0 als sum(Rlef t ) + maxr ist. In diesem Fall muss Lp im linken Teilbaum von 0 0 R liegen, damit ist V 1 = Rlef t , andernfalls liegt der Punkt im rechten Teil1 0 baum, dann ist V = Rright . Wir beschränken uns nun auf die Beschreibung einer Suche im linken Teilbaum, die des rechten Teilbaums läuft analog. Wir wissen nun also, dass sich das Blatt Lp im linken Teilbaum befindet. 0 Wir steigen nun den Pfad von Rlef t nach Ll ab. Verläuft dieser im Schritt i → i + 1 nach rechts, so folgen wir ihm weiterhin, da Lp ebenfalls rechts von Ll liegen muss. Führt uns der Pfad nach links, so greifen wir auf die gespeicherte Information zurück, auf welche Weise maxl in diesem Schritt zustande gekommen ist. War dies maxl aus dem vorherigen Zeitschritt, so folgen i−1 wir dem Pfad nach Ll weiterhin, war es jedoch sumseen + maxpre (Vlef t ) so steigen wir in den rechten Teilbaum ab. Sind wir einmal von dem Weg zu Ll abgekommen, ist klar, dass Lp sich dort befinden muss, wo die Summe der Blätter dieses Teilbaums maximal wird. Dies ist genau dort der Fall wo wir nun mithilfe der in maxdir gespeicherten Pointer hin absteigen können. Damit haben wir Lp und auch p gefunden. Durch die Wahl des linken Knoten, im Falle der Gleichheit bei der Maximumsbildung, haben wir zudem erreicht, dass wir den linken Punkt des am weitesten links stehenden Abschnittes gefunden haben, für den die maximale Stoßzahl erreicht wird. 2.2 Laufzeit des Sweep Die interessante Frage ist nun, wie das Laufzeitverhalten des Algorithmus aussieht. Betrachten wir dazu zuerst einmal die verschiedenen Schritte, die 11 bei der Ereignisverarbeitung zum Punkt pΛ = (x, y) auftreten: A Verarbeitung bei Auftreffen von l auf pΛ : 1. Füge pΛ nach seiner y-Koordinate in BΛ ein 2. Berechne die nächsten Nachbarn von pΛ in strl nach y-Koordinate 3. Suche nach dem Schnitt des neuen Intervalls I = [y −1/2, y +1/2] im Baum TΛ 4. Lösche evtl. ein altes Intervall aus TΛ und füge ein neues Intervall I 0 ein 5. Propagiere das neue Intervall weiter nach Tint 6. Aktualisiere die Werte maxpre und sum der betroffenen Knoten 7. Berechne die maximale Wasserstelle zu pΛ V Verarbeitung bei Verlassen des Streifens: 1. Bestimme die nächsten Nachbarn von pΛ in BΛ 2. Lösche pΛ aus BΛ 3. Bestimme die Änderungen an TΛ und aktualisiere den Baum daraufhin 4. Propagiere die Änderungen weiter nach Tint 5. Aktualisiere die Werte maxpre und sum der betroffenen Knoten Lemma 7 Laufzeiten des Einfügens in die Datenstrukturen 1. Die Aktionen A1 bis A4 können jeweils in Zeit O(log τ ) durchgeführt werden, was zu einer Gesamtlaufzeit von O(τ n log τ ) während des Sweeps führt. 2. Die Aktionen A5 und A6 benötigen jeweils die Zeit O(log τ n), wobei dies eine Gesamtlaufzeit von O(τ n log τ n) nach sich zieht. Alle benötigten Datenstrukturen belegen dabei höchstens einen Speicherplatz von O(τ n). Beweis. Beginnen wir zunächst bei den Aktionen A1 und A2. Da BΛ maximal τ Punkte enthalten kann und wir einen balancierten Baum verwenden, dauert das Einfügen bzw. das Suchen höchstens O(log τ ). Da auch TΛ aus einem balancierten Baum besteht, dauert die Suche nach den vom einzufügenden Intervall geschnittenen Intervallen O(log(τ ) + a), wobei a die Größe der Antwort ist. Nun haben unsere Intervalle die Eigenschaft, dass sie disjunkt sind und eine Mindestlänge von 1 haben. Da nun das Intervall, 12 zu dem wir die Bereichsanfrage stellen, immer die Länge 1 hat, kann es sich höchstens mit zwei Intervallen in IΛ schneiden. Also ist auch diese Anfrage (A3) zusammen mit dem Löschen (A4) von höchstens zwei Intervallen und dem Einfügen von I 0 in Zeit O(log τ ) möglich. Da nun die Aktionen A1 bis A4 für jeden Punkt pΛ durchgeführt werden müssen, führen uns die obigen Überlegungen auf eine Gesamtlaufzeit von O(τ n log τ ), wie behauptet. Da für jedes Λ mehrere Datenstrukturen der Größe O(τ ) aufrecht erhalten werden müssen, ist die Speicherplatzkomplexität O(τ n). Der balancierte Binärbaum Tint enthält für jedes Λ jeweils die Startund Endpunkte der Intervalle IΛ . Damit hat er eine Knotenzahl in O(τ n). Die Propagation der Intervalländerungen von TΛ nach Tint erfordert eine konstante Anzahl von Änderungen in Tint , bleibt damit also in der Laufzeitkomplexität von O(log τ n). Wir wollen nun die geänderten Werte sum(V ) und maxpre (V ) in die Knoten des Baums Tint schreiben. Da sich sum(V ) und maxpre (V ) immer nur aus den Kinder von V berechnen, müssen dafür nur solche Knoten angefasst werden, die auf dem Suchpfad zu dem eingefügten Blatt liegen. Daher benötigt man hierzu maximal O(log τ n) Schritte. Zusammengenommen ist also der Aufwand für die Aktionen 5 und 6 während des Sweep-Algorithmus O(τ n log τ n) und die Speicherkomplexität von Tint O(τ n). Damit ist nun auch der Speicheraufwand für alle Datenstrukturen O(τ n). 2 Lemma 8 Laufzeit der Anfragen (A7) Die Laufzeit aller Anfragen während des Sweep an Tint , ist O(τ n log τ n) Beweis. Die Aussage folgt direkt aus dem Ablauf der Algorithmen 1 und 2 bzw. der Berechnung von sumpref ix . Da für jede der einzelnen Berechnungen Tint nur einmal durchlaufen werden muss, folgt für sie die Laufzeit O(log τ n). 2 Lemma 9 Laufzeit der Verarbeitung eines Endereignisses (V1 - V5) Die Laufzeit für die Bearbeitung eines Endereignisses ist O(τ n log τ n). Beweis. Der Beweis läuft analog zu der Verarbeitung eines Startereignisses und dessen Einfügen in die Datenstrukturen. 2 Die obigen Überlegungen führen uns nun letztendlich auf die Laufzeit des gesamten Sweep-Algorithmus: Satz 1 Laufzeit des Sweep zum Berichten der größten Wasserstelle Gegeben seien n Pfade von Tieren Λ1 , . . . , Λn ∈ (R2 )τ . Dann ist es möglich, eine größte Wasserstelle in der Ebene mit der Worst-Case Laufzeit O(τ n log τ n) zu finden. Dazu benötigt man O(τ n) Speicherplatz. Beweis. Die Behauptung folgt aus den vorher bewiesenen Lemmata. 13 2 2.3 Erweiterungen auf andere Ausgaben Betrachtet man den beschriebenen Algorithmus, so fällt es leicht seine Ausgabe so anzupassen, dass er eine Approximation aller möglicher Wasserstellen in der Ebene liefert. Hierzu muss lediglich jedes Rp berichtet werden, so dass die maximale Anzahl kmax der Tiere in Rp größer oder gleich der geforderten Anzahl k zur Definition einer Wasserstelle ist. Damit folgt: Satz 2 Laufzeit des Sweep zur Approximation aller Wasserstellen Gegeben seien n Pfade von Tieren Λ1 , . . . , Λn ∈ (R2 )τ und eine Zahl k ≥ 2. Dann ist es möglich eine Menge von achsenparallelen Rechtecken Rp , mit Höhe 2 und Breite 1, zu konstruieren, die jeweils mindestens eine Wasserstelle mit k Tieren enthalten und alle Wasserstellen durch diese Rechtecke überdeckt werden. Dies ist möglich in Worst-Case Laufzeit O(τ n log τ n) mit einer Speicherkomplexität von O(τ n). Um nun auch die genaue Lage aller Wasserstellen der Größe k zu bestimmen, ist zunächst notwendig festzulegen, welcher Art die Ausgabe in diesem Fall sein soll. Seien alle Routen der Tiere zusammengenommen mit P bezeichnet. Wir berichten nun eine Menge von Polygonen H(P ), so dass für jeden Punkt y aus einem Polygon von H(P ) gilt, dass ein Quadrat mit Kantenlänge 1 und dem Mittelpunkt in y eine Wasserstelle ist und alle Wasserstellen in H(P ) enthalten sind. Wir wollen nun also den oben beschriebenen Algorithmus so abändern, dass er genau diese Menge H(P ) berichtet. Wir betrachten dazu ein Startereignis pΛ . Unser Algorithmus kann uns nun solche Regionen S ∈ Rp berichten, so dass ein achsenparalleles Quadrat σ ∈ S mehr oder genau k Tiere umfasst und damit eine Wasserstelle definiert. Wird nun σ ein wenig nach links verschoben, so ist es in den meisten Fällen noch immer eine Wasserstelle, da lediglich der Punkt pΛ nicht mehr in σ enthalten ist. Desweiteren liefert uns der Algorithmus zur Zeit lediglich die Wasserstelle in Rp , die die meisten Tiere enthält. So wird z.B. in unserem Anfragerechteck eine Wasserstelle der Größe k + 1 ausgegeben, eine evtl. direkt daneben liegende mit nur k Tieren jedoch nicht. Erweitern wir also zunächst die Ausgabe dahingehend, dass alle Wasserstellen innerhalb unseres Anfragerechtecks Rp berichtet werden. Wir wollen diese berichteten Intervalle I in der Menge Ip,start zusammenfassen. Der Baum Tint muss nun also von Ll bis Lr nach den Punkten durchsucht werden, deren Stoßzahl die geforderten k erreicht oder überschreitet. Dazu gehen wir zunächst genauso vor wie bei der Suche nach Lp . Von unserem Algorithmus wurde ja der linke Punkt des am weitesten links liegenden Intervalls im Anfragebereich ausgegeben, der die größte Stoßzahl hatte. Um nun alle Punkte zu finden, die eine Stoßzahl größer oder gleich k haben, speichern wir zunächst eine Kopie von Tint . Dann führen wir eine Anfrage nach der größten Stoßzahl durch und löschen anschließend das 14 gefundene Intervall aus der Kopie von Tint . Hatte das gefundene Intervall eine Stoßzahl größer oder gleich als k stellen wir erneut eine Anfrage an den Baum, ist die Stoßzahl echt kleiner, wissen wir, dass kein weiterer Bereich in unserer Anfrage existiert, der in Frage kommt. Diese Verfahrensweise dauert damit O(M log τ n), wobei M die Anzahl der Wasserstellen in unserem Anfragebereich ist. Haben wir nun Ip,start gefunden, geht es darum zu entscheiden, wo ein Polygon aus H(P ) beginnt. Betrachten wir uns nun also eine Wasserstelle, die wir bei Auftreffen auf einen Punkt pΛ gefunden haben. Sollte die Anzahl der Tiere innerhalb echt größer als k sein, so müssen wir diese schon beim Einfügen eines früheren Punktes bemerkt haben. Es gibt also einen Punkt q, in dem die Stoßzahl des betreffenden Intervalls gerade gleich k war. Merken wir uns nun also für diesen Punkt alle Intervalle I ∈ Iq,start , für die die Stoßzahl gerade gleich k ist, haben wir den linken Rand von mindestens einem Polygon gefunden. Wir setzen in diesem Fall ein start flag auf der Position xp − 1/2 × I. Um die rechte Seite des Polygons zu finden, fügen wir in die Ereignisverarbeitung beim Verlassen des Streifens eine weitere Aktion ein. Verlässt also der Punkt q den Streifen, machen wir vor dem Löschen der betreffenden Daten eine weitere Bereichsanfrage von Rq in strl . Diese liefert uns dann eine Menge Iq,end von Intervallen. Hat nun eines dieser Intervalle wiederum genau die Stoßzahl k, so wird es, wenn q den Streifen verlassen hat, keine maximale Wasserstelle mehr bilden. Für dieses Intervall setzen wir nun ein end flag. Um nun das gewünschte Endergebnis zu erhalten, müssen lediglich die start flags und end flags miteinander verbunden werden. Zusammengenommen führt uns das Ganze auf folgende Aussage: Satz 3 Laufzeit zum Berichten von H(P ) Gegeben sei eine Menge P von n sich in der Ebene bewegenden Tieren, die zu τ Zeitpunkten aufgezeichnet werden. Es ist möglich, eine Menge H(P ) von Polygonen in der Zeit O(τ n log τ n + M log τ n) zu berechnen, so dass für alle y aus einem Polygon von H(P ) gilt, dass y den Mittelpunkt einer Wasserstelle definiert und alle diese Mittelpunkte in H(P ) enthalten sind. Dabei ist M die Anzahl der Wasserstellen in der Ebene. 2.4 Die Komplexität des Problems Der entworfene Algorithmus, zum Finden einer maximalen Wasserstelle, hat eine Laufzeit von O(τ n log τ n). Wir werden nun zeigen, dass dies auch die untere Schranke dieses Problems ist. Hierfür führen wir nun das MIN-GAP Problem, welches eine Komplexität von Ω(N log N ) hat [1], auf eine Instanz der Suche nach der größten Wasserstelle zurück. Hierzu zunächst die Problemstellung: 15 Problem 1 MIN-GAP Gegeben: Ein Vektor v ∈ RN und eine Zahl δ ∈ R>0 . Frage: Gilt dann mini6=j |vi − vj | > δ? Satz 4 Gegeben sei eine Menge Y von n Vektoren y ∈ Rτ und eine Zahl δ ∈ R>0 . Die Frage, ob es in Y eine Wasserstelle der Seitenlänge δ mit mindestens zwei Tieren gibt, hat die Komplexität Ω(τ n log τ n). Beweis. Angenommen, es gäbe einen Algorithmus A(Y ), der das Problem in einer kleineren Laufzeit lösen könnte. Sei dabei TA (Y ) die Laufzeit dieses Algorithmus. Wir werden nun eine beliebige Instanz eines MIN-GAP Problems so umformen, dass wir sie mithilfe des Algorithmus A(Y ) lösen können. Sei also ein Vektor v ∈ RN und eine positive reelle Zahl δ gegeben. Wir teilen nun den Vektor v in Stücke der Länge n auf. Sollte der letzte Teilvektor nicht die Länge n haben, so wird dieser mit geeigneten Dummies aufgefüllt (so dass der Algorithmus sie als solche erkennen kann). Schreibt §N ¨ man die so erhaltenen τ = n Vektoren nebeneinander, kann man diese zu einer Matrix M zusammenfassen. Wir interpretieren nun die n Spalten von M als die Routen von Tieren, die im Eindimensionalen zu τ Zeitpunkten aufgezeichnet wurden. Seien M und δ in Y1 zusammengefasst. Wenden wir nun den Algorithmus A(Y1 ) auf diese Eingabe an, so liefert er uns in Zeit TA (Y1 ) eine Antwort. Lautet diese JA“, so wissen wir, dass mindestens zwei der in verschiedenen ” Spalten enthaltenen Zahlen einen Abstand kleiner δ haben. Damit können wir auf die MIN-GAP Frage mit NEIN“ antworten. Lautet die Antwort ” NEIN“, so wenden wir den Algorithmus erneut an, wobei diesmal die trans” ponierte Matrix M T zusammen mit δ die Eingabe Y2 bilden. Für die Antwort JA“ können wir wieder mit NEIN“ antworten. Falls allerdings auch in die” ” sem Schritt die Antwort NEIN“ lautet, gibt es keine zwei Zahlen, die einen ” Abstand kleiner als δ haben, denn angenommen es gibt zwei Zahlen v1 und v2 , die einen Abstand kleiner als δ haben und das o.g. Verfahren, findet diese nicht. Dann folgt, dass sie im ersten Teil des Verfahrens in der selben Spalte von M gestanden haben müssen, da sie ansonsten gefunden worden währen. Für den zweiten Teil folgt, dass v1 und v2 in der selben Spalte von M T gestanden haben müssen, also in der selben Zeile von M . Aus diesen zwei Aussagen folgt, dass v1 = v2 sein muss, da sie an der selben Position der Matrix M stehen. Wir haben nun also das MIN-GAP-Problem in der Zeit O(N )+TA (Y1 )+ TA (Y1 ) gelöst. Da nun aber MIN-GAP eine untere Laufzeitschranke von Ω(N log N ) aufweist und hier τ n = Θ(N ) gilt, hat auch der Algorithmus A eine untere Schranke von Ω(N log N ) = Ω(τ n log τ n) es gibt also keinen Algorithmus der dieses Problem in einer kleinere Laufzeit lösen kann. 2 16 3 Das kontinuierliche Modell Der im vorherigen Kapitel gesehene Algorithmus zum Auffinden von Wasserstellen berücksichtigte nur die von den einzelnen Tieren erfassten Positionen, ohne die zwischen zwei Zeitpunkten t1 und t2 zurückgelegte Strecke. Liegen diese Datenpunkte jedoch zu weit auseinander, um mit dieser Technik sinnvolle Ergebnisse zu erzeugen, so ist es nötig, auch die polygonalen Verbindungsstrecken zwischen diesen Datenpunkten zu betrachten. In diesem Kapitel wollen wir uns nun mit dem kontinuierlichen Fall beschäftigen. Anders als im diskreten Fall werden wir direkt einen Algorithmus zur Bestimmung von H(P ) vorstellen. Der vorgestellte Algorithmus wird eine Laufzeit von O(τ 2 n2 log τ n) haben, bei einem Speicherbedarf von O(τ 2 n2 ) und wiederum ein Sweep-Algorithmus mit einer Gerade l sein. Definition 10 Wasserstelle (kontinuierliche Variante) Gegeben seien n Bewegungsabläufe von Tieren Λ1 , . . . , Λn ∈ (R2 )τ in der Ebene und Zahlen k ∈ N und r ∈ R. Ein achsenparalleles Quadrat σ der Kantenlänge r ist eine Wasserstelle im kontinuierlichen Modell, wenn σ von mindestens k Polygonzügen der Λi geschnitten wird. 3.1 Aufbau des Algorithmus Sehen wir uns zunächst den Pfad eines Tieres Λ an. Seien p1 , p2 , . . . , pτ die Datenpunkte von Λ und σ ein Quadrat mit Kantenlänge 1. Wenn wir den Mittelpunkt von σ auf dem Pfad von Λ entlang bewegen, so überstreicht σ eine Umgebung P (Λ). Setzen wir nun den Mittelpunkt von σ in einen beliebigen Punkt aus P (Λ), so würde σ mindestens einen Punkt aus dem Polygonzug zu Λ enthalten (siehe Abbildung 5). P( ) Abbildung 5: Die Umgebung P (Λ) mit Einheitsquadraten σ. Definition 11 Tiefe eines Punktes Sei p ein Punkt aus der Ebene, und P eine Menge von Polygonen. Der Punkt p hat die Tiefe k, wenn er in genau k Polygonen aus P enthalten ist. 17 Diese Definition lässt uns nun auch genauer das gewünschte Endergebnis beschreiben. Die Menge H(P ) enthält genau die Punkte, deren Tiefe bezüglich der Menge {P (Λ1 ), . . . , P (Λτ )} mindestens k ist, sich also k Polygone überschneiden. Der im folgenden vorgestellte Algorithmus arbeitet nun nicht auf den kompletten Polygonen P (Λ), sondern spaltet diese in Teilpolygone zu den einzelnen Kanten des Pfades von Λ auf. Ist also e = (pi , pi+1 ) eine Kante im Pfad von Λ, dann bezeichnen wir mit P (e) die Umgebung von e, die von einem Quadrat σ überstrichen wird, wenn es e entlang fährt. Dies erfordert dann auch, bei der Bestimmung der tatsächlichen Tiefe eines Punktes, zwei sich überlappende Polygone P (e) des selben Tieres, als solche zu erkennen und dies entsprechend zu handhaben. Wir erzeugen nun eine Menge A(L) von Geraden, deren Schnittpunkte später die Ereignispunkte sein werden. Für jedes Polygon P (e) speichern wir die Geraden durch die begrenzenden Kanten in A(L). Ist also fi eine Kante des Polygons P (e), dann speichern wir diejenige Gerade li in A(L), die fi enthält (siehe auch Abbildung 6). Zusammen mit li wird zudem der Startund Endpunkt von fi auf der Geraden abgespeichert, sowie die Seite, auf der P (e) liegt. Wir bezeichnen im weiteren das Teilstück fi als sichtbares Teilstück und li \ fi als unsichtbare Linie. li P(e) e fj Abbildung 6: Das Polygon P (e) mit den von den Kanten erzeugten li . Der Sweep-Algorithmus wird nun wieder mit einer vertikalen Geraden l von links nach rechts über die Ebene streichen. In der Sweep-Status-Struktur werden wir dabei über die Polygone Buch führen, die sich z.Z. mit l schneiden. Um abschließend H(P ) zu konstruieren, merken wir uns während des Sweeps diejenigen Eckpunkte, die H(P ) bilden. Diese werden mit einem zweiten Sweep-Algorithmus, wie in Abschnitt 3.1.4 beschrieben, zu der Polygonmenge H(P ) zusammengesetzt. 3.1.1 Die Sweep-Status-Struktur Sehen wir uns also nun an, wie die Sweep-Status-Struktur (SSS) genau aussieht. Wir wollen in der SSS zu jedem Zeitpunkt des Algorithmus die von 18 der Geraden l geschnittenen Polygone P (e) speichern. Dies geschieht mithilfe eines Arrays S, in dem wir geeignete Klammerausdrücke speichern. Die Klammerausdrücke sollen nun so geformt sein, dass, läuft man l in einer Richtung ab, für jedes Betreten eines Polygons sich eine Klammer öffnet und für jedes Verlassen sich eine schließt. Dabei enthält jede Klammer folgende Informationen: Typ Klammer öffnend/ schließend Tier Das zur Klammer korrespondierende Tier Grad Die Tiefe der zusammegehörenden Klammer innerhalb des Klammerausdrucks. Tiefe bezieht sich hierbei lediglich auf Klammern des selben Tiers Tiefe Die Tiefe bzgl. der P (Λ) unmittelbar nach der Klammer, also hinter der Gerade des zugehörigen Polygons Beispiel 1 Gehören die Klammern ( und ) zu Tier 1 bzw. [ und ] zu Tier 2, dann hat der Ausdruck (, [, (, ], ), ) folgende Werte für Grad (Obere Zahl) und Tiefe (unten): (11 , [12 , (22 , ]11 , )22 , )10 (siehe auch Abbildung 7). l P( P( 2 ) 1 ) P( 1 ) Abbildung 7: Beispiel der Lage von drei Polygonen, mit dem korrespondierenden Klammerausdruck (, [, (, ], ), ). Wobei () zu Λ1 und [] zu Λ2 gehört. 3.1.2 Ereignisse Wie bereits erwähnt, betrachten wir die Schnittpunkte der Geraden li als unsere Ereignisse. Trifft die Sweep-Line auf mehrere Ereignisse mit der gleichen x-Koordinate, so betrachten wir diese von oben nach unten. Sollten sich ein Ereignispunkt aus dem Schnitt von mehr als zwei Geraden ergeben, so betrachten wir die Schnitte von jeweils zweien als Einzelereignis. Im weiteren werden also nur Schnittpunkte zweier Geraden betrachtet. 19 Wir wollen nun sehen, welche Art von Schnittpunkten unsere Menge von Geraden A(L) enthalten kann. Sei dabei x der Schnittpunkt der Geraden l1 und l2 , mit den zugehörigen Liniensegmenten f1 und f2 . Für jedes fi können nun folgende Fälle auftreten: (1) x fällt mit dem Startpunkt von fi zusammen (2) x fällt mit dem Endpunkt von fi zusammen (3) x liegt im Inneren von fi (4) x liegt außerhalb von fi (auf der zugehörigen Geraden) Aufgrund unserer Annahme, dass x nicht Schnittpunkt von mehr als zwei Geraden ist, können einige Kombinationen der oben genannten Fälle nicht auftreten. Denn da sich die li aus unseren Polygonen herleiten, bilden die Start- und Endpunkte eines fi immer einen Schnittpunkt mit den Enden eines anderen Segments fj . Somit kann es nicht vorkommen, dass für x bzgl. f1 Fall 1 oder 2 gilt und gleichzeitig Fall 3 oder 4 für f2 . 3.1.3 Ereignisverarbeitung Um die Ereignisverarbeitung nun zu beschreiben, benötigen wir noch eine Festsetzung für die Richtung der Geraden li und damit verbunden die Lage von P (si ), dem Polygon zur Ecke si eines Polygonzuges, in Bezug zu li (oberhalb/ unterhalb). Die li verlaufen also nun o.B.d.A. von links nach rechts, die Senkrechten von oben nach unten. Die Lage von P (si ) bezüglich der Senkrechten ist unterhalb, wenn P (si ) auf der linken Seite von li liegt und oberhalb auf der rechten. Für die Verarbeitung machen wir nun eine Fallunterscheidung bzgl. der Eigenschaften des Schnittpunktes x der Geraden l1 und l2 . Verlaufe nun l1 links des Schnittpunktes oberhalb von l2 . 1. x ist für beide Geraden vom Typ 1. Es gilt dann, dass P (s1 ) oberhalb von l1 und P (s2 ) unterhalb von l2 liegt. Da die beiden sichtbaren Segmente der Linien in x starten, folgt mit der Annahme, dass sich in einem Punkt nur zwei Geraden schneiden, dass zudem die li zum selben Tier Λ gehören, also P (s1 ) = P (s2 ). Des weiteren folgt, dass es sich bei x um eine linke obere Ecke von P (s) handeln muss. In diesem Fall fügen wir in S ein Klammerpaar für P (s) mit dem zugehörigen Tier Λ ein. Dies hat zur folge, dass die Werte für Grad und Tiefe, der bereits im Array befindlichen Klammern ggf. angepasst werden müssen und damit, dass dieses Ereignis im Worst-Case eine Laufzeit von O(τ n) hat. 2. x ist für beide Geraden vom Typ 2. Es gilt dann, dass P (s1 ) unterhalb von l1 und P (s2 ) oberhalb von l2 liegen muss. Wie im vorherigen Fall 20 gilt, das die li zum selben Tier gehören. Es handelt sich hier jedoch um die rechte untere Kante von P (s). Es wird daher das zugehörige Klammerpaar aus S gelöscht, was mit den entsprechenden Aktualisierungen auch zu einer Laufzeit von O(τ n) für ein Einzelereignis führt. 3. Der Schnittpunkt ist für eine der beiden Linien vom Typ 1 und für die andere vom Typ 2. Es muss, nach obigem Argument, Λ1 = Λ2 gelten. Es handelt sich bei x dann um eine linke untere oder eine rechte obere Ecke von P (s). Da die linke bzw. rechte Flanke jedes Polygons senkrecht steht, ist es lediglich notwendig bei den oberen Ecken ein Klammerpaar einzufügen bzw. bei den unteren zu entfernen. Hier wird demnach S nicht verändert. 4. Der Schnittpunkt ist für beide Linien vom Typ 3. In diesem Fall vertauscht sich die Reihenfolge der li bezüglich der Geraden l. Daher vertauschen wir die zugehörigen Klammern in S und aktualisieren ihre Werte. Da die beiden zugehörigen Klammern in S benachbart sein müssen, benötigen wir hierzu nur O(1) (s.u.). 5. Der Schnittpunkt ist bzgl. beider Linien vom Typ 4. In diesem Fall wird keine Änderung am Array S vorgenommen. 6. Der Schnittpunkt ist bzgl. einer der Linien vom Typ 3, bei der anderen Linie vom Typ 4. Hier ist keine Änderung an S nötig, da sich die zugehörigen Polygone dort nicht schneiden und damit nicht die Reihenfolge von Klammern in S verändert werden muss. l a) l 2 1 b) 1 l l 2 e) x l l 2 1 f) x l 2 x d) 1 l x x l l c) 2 1 l 2 x l 1 Abbildung 8: Schematische Darstellung der verschiedener Ereignis Typen während des Sweeps. a) Typ 1; b) und d) Typ 3; e) Typ 2; c) und f) Typ 4. Eine verbleibende Unklarheit bei dieser Auflistung ist, wie die nötigen Updates im Fall 4 vorgenommen werden müssen. Zum einen müssen wir 21 schnell zu den zugehörigen Klammern kommen, was sich durch Pointer von den li zu den zugehörigen Klammern erreichen lässt. Zum anderen müssen die Werte in den Klammern aktualisiert werden. Da diese Aktualisierung von den beteiligten Tieren abhängt, ergeben sich erneut zwei Fälle: die Tiere sind identisch (Λ1 = Λ2 ) oder sie unterscheiden sich (Λ1 6= Λ2 ). Führen wir uns zum besseren Verständnis noch einmal die Bildung der Klammerausdrücke vor Augen, die Art“ der Klammer sei hierbei für jedes ” Tier unterschiedlich. Die Zahl Grad gibt die Tiefe der Verschachtelung bzgl. des selben Typs Klammer an. Sie kann sich also nur ändern, wenn Klammern gleichen Typs vertauscht werden. Tiefe gibt die Anzahl der vorstehenden offenen Klammern verschiedenen Typs an, muss also evtl. bei beiden Arten der Vertauschung geändert werden. Sehen wir uns zunächst also die Fälle für Λ1 6= Λ2 an. Wir wollen nun ihre Position vertauschen und entsprechend die Werte Grad und Tiefe anpassen. Wie oben festgestellt, kann Grad übernommen werden, Tiefe verlangt jedoch eine spezielle Behandlung. Die Tiefe der zweiten Klammer ist unabhängig von den vorgenommenen Vertauschungen, da sie über die Anzahl der überlappenden unterschiedlichen Polygone direkt hinter der hinteren Klammer berichtet, und die Reihenfolge der Klammerungen offensichtlich keine Rolle spielt. Der Wert wird somit an die neue hintere Klammer übergeben. Die Tiefe der ersten Klammer muss allerdings angepasst werden. Ähnliche Überlegungen, lassen sich auch für den Fall Λ1 = Λ2 anstellen. Zusammen genommen ergibt sich dann ein Verfahren, welches eine solche Änderung in konstanter Zeit durchführen kann. Lemma 12 Aufrechterhalten der Sweep-Status-Struktur Während des gesamten Algorithmus benötigen wir für die Aufrechterhaltung der Sweep-Status-Struktur eine Laufzeit von O(τ 2 n2 ) und einen Speicherplatz von O(τ n). Beweis. Die Gesamtanzahl der Ereignisse liegt in O(τ 2 n2 ), da wir für jedes der τ Segmente eines Pfades Λ höchstens sechs Geraden l haben und sich je zwei Geraden höchstens einmal schneiden. Bis auf Ereignistyp 1 benötigt die Verarbeitung nur O(1). Typ 1 benötigt zwar O(τ n) Zeit, kann aber auch nun O(τ n) mal auftreten, da es höchstens 6 Schnittpunkte dieser Art pro Polygonabschnitt gibt. Damit folgt eine Gesamtlaufzeit für die Erhaltung der Sweep-Status-Struktur von O(τ 2 n2 ). Aufgrund der Tatsache, dass nur die Ereignisse vom Typ 1 und 2 in S Klammern hinzufügen (mit einem konstanten Speicherbedarf pro Klammerpaar), folgt für die SSS eine Speicherkomplexität von O(τ n). 2 22 3.1.4 Erstellen der Ausgabe Die letzte verbleibende Aufgabe ist die Bildung der Ausgabemenge H(P ). Der Einfachheit halber werden wir diese in einem separaten Schritt ausführen. Wir müssen allerdings den oben stehenden Algorithmus so modifizieren, dass er uns bereits die Ecken von H(P ) berichtet. Dies kann jedoch einfach geschehen, während man die Ereignisse verarbeitet. Wir werden auch für diesen Schritt wieder auf eine vertikale SweeplLine zurückgreifen, wobei die Ereignisse das Auftreffen auf einen der im ersten Teil berichteten Knoten ist. Danach ist zu entscheiden, um welche Art Knoten es sich in dem Fall handelt (siehe Abbildung 9). a) V b) c) d) V V e) V V Abbildung 9: Die Ereignisse die bei dem zweiten Sweepdurchlauf auftreten können. Die Knoten lassen sich jedoch auch schon während des ersten Sweep den Typen zuordnen und werden zudem in sortierter Form ausgegeben. Speichert man zusätzlich in den Knoten noch die inzidenten Kanten, an denen die geforderte Tiefe erreicht wird, benötigt man für die Ereignisausführung nur noch O(1). Daraus ergibt sich folglich für die Laufzeit unseres zweiten Sweep O(|H(P )|). Daraus folgt dann schließlich: Satz 5 Laufzeit des Sweep für die komplexe Problemstellung Gegeben seien je τ Punkte von n Tieren in der Ebene. Es ist möglich, im kontinuierlichen Modell eine Menge H(P ) von Polygonen zu berichten, so dass jeder Punkt aus einem Polygon aus H(P ) Mittelpunkt einer Wasserstelle ist. Die dafür benötigte Zeit liegt in O(τ 2 n2 log τ n) ,der benötigte Speicherplatz in O(τ 2 n2 ). Es ist möglich das in diesem Kapitel vorgestellte Verfahren zu verbessern. Hierzu sei auf den von Edelsbrunner und Guibas entworfenen toplogischen Sweep-Algorithmus [4] verwiesen. Mit Hilfe der dort vorgestellten Technik ist die folgende Verbesserung möglich: Satz 6 Gegeben seien τ Datenpunkte von n Tieren in der Ebene. Es ist möglich im kontinuierlichen Modell in Zeit O(τ 2 n2 ) eine Menge H(P ) von Polygonen zu berichten, so dass jeder Punkt aus einem Polygon aus H(P ) Mittelpunkt einer Wasserstelle ist. Dabei benötigen wir höchstens O(τ n + |H(P )|) Speicherplatz. 23 3.2 Komplexität der Problemstellung Wir wollen nun auch in diesem Kapitel eine untere Laufzeitschranke für das Finden einer Wasserstelle präsentieren. Die Problemstellung, die wir dabei auf eine spezielle Instanz des kontinuierlichen Problems zurückführen werden, ist das 3-sum2-Problem. Von diesem wurde bereits in [5] gezeigt, dass es mindestens so schwer ist wie das klassische 3-sum-Problem mit Eingabegröße N . Da für das klassische Problem bisher kein subquadratischer Algorithmus gefunden wurde ¡ und ¢ in schwachen Rechnermodellen bereits ei2 ne untere Schranke von Ω N existiert, soll uns dies als Indiz der Härte der Suche nach der Wasserstelle dienen. Wir wollen also zunächst das 3-sum2-Problem beschreiben: Problem 2 3-sum2 Gegeben: Mengen A ⊂ Z, B ⊂ Z und C ⊂ Z mit |A| + |B| + |C| = N . Frage: Gibt es a ∈ A, b ∈ B und c ∈ C für die gilt, dass a + b = c? Die spezielle Instanz der Suche nach einer Wasserstelle auf die wir dieses Problem zurückführen wollen ist dabei die folgende: Problem 3 Wasserstelle2 Gegeben: Die Bewegungsabläufe von n Tieren in der Ebene über τ Zeitpunkte. Frage: Gibt es ein achsenparalleles Quadrat σ mit Kantenlänge r = 0, das Datenpunkte von mindestens drei Tieren enthält? Schauen wir uns also nun an, wie die Reduktion vonstatten geht. Sei (A, B, C) eine Instanz eines 3-sum2-Problems, für das gilt |A|+|B|+ |C| = N . Sei τ ∈ 1, . . . , N fest gewählt. Seien die Mengen A, B und C aufsteigend sortiert, wobei die Elemente a1 , . . . , a|A| ,b1 , . . . , b|B| und c1 , . . . , c|C| sind. Wir ordnen nun jeder Zahl aus einer der Mengen eine Gerade zu, welche wir in LA , LB und LC zusammenfassen. Diese Mengen sind nun wie folgt aufgebaut: • LA := {{y = a}|a ∈ A} Enthält horizontale Geraden lah zu jedem Element aus A • LB := {{x = b}|b ∈ B} Enthält vertikale Geraden lbv zu jedem Element aus B • LC := {{y = c − x}|c ∈ C} Enthält diagonale Geraden lcd zu jedem Element aus C Nach dieser Konstruktion ist klar, dass es genau dann eine Lösung für die Frage, ob es a ∈ A, b ∈ B und c ∈ C gibt für die a + b = c gilt, gibt wenn sich drei Geraden lah , lbv und lcd in einem Punkt schneiden. Schaffen wir es nun noch aus den Geraden geeignete Pfade herzustellen, haben wir die Reduktion bereits geschafft. 24 Wir werden nun ein Verfahren angeben, dass die erhaltenen Geraden in subquadratischer Zeit in eine geeignete Eingabemenge des kontinuierlichen Algorithmus überführt. Zunächst werden wir die Geraden in Liniensegmente umformen. Dazu bestimmen wir uns die achsenparallele Bounding Box BB, die alle Schnittpunkte der Liniensegmente enthält. Um diese zu bestimmen ist es lediglich notwendig die Schnittpunkte zu berechnen, die von Geraden korrespondierend zu den kleinsten bzw. größten Elementen in den Mengen A, B und C erzeugt werden. Innerhalb des Rechtecks um diese Schnittpunkte müssen dann auch die restlichen Punkte liegen. Die über BB hinausragenden Geradenstücke werden nun abgeschnitten, wodurch wir unsere Liniensegmente shai , svbi und sdci erhalten. Diese Segmente müssen nun nur noch zu geeigneten Pfaden der Länge τ zusammengeklebt“ werden, so dass durch die beim Zusammenkleben neu ” entstandenen Kanten keine weiteren Schnittpunkte zustande kommen. Nach der Konstruktion können wir dies erreichen, indem wir außerhalb von BB die Segmente verbinden. Für die aus LA entstandenen Liniensegmente kann man nun wie folgt vorgehen, um die Pfade der Länge τ zu konstruieren (siehe auch Abbildung 10): 1. Verbinde die rechten Eckpunkte von shai und shai+1 durch eine vertikale Linie. 2. Verbinde die linken Eckpunkte von shai+1 und shai+2 durch eine vertikale Linie. 3. Fahre mit 1. und 2. fort, bis die Länge des Pfades τ bzw. τ − 1 erreicht hat, je nachdem ob τ gerade oder ungerade ist. In diesem Fall hänge ein horizontales nach außen zeigendes Dummy“- Segment an das letzte ” shai an. 4. Sollten wir das letzte Segment erreichen und haben noch keinen Pfad der Länge τ , so hänge solange nach außen zeigende Segmente an, bis τ erreicht ist. Die aus den anderen beiden Mengen entstehenden Segmente lassen sich auf ähnliche Weise herstellen. Damit haben wir also eine Menge T von n Wegen mit jeweils τ Wegpunkten, deren Schnittpunkte innerhalb von BB liegen und den Schnittpunkten der Geraden aus LA , LB und LA entsprechen. Zusammengefasst gilt also: Lemma 13 Gegeben die Mengen A, B und C, dann existieren a ∈ A, b ∈ B und c ∈ C mit a + b = c genau dann wenn T eine Wasserstelle der Kantenlänge r = 0 enthält. Damit folgt 3-sum2≤Wasserstelle2. Eine Unklarheit besteht jedoch noch, denn wir haben ja zu den N Segmenten der Geraden noch Verbindungsstücke und Dummy-Segmente ein25 a) b) d lc 2 d lc 3 v lb 1 v lb 2 d lc 1 h la 3 h la 2 h la 1 Abbildung 10: a) Die Geraden korrespondierend zu Mengen A, B und C zusammen mit der Bounding Box. b) Konstruktion eines Pfades aus den Segmenten der Menge A mit angehängten Dummie Segmenten. gefügt. Jedoch können diese zusätzlichen Elemente leicht abgeschätzt werden. Die Anzahl der eingefügten Verbindungsstücke kann höchstens N sein, die der Dummy-Segmente 3τ ≤ 3N . Damit liegt also auch die Größe von T in Θ(N ). Da sich nun die einzelnen Liniensegmente in Linearzeit miteinander verknüpfen lassen, bleibt das Sortieren der Mengen die dominierende Komponente der Umformung auf 3-sum2. Die Umformung kann also in Zeit O(N log N ) vonstatten gehen. Damit folgt nun auch: Satz 7 Sei T eine Menge von n Wegen mit τ Wegpunkten. Es kann keinen Algorithmus geben, der Wasserstelle2 in Zeit o(τ 2 n2 ) entscheiden kann, solange es keinen Algorithmus gibt, der das Problem 3-sum2 mit der Gesamtgröße N in Zeit o(N 2 ) löst. 4 Zusammenfassung Wollen wir nun ein Resümee über die vorgestellten Verfahren ziehen. Gesucht waren Wege zur Lokalisation von Wasserstellen in der Ebene. Die hier vorgestellten Verfahren sind, wie gesehen, in der Lage, dies zu leisten. Der für den diskreten Fall vorgestellte Algorithmus benötigt dabei eine Laufzeit von O(τ n log τ n), wobei n die Anzahl der von den Tieren beschriebenen Wege ist und τ die Anzahl der Wegpunkte, die jedes Tier zurücklegt. Dabei benötigt er einen Speicherplatz von O(τ n). Im Kontinuierlichen haben wir zuletzt gesehen, dass dies in Zeit O(τ 2 n2 log τ n) mit O(τ 2 n2 ) Speicher möglich ist. Im Rahmen dieser Ausarbeitung wurde dabei nicht näher auf 26 die Verwendung einer topologischen Sweep-Line, die eine Verbesserung der Laufzeit des Verfahrens im kontinuierlichen Modell auf O(τ 2 n2 ) und des Speicherbedarfs auf O(τ n + |H(P )|) ermöglicht, eingegangen. Zu den in den Algorithmen gezeigten Laufzeiten wurde auch analysiert, wie schwer die beiden Problemstellungen im Allgemeinen sind. Dabei stellte sich heraus, dass die diskrete Problemstellung eine untere Laufzeitschranke von Ω (τ n log τ n) besitzt, und sich der entworfene Algorithmus also asymptotisch optimal verhält. ¡ Im¢ Kontinuierlichen konnten wir die vermutete untere Schranke von Ω τ 2 n2 nicht mit den hier zur Verfügung stehenden Mitteln erreichen. Wir haben jedoch festgestellt, dass, sollte ein schnellerer Algorithmus zur Berechnung von Wasserstellen im Kontinuierlichen existieren, so würde dieser auch 3-Sum in subquadratischer Zeit lösen können. Literatur [1] M. Ben-Or. Lower bounds for algebraic computation trees. In STOC ’83: Proceedings of the fifteenth annual ACM symposium on Theory of computing, pages 80–86, New York, NY, USA, 1983. ACM. [2] M. Benkert, B. Djordjevic, J. Gudmundsson, and T. Wolle. Finding popular places. In T. Tokuyama, editor, ISAAC, volume 4835 of Lecture Notes in Computer Science, pages 776–787. Springer, 2007. [3] T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein. Introduction to Algorithms. The MIT Press, 2nd edition, 2001. [4] H. Edelsbrunner and L. J. Guibas. Topologically sweeping an arrangement. In STOC ’86: Proceedings of the eighteenth annual ACM symposium on Theory of computing, pages 389–403, New York, NY, USA, 1986. ACM. [5] A. Gajentaan and M. H. Overmars. n 2 -hard problems in computational geometry. Technical report, 1993. 27