Das Finden von Wasserstellen

Werbung
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
Herunterladen