23
Kapitel 5 Das Sweep-Verfahren * 5.1 Einf¨ uhrung In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen Geometrie: das Sweep-Verfahren, manchmal auch Scan-Verfahren genannt. Es han- delt sich hierbei um ein Paradigma, also eine algorithmische Technik, mit deren Hilfe man viele Probleme l¨ osen kann. ahrend sich das das Wesentliche an anderen algorithmischen Prinzipien wie zum Beispiel divide and conquer ziemlich knapp und pr¨ azise beschreiben l¨ aßt, ist das beim Sweep-Verfahren nicht ganz so einfach, weil zwischen den Anwendungen etwas gr¨ oßere Unterschiede bestehen. Man k¨ onnte sagen: sweep verwandelt eine r¨ aumliche Dimension in eine zeitliche, indem es aus einem statischen d-dimensionalen Problem ein dynamisches (d - 1)-dimensionales Problem macht. Wir werden noch sehen, daß diese Formulierung zutreffend ist; sie verr¨ at uns aber wenig ¨ uber die Arbeitsweise des Sweep-Verfahrens. Deshalb beginnen wir nicht mit einer abstrakten Definition, sondern untersuchen typische Beispiele von Sweep-Algorithmen. Dabei halten wir die Augen nach Ge- meinsamkeiten offen und werden im Laufe.dieses Kapitels eine Reihe von typischen Merkmalen dieses Verfahrens erkennen. 5.2 Sweep im Eindimensionalen 5.2.1 Das Maximum einer Menge von Objekten Wir beginnen mit der denkbar einfachsten Anwendung des Sweep-Verfahrens: Gege- ben sind n Objekte q 1 ,...,q n aus einer geordneten Menge Q, gesucht ist ihr Maximum, also dasjenige q Q mit q q i ur i =1,...,n, q = q j ur ein j mit 1 j n. * Rolf Klein. Das Sweep-Verfahren. In Thomas Ottmann, editor, Prinzipien des Algorithmen- entwurfs, pages 67–89. Spektrum Akademischer Verlag, 1998. 67

Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

  • Upload
    ngodieu

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

Kapitel 5

Das Sweep-Verfahren∗

5.1 Einfuhrung

In diesem Kapitel geht es um eine der vielseitigsten Techniken der AlgorithmischenGeometrie: das Sweep-Verfahren, manchmal auch Scan-Verfahren genannt. Es han-delt sich hierbei um ein Paradigma, also eine algorithmische Technik, mit deren Hilfeman viele Probleme losen kann.

Wahrend sich das das Wesentliche an anderen algorithmischen Prinzipien wiezum Beispiel divide and conquer ziemlich knapp und prazise beschreiben laßt, ist dasbeim Sweep-Verfahren nicht ganz so einfach, weil zwischen den Anwendungen etwasgroßere Unterschiede bestehen. Man konnte sagen: sweep verwandelt eine raumlicheDimension in eine zeitliche, indem es aus einem statischen d-dimensionalen Problemein dynamisches (d − 1)-dimensionales Problem macht. Wir werden noch sehen, daßdiese Formulierung zutreffend ist; sie verrat uns aber wenig uber die Arbeitsweise desSweep-Verfahrens.

Deshalb beginnen wir nicht mit einer abstrakten Definition, sondern untersuchentypische Beispiele von Sweep-Algorithmen. Dabei halten wir die Augen nach Ge-meinsamkeiten offen und werden im Laufe.dieses Kapitels eine Reihe von typischenMerkmalen dieses Verfahrens erkennen.

5.2 Sweep im Eindimensionalen

5.2.1 Das Maximum einer Menge von Objekten

Wir beginnen mit der denkbar einfachsten Anwendung des Sweep-Verfahrens: Gege-ben sind n Objekte q1, . . . , qn aus einer geordneten Menge Q, gesucht ist ihr Maximum,also dasjenige q ∈ Q mit

q ≥ qi fur i = 1, . . . , n,

q = qj fur ein j mit 1 ≤ j ≤ n.

∗ Rolf Klein. Das Sweep-Verfahren. In Thomas Ottmann, editor, Prinzipien des Algorithmen-entwurfs, pages 67–89. Spektrum Akademischer Verlag, 1998.

67

Page 2: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

68 KAPITEL 5. DAS SWEEP-VERFAHREN2

Um das Maximum zu bestimmen, genugt es, jedes Objekt einmal”in die Hand zu

nehmen“ und zu testen, ob es großer ist als das großte der bisher betrachteten Objekte.Hierdurch ergibt sich ein optimaler Algorithmus mit linearer Laufzeit:

MaxSoFar := q[1];for j := 2 to n do

if MaxSoFar < q[j]then MaxSoFar := q[j];

write("Das Maximum ist ", MaxSoFar)

Diese Vorgehensweise ist typisch fur die Sweep-Technik. Man will eine bestimmteEigenschaft einer Menge von Objekten ermitteln. Dazu besucht man die Objekte derReihe nach und fuhrt uber die schon besuchten Objekte eine geeignete Informationmit (hier die Variable MaxSoFar), aus der sich am Schluß die gesuchte Eigenschaftergibt.

Bei diesem Beispiel ist das Problem raumlich eindimensional; wir haben ja ledig-lich mit einer Folge von Objekten zu tun. Der Sweep-Algorithmus macht daraus einezeitliche Folge von raumlich nulldimensionalen Problemen: der Bestimmung des Ma-ximums zweier Zahlen. Im Algorithmus wird die Zeitdimension durch die for-Schleifedargestellt.

Bei der Bestimmung des Maximums kommt es uberhaupt nicht auf die Reihenfolgean, in der die Objekte besucht werden. Im allgemeinen ist aber die Besuchsreihenfolgefur das Gelingen des sweep wesentlich.

5.2.2 Das dichteste Paar einer Menge von Zahlen

Betrachten wir zum Beispiel das Problem closest pair im IR1. Gegeben sind n reelleZahlen x1, . . . , xn. Gesucht ist ein Paar (xi, xj) mit minimalem Abstand

|xi − xj | = min1≤k<l≤n

|xk − xl|.

Offenbar mussen wir nur solche Paare betrachten, die der Große nach benachbartsind. Wir sortieren die xi deshalb zunachst nach wachsender Große; die sortierteFolge

x′1 ≤ x′

2 ≤ . . . ≤ x′n

mit x′j = xπ(j)

ist die richtige Besuchsreihenfolge fur einen sweep.Wahrend wir die x′

j in dieser Reihenfolge durchlaufen, merken wir uns in derVariablen ClosPos den kleinsten Index i, fur den x′

i−1 und x′i ein dichtestes Paar unter

den bisher besuchten Zahlen x′1, . . . , x

′j bilden; ihr Abstand heißt MinDistSoFar .1

MinDistSoFar := x′[2] − x′[1];ClosPos := 2;for j := 3 to n do

1Oft wird man sich nur fur den Abstand eines dichtesten Paars interessieren; dann kann auf diePositionsinformation ClosPos verzichtet werden.

Page 3: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.2. SWEEP IM EINDIMENSIONALEN 69

if MinDistSoFar > x′[j] − x′[j − 1]then

MinDistSoFar := x′[j] − x′[j − 1];ClosPos := j;

write("Ein dichtestes Paar bilden ", x′[ClosPos − 1], x′[ClosPos])

Nach dem vorausgehenden Sortiervorgang laßt sich ein dichtestes Paar von n re-ellen Zahlen mit diesem sweep in linearer Zeit bestimmen. Die Gesamtlaufzeit derLosung ist also in O(n log n). Damit haben wir folgende Aussage:

Korollar 1 Ein dichtestes Paar von n reellen Zahlen zu bestimmen, hat die Zeit-komplexitat O(n log n).

Man kann ubrigens durch Reduktion auf das sogenante ε-closeness-problem be-weisen, daß es auch nicht schneller geht; siehe zum Beispiel Klein [6].

Ubungsaufgabe 5.1 Gegeben sind n Punkte pi = (xi, sin xi) auf der Sinuskurve imIR2. Man bestimme ein dichtestes Paar.

Bei unseren ersten beiden Beispielen war es ziemlich einfach zu entscheiden, welcheInformation wahrend des sweep mitgefuhrt werden muß: Bei der Bestimmung desMaximums war es das Maximum der bisher betrachteten Objekte, bei der Berechnungdes dichtesten Paars war es das dichteste Paar der bisher betrachteten Zahlen.

Wir werden nun ein Beispiel fur eine Anwendung der Sweep-Technik kennenlernen,das ein klein wenig mehr Uberlegung erfordert, aber dafur umso verbluffender ist.

5.2.3 Die maximale Teilsumme

Angenommen, jemand fuhrt uber die Kursschwankungen einer Aktie Buch. Das Aufoder Ab am i-ten Tag wird als reelle Zahl an der i-ten Stelle eines Arrays Variationgespeichert, fur 1 ≤ i ≤ n.

Eine interessante Frage lautet: Wieviel hatte man verdienen konnen, wenn mandiese Aktie am richtigen Tag gekauft und am richtigen Tag wieder verkauft hatte?Der maximale Gewinn wird durch die maximale Summe

Variation[i] + Variation[i + 1] + . . . + Variation[j]

beschrieben, die sich ergibt, wenn i von 1 bis n und j von i bis n laufen, falls wenigstenseine solche Summe nicht-negativ ist; wenn dagegen eine Aktie stets fallt, kauft mansie am besten gar nicht und macht den Gewinn Null.

Ein Beispiel ist in Abbildung 5.1 zu sehen. Vom dritten bis zum siebten Tag steigtder Kurs der Aktie insgesamt um den Wert 10. Durch Ausprobieren der anderenMoglichkeiten kann man sich davon uberzeugen, daß es keine luckenlose Teilfolge vonZahlen gibt, die eine großere Summe hatte. So lohnt es sich zum Beispiel nicht, dieAktie auch am achten Tag noch zu behalten, weil der Verlust von 9 spater nicht mehrausgeglichen wird.

Wie laßt sich die maximale Teilsumme effizient berechnen? Dieses hubsche Pro-blem ist unter dem Namen maximum subvector bekannt. Es findet sich in der lesens-werten Sammlung Programming Pearls von J. Bentley [2].

Page 4: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

70 KAPITEL 5. DAS SWEEP-VERFAHREN3

2 -4 3 -1 4 -1 5 -9 2 -6 5 -3 5

︷ ︸︸ ︷Summe = 10

16

36

76

n6

Abbildung 5.1: Die maximale Teilsumme aufeinanderfolgender Zahlen hat hier denWert 10.

-1 2 -3 5 -2 -1 8 -2 0 1 -9 3 -1 3 -4 8 2

MaxSoFar MaxEndingHere

1

6

j

6

4

6

7

6

j − 5

6

︸ ︷︷ ︸bisher besucht

Abbildung 5.2: Die bisher ermittelte maximale Teilsumme MaxSoFar kann nur voneiner Teilsumme ubertroffen werden, die sich bis zum neu hinzukommenden EintragVariation[j] erstreckt.

Die naive Berechnung der maximalen Teilsumme fuhrt zu einem Algorithmus mitdrei geschachtelten for-Schleifen fur i, j und einen Summationsindex k; seine Laufzeitist in Θ(n3). Er laßt sich zu einem Θ(n2)-Verfahren verbessern, indem man nachjeder Erhohung von j nicht die ganze Summe von i bis j + 1 neu berechnet, sondernlediglich zur alten Summe den neuen Summanden Variation[j+1] hinzuaddiert. Auchein Ansatz nach dem Verfahren divide and conquer ist moglich; er liefert eine Laufzeitin Θ(n log n).

Man kann aber die gesuchte maximale Teilsumme sogar in optimaler Zeit Θ(n)berechnen, wenn man das Sweep-Verfahren richtig anwendet! Die Objekte sind dieEintrage

Variation[1],Variation[2], . . . ,Variation[n],

die wir in dieser Reihenfolge besuchen. In der Variablen MaxSoFar j−1 merken wiruns die bisher ermittelte maximale Teilsumme der ersten j − 1 Zahlen.

Wodurch konnte MaxSoFar j−1 ubertroffen werden, wenn im nachsten Schritt nunauch Variation[j] besucht wird? Doch nur von einer Teilsumme der ersten j Eintrage,die den j-ten Eintrag einschließt! Diese Situation ist in Abbildung 5.2 dargestellt.Die bisherige maximale Teilsumme der Positionen 1 bis j−1 hat den Wert 10; gebildetwird sie von den Eintragen an den Positionen 4 bis 7. Dieses alte Maximum wird nun

”entthront“ von der Summe der Eintrage an den Positionen j − 5 bis j, die den Wert

11 hat.

Um die Variable MaxSoFar in dieser Situation korrekt aktualisieren zu konnen,mussen wir wahrend des sweep mehr Information mitfuhren als nur MaxSoFar selbst.Wir benotigen auch die maximale Teilsumme der schon betrachteten Eintrage, die indem zuletzt neu hinzugekommenen Eintrag endet. Mit MaxEndingHerej bezeichnenwir das Maximum aller Summen

Variation[h] + Variation[h + 1] + . . . + Variation[j]

Page 5: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 71

wobei h zwischen 1 und j lauft, falls wenigstens eine dieser Summen nicht-negativist; andernfalls soll MaxEndingHerej den Wert Null haben. Im Beispiel von Abbil-dung 5.2 ist MaxEndingHerej die Summe der letzten sechs Eintrage. Dagegen wareMaxEndingHere3 = 0.

Wir mussen uns nun noch uberlegen, wie MaxEndingHere aktualisiert werden soll,wenn der sweep von Position j − 1 zur Position j vorruckt. Dabei hilft uns folgendeeinfache Beobachtung: Fur festes j wird das Maximum aller Summen

Variation[h] + Variation[h + 1] + . . . + Variation[j − 1] + Variation[j],

h ≤ j, fur h = j angenommen oder fur dasselbe h ≤ j−1, das auch schon die Summe

Variation[h] + Variation[h + 1] + . . . + Variation[j − 1]

maximiert hat. Im ersten Fall gibt es keine positive Teilsumme, die in Position j − 1endet, und MaxEndingHerej−1 hatte den Wert Null. In beiden Fallen gilt

MaxEndingHerej = max(0,MaxEndingHerej−1 + Variation[j]).

Damit haben wir folgenden Sweep-Algorithmus zur Berechnung der maximalen Teil-summe:

MaxSoFar := 0;MaxEndingHere := 0;for j := 1 to n do

MaxEndingHere := max(0,MaxEndingHere + Variation[j]);MaxSoFar := max(MaxSoFar ,MaxEndingHere);

write("Die maximale Teilsumme betragt ", MaxSoFar)

Theorem 2 In einer Folge von n Zahlen die maximale Teilsumme konsekutiverZahlen zu bestimmen, hat die Zeitkomplexitat Θ(n).

Dieser Algorithmus ist nicht nur der schnellste unter allen Mitbewerbern, sondernauch der kurzeste! Daruber hinaus benotigt er keinen wahlfreien Zugriff auf dasganze Array Variation, denn die Kursschwankung des j-ten Tages wird ja nur einmalangeschaut und danach nie wieder benotigt. Man konnte deshalb dieses Verfahren alsnicht-terminierenden Algorithmus implementieren, der am j-ten Tag die SchwankungVariation[j] als Eingabe erhalt und als Antwort den bis jetzt maximal erzielbarenGewinn ausgibt; schade, daß dieser erst im nachhinein bekannt wird. Bei diesemon-line-Betrieb waren der Speicherplatzbedarf und die tagliche Antwortzeit konstant.

5.3 Sweep in der Ebene

Ihre wahre Starke zeigt die Sweep-Technik in der Ebene. Die Objekte, die in unserenProblemen vorkommen, werden zunachst Punkte sein, spater Liniensegmente. Wirbesuchen sie in der Reihenfolge, in der sie von einer senkrechten Geraden angetroffenwerden, die von links nach rechts uber die Ebene wandert.

Die Vorstellung dieser wandernden Geraden (sweep line), die die Ebene von linksnach rechts

”ausfegt“ und dabei keine Stelle auslaßt, hat dem Sweep-Verfahren seinen

Namen gegeben.

Page 6: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

72 KAPITEL 5. DAS SWEEP-VERFAHREN6

5.3.1 Das dichteste Punktepaar in der Ebene

Wir beginnen mit dem Problem closest pair, das uns aus dem Eindimensionalen schonbekannt ist. Gegeben sind n Punkte p1, . . . , pn in der Ebene, gesucht ist ein Paarmit minimalem euklidischen Abstand. Wir sind zunachst etwas bescheidener undbestimmen nur den minimalen Abstand

min1≤i<j≤n

|pipj |

selbst; der Algorithmus laßt sich spater leicht so erweitern, daß er auch ein dichtestesPaar ausgibt, bei dem dieser Abstand auftritt.

Erinnern wir uns an unser Vorgehen im Eindimensionalen: Die Punkte warendort Zahlen auf der X-Achse. Wir hatten sie von links nach rechts besucht und dabeifur jede Zahl den Abstand zu ihrer unmittelbaren Vorgangerin betrachtet. War erkleiner als MinSoFar , der bisher ermittelte minimale Abstand, so mußte MinSoFaraktualisiert werden.

In der Ebene konnen wir nicht ganz so einfach verfahren. Wenn wir mit dersweep line auf einen neuen Punkt r treffen, so kann der Abstand zu dessen direktemVorganger q, d. h. zu dem Punkt, der als letzter vor r von der sweep line erreichtwurde, viel großer sein als der Abstand von r zu noch weiter links liegenden Punkten;siehe Abbildung 5.3.

Eines aber ist klar: Wenn r mit einem Punkt p links von r ein Paar bilden will,dessen Abstand kleiner ist als MinSoFar , so muß p im Innern des senkrechten Streifender Breite MinSoFar liegen, dessen rechter Rand durch r lauft; dieser Streifen ist inAbbildung 5.3 grau eingezeichnet. Wahrend die sweep line vorruckt, zieht sie densenkrechten Streifen hinter sich her. Nur die Punkte im Streifen brauchen wir unswahrend des sweep zu merken; jeder von ihnen konnte zu einem Paar mit Abstand< MinSoFar gehoren, wenn die sweep line auf einen passenden Partner stoßt.

Wir fuhren deshalb ein Verzeichnis mit, in dem zu jedem Zeitpunkt genau diePunkte im senkrechten Streifen der Breite MinSoFar links von der sweep line stehen;4

hierdurch ist der Inhalt des Verzeichnisses eindeutig definiert.Weil dieses Verzeichnis die Information uber

”die Situation dicht hinter der sweep

line“ enthalt, tragt es den Namen Sweep-Status-Struktur, abgekurzt SSS .5

Folgende Ereignisse erfordern eine Aktualisierung der SSS :

1. Der linke Streifenrand wandert uber einen Punkt hinweg.

2. Der rechte Streifenrand, also die sweep line, stoßt auf einen neuen Punkt.

Bei einem Ereignis des ersten Typs muß der betroffene Punkt aus der SSS entferntwerden. Findet ein Ereignis vom zweiten Typ statt, so gehort der neue Punkt zumStreifen und muß in die SSS aufgenommen werden. Außerdem ist zu testen, ob erzu irgendeinem anderen Punkt im Streifen einen Abstand < MinSoFar hat. Falls ja,mussen MinSoFar und die Streifenbreite auf den neuen Wert verringert werden. Derlinke Streifenrand kann dabei uber einen oder mehrere Punkte hinwegspringen und

4Der Streifen ist links offen.5Manche Autoren sagen auch Y-Liste dazu, weil die Objekte darin meist nach Y -Koordinaten

sortiert sind. Auf solche Implementierungsfragen werden wir spater noch eingehen.

Page 7: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 73

MinSoFar

MinSoFar

s

r

p

q

t

Abbildung 5.3: Die sweep line erreicht Punkt r. Der Abstand |pr| ist hier kleiner alsMinSoFar .

so eine Folge von”gleichzeitigen“ Ereignissen des ersten Typs nach sich ziehen. Wir

bearbeiten sie, bevor die sweep line sich weiterbewegt.In Abbildung 5.3 sind davon die Punkte s und p betroffen: Wenn die sweep line

den Punkt r erreicht, schrumpft der Streifen auf die Breite |pr|. Wahrend die sweepline danach zum Punkt t vorruckt, wandert der linke Streifenrand uber q hinweg.

Offenbar betreten und verlassen die Punkte den Streifen in der Reihenfolge vonlinks nach rechts. Wir sortieren sie deshalb nach aufsteigenden X-Koordinaten undlegen sie in einem Array ab. Dabei kann man testen, ob bei Punkten mit identischenX-Koordinaten auch die Y -Koordinaten ubereinstimmen; in diesem Fall terminiertdas Verfahren sofort und liefert den kleinsten Abstand 0. Andernfalls wissen wir, daßdie n Punkte paarweise verschieden sind.

Die Indizes links und rechts verweisen jeweils auf die am weitesten links gele-genen Punkte im Streifen und rechts vom Streifen.7 Kurz bevor die sweep line inAbbildung 5.3 den Punkt r erreicht, haben wir die in Abbildung 5.4 gezeigte Situa-tion.

. . . s p q r t . . .

links6

rechts6

Abbildung 5.4: P [links] ist der am weitesten links gelegene Punkt im senkrechtenStreifen, und P [rechts] ist der nachste Punkt, auf den die sweep line treffen wird.

Ob zuerst P [links] den Streifen verlaßt oder P [rechts] den Streifen betritt, konnenwir leicht feststellen. Wenn wir mit p.x die X-Koordinate eines Punktes p bezeichnen,

7Sollte der Streifen gerade keinen Punkt enthalten, so ist links gleich rechts .

Page 8: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

74 KAPITEL 5. DAS SWEEP-VERFAHREN9

so mussen wir nur testen, ob

P [links].x + MinSoFar ≤ P [rechts].x

ist. Falls ja, kommt zuerst P [links] an die Reihe. Damit laßt sich der Sweep-Algorithmus wie folgt beschreiben:

(* Initialisierung *)sortiere die n Punkte nach aufsteigenden X-Koordinaten;fuge sie ins Array P ein; (* alle Punkte paarweise verschieden *)fuge P [1], P [2] in SSS ein;MinSoFar := |P [1]P [2]|;links := 1;rechts := 3;

(* sweep *)while (* I1 gilt *) rechts ≤ n do

if P [links].x + MinSoFar ≤ P [rechts].xthen (* ein alter Punkt verlaßt den Streifen *)

entferne P [links] aus SSS ;links := links + 1

else (* ein neuer Punkt betritt den Streifen; I2 gilt *)fuge P [rechts] in SSS ein;rechts := rechts + 1;MinSoFar := MinDist(SSS , P [rechts],MinSoFar);

(* Ausgabe *)write("Der kleinste Abstand ist ", MinSoFar)

Zu spezifizieren ist noch die Funktion MinDist : Bei einem Aufruf

MinDist(SSS , r,MinSoFar)

wird das Minimum von MinSoFar und der minimalen Distanz min{|pr|; p ∈ SSS} vomneuen Punkt r auf der sweep line zu allen ubrigen Punkten im senkrechten Streifenzuruckgegeben. Wie diese Funktion implementiert wird, beschreiben wir gleich.

Zunachst vergewissern wir uns, daß der Sweep-Algorithmus korrekt ist.

Ubungsaufgabe 5.2 Man zeige, daß an den markierten Stellen im Programmjeweils die folgenden Invarianten gelten:

I1 : Es ist MinSoFar der minimale Abstand unter den Punkten P [1], . . . , P [rechts−1].

I2 : Die SSS enthalt genau die Punkte P [i], 1 ≤ i ≤ rechts − 1, mit P [i].x >P [rechts].x − MinSoFar . (4)

Um beim Erreichen eines neuen Punktes r das Minimum min{|pr|; p ∈ SSS} zubestimmen, genugt es, diejenigen Punkte p im Streifen zu inspizieren, deren Y -Koordinate um hochstens MinSoFar oberhalb oder unterhalb von r.y liegen, denn keinanderer Punkt kann zu r einen Abstand < MinSoFar haben; siehe Abbildung 5.5.8

8Eigentlich wurde es genugen, den Halbkreis um r mit Radius MinSoFar abzusuchen, aber dazufehlt uns eine effiziente Methode. Stattdessen inspizieren wir das den Halbkreis umschließendeRechteck R und nehmen in Kauf, dabei auch auf Punkte s mit |sr| > MinSoFar zu stoßen.

Page 9: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 75

MinSoFar

MinSoFar

MinSoFar

s

r

p

R

Abbildung 5.5: Nur ein Punkt, der im Rechteck R liegt, kann zum Punkt r einenAbstand kleiner als MinSoFar haben.

Die Sweep-Status-Struktur SSS muß es also gestatten, Punkte einzufugen und zuentfernen und beim Aufruf von MinDist fur beliebige Zahlen y0 und M alle gespei-cherten Punkte p mit

y0 − M ≤ p.y ≤ y0 + M

zu berichten; fur y0 = r.y und M = MinSoFar sind das genau die Punkte im RechteckR in Abbildung 5.5. Diese Anfrage heißt Bereichsanfrage.

Offenbar kommt es hierbei auf die X-Koordinaten der Punkte gar nicht an! Wirkonnen deshalb zur Implementierung der SSS eine eindimensionale Datenstrukturverwenden, die nur die Y -Koordinaten unserer Punkte

”kennt“. Dazu nehmen wir

einen nach Y -Koordinaten geordneten balancierten Binarbaum, dessen Blatter zu ei-ner Liste verkettet sind und die zu speichernden Punkte enthalten; man kann zumBeispiel AVL-Baume verwenden, wie sie in Buchern uber Datenstrukturen vorgestelltwerden. Damit lassen sich die Operationen Einfugen und Entfernen jeweils in ZeitO(log n) ausfuhren, und die Bereichsanfrage erfolgt in Zeit O(logn + k), wobei k dieAnzahl der berichteten Punkte bedeutet, die sogenannte Große der Antwort. Furjeden der berichteten k Punkte ist sein Abstand zum neu eingefugten Punkt zu be-stimmen.

Weil die while-Schleife nur O(n)-mal durchlaufen wird, ergibt sich eine Gesamt-laufzeit in

O

(n log n +

n∑i=3

ki

);

hierbei ist ki die Große der Antwort der i-ten Bereichsanfrage beim Einfugen des i-tenPunkts.

Wie groß kann die Summe der ki werden? Naturlich ist ki ≤ i, aber dieseAbschatzung liefert uns nur eine obere Schranke in O(n2). Ware das Laufzeitver-halten tatsachlich so schlecht, so hatten wir ebensogut auf den sweep verzichten undgleich alle Paare von Punkten inspizieren konnen!

Bei der Verbesserung dieser Abschatzung kommt uns folgende strukturelle geo-metrische Uberlegung zu Hilfe: Wenn ein Aufruf MinDist(SSS , r,MinSoFar) eineBereichsanfrage fur das in Abbildung 5.5 gezeigte Rechteck R auslost, so haben alle

Page 10: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

76 KAPITEL 5. DAS SWEEP-VERFAHREN10

Punkte links von der sweep line, also insbesondere diejenigen im Rechteck R, minde-stens den Abstand MinSoFar voneinander. Wenn aber die Punkte so

”lose gepackt“

sind, passen nicht allzu viele in das Rechteck R hinein!

Lemma 3 Sei M > 0 und P eine Menge von Punkten in der Ebene, von denen jezwei mindestens den Abstand M voneinander haben. Dann enthalt ein Rechteck mitden Kantenlangen M und 2M hochstens 10 Punkte aus P .

Beweis. Nach Voraussetzung sind die Kreisumgebungen UM/2(p) der Punkte p aus Ppaarweise disjunkt. Liegt p im Rechteck R, so ist mindestens ein Viertel der offenenKreisscheibe in R enthalten. Durch Flachenberechnung ergibt sich, daß R hochstens

Flache(R)

Flache(Viertelkreis)=

2M2

14π(M

2)2

=32

π< 11

viele Punkte von P enthalten kann. 2

Folglich ist jedes ki kleiner gleich 10, und wir erhalten folgenden Satz:

Theorem 4 Der minimale Abstand aller Paare einer n-elementigen Punktmenge inder Ebene laßt sich in Zeit O(n logn) bestimmen.

Indem wir uns außer dem Wert von MinSoFar auch merken, zwischen welchenbeiden bisher betrachteten Punkten der minimale Abstand aufgetreten ist, erhaltenwir als Folgerung:

Korollar 5 Ein dichtestes Paar von n Punkten in der Ebene laßt sich in ZeitO(n log n) bestimmen.

Bei der Losung dieses Problems haben wir uns auf zwei geometrische Sachverhaltegestutzt. Der erste ist trivial: strukturelle EigenschaftWenn der minimale AbstandM in einer Punktmenge P durch Hinzufugen eines neuen Punktes r abnimmt, somussen die hierfur verantwortlichen Punkte von P nah (d. h. im Abstand < M) beir liegen.

Unsere zweite geometrische Stutze ist Lemma 3. Es besagt im wesentlichen: Einebeschrankte Menge kann nicht beliebig viele Punkte enthalten, die zueinander einenfesten Mindestabstand haben.

Die genaue Anzahl von Punkten, die der rechteckige Anfragebereich R hochstensenthalten kann, geht naturlich in den Faktor in der O-Notation fur die Laufzeit-abschatzung ein. Dies ist Gegenstand folgender Ubungsaufgabe.

Ubungsaufgabe 5.3 Man bestimme die kleinste Konstante ≤ 10, fur die Lemma 3richtig bleibt.

Daß man das closest-pair-Problem mit einem derart einfachen Sweep-Algorithmuslosen kann, wurde von Hinrichs et al. [5] beobachtet.

Nebenbei haben wir eine Reihe weiterer Eigenschaften kennengelernt, die furSweep-Algorithmen charakteristisch sind: Wahrend des sweep wird eine Sweep-Status-Struktur mitgefuhrt, die die

”Situation dicht hinter der sweep line“ beschreibt. Der

Inhalt dieser Struktur muß eine bestimmte Invariante erfullen.

Page 11: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 77

Jeder Anlaß fur eine Veranderung der SSS heißt ein Ereignis. Obwohl wir unsvorstellen, daß die sweep line sich stetig mit der Zeit vorwartsbewegt, braucht derAlgorithmus nur die diskrete Menge der Ereignisse zu bearbeiten – dazwischen gibtes nichts zu tun! Es kommt darauf an, die Ereignisse vollstandig und in der richtigenReihenfolge zu behandeln und die SSS jedesmal korrekt zu aktualisieren. Will mandie Korrektheit eines Sweep-Algorithmus formal beweisen, so muß man zeigen, daßdie Invariante nach der Bearbeitung von Ereignissen wieder erfullt ist.

Die Objekte, mit denen ein Sweep-Algorithmus arbeitet, durchlaufen wahrenddes sweep eine bestimmte Entwicklung; siehe Abbildung 5.6. Solange ein Objektnoch rechts von der sweep line liegt, ist es ein schlafendes Objekt. Sobald es von dersweep line beruhrt wird, wacht es auf und wird ein aktives Objekt; genau die aktivenObjekte sind in der SSS gespeichert. Wenn feststeht, daß ein Objekt nie wiedergebraucht wird, kann es aus der SSS entfernt werden. Danach ist es ein totes Objekt.

tot aktiv schlafend

wacht aufstirbt

alle Objekte, die nicht mehr benötigt werden

Sweep-Status-Struktur alle Objekte rechts von der sweep line

Abbildung 5.6: Die Entwicklung eines Objekts wahrend eines sweep.

Im IR2 verwandelt sweep ein zweidimensionales Problem in eine Folge von ein-dimensionalen: die Verwaltung der Sweep-Status-Struktur; hierzu wird meist einedynamische eindimensionale Datenstruktur eingesetzt.

Obwohl es in diesem Kapitel um den sweep geht, wollen wir andere Technikennicht ganz aus dem Auge verlieren:

Ubungsaufgabe 5.4 Man skizziere, wie sich der kleinste Abstand zwischen n Punk-ten in der Ebene in Zeit O(n logn) mit dem Verfahren divide and conquer bestimmenlaßt.

5.3.2 Schnittpunkte von Liniensegmenten

In diesem Abschnitt kommen wir zu dem Klassiker unter den Sweep-Algorithmen, derganz am Anfang der Entwicklung dieser Technik in der Algorithmischen Geometriestand; siehe Bentley und Ottmann [3]. Gegeben sind n Liniensegmente si = liri, 1 ≤i ≤ n, in der Ebene. Wir interesieren uns fur die echten Schnittpunkte zwischen denSegmenten; dabei heißt der Punkt p ein echter Schnittpunkt von si und sj , wenn diebeiden Segmente sich in p kreuzen und p kein Endpunkt von si oder sj ist.

Zwei Probleme sollen untersucht werden: Beim Existenzproblem besteht die Auf-gabe darin, herauszufinden, ob es unter den n Segmenten zwei gibt, die einen echten

Page 12: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

78 KAPITEL 5. DAS SWEEP-VERFAHREN11

Schnittpunkt haben; beim Aufzahlungsproblem sollen alle echten Schnittpunkte be-stimmt werden.

Jedes der beiden Probleme kann man naiv in Zeit O(n2) losen, indem man je zweiLiniensegmente hernimmt und feststellt, ob sie einen echten Schnittpunkt haben. Imschlimmsten Fall kann jedes Segment jedes andere schneiden, so daß k = n(n−1)

2ist.

Bedeutet das etwa, daß der naive Algorithmus zur Losung des Aufzahlungsproblemsoptimal ist?

Wenn man nur die Anzahl n der Segmente als Problemparameter zulaßt, ist dieseFrage zu bejahen. Wir erwarten aber doch, daß die Rechenzeit eines Losungsverfah-rens nur dann groß wird, wenn auch k groß ist. Dieses erstrebenswerte Verhalten einesAlgorithmus nennt man Output-Sensitivitat. Mit der Einfuhrung von k als zweitemProblemparameter haben wir ein Kriterium fur die Output-Sensitivitat von guten Al-gorithmen. Das naive Verfahren hat diese Eigenschaft nicht, denn es benotigt immerΘ(n2) viele Schritte, auch fur k = 0.

Wir wollen nun effiziente Sweep-Algorithmen zur Losung des Existenz- und desAufzahlungsproblems angeben. Unsere Objekte sind die n Liniensegmente si. ZurVereinfachung der Darstellung nehmen wir an, daß keines von ihnen senkrecht ist;der linke Endpunkt ist li, der rechte ri. Außerdem sei der Durchschnitt von zweiLiniensegmenten entweder leer oder ein einzelner Punkt. Ferner sollen sich nie mehrals zwei Segmente in einem Punkt schneiden, und alle Endpunkte und Schnittpunktesollen paarweise verschiedene X-Koordinaten haben.

Die sweep line bewegt sich, wie ublich, von links nach rechts uber die Ebene. DenAugenblick, in dem sie die X-Achse in x0 schneidet, nennen wir den Zeitpunkt x0.

Auf denjenigen Liniensegmenten, die die sweep line zum Zeitpunkt x0 geradeschneidet, definiert sie eine Ordnung entsprechend den aufsteigenden Y -Koordinatender Schnittpunkte; in Abbildung 5.7 haben wir zum Beispiel zur Zeit x1 die Ordnungs3 < s1 < s4 < s2. Diese Ordnung wird in der Sweep-Status-Struktur SSS mitgefuhrt.

Folgende Ereignisse verandern die Ordnung der Segmente langs der sweepline underfordern eine Aktualisierung der SSS :

1. Die sweep line stoßt auf den linken Endpunkt eines Liniensegments,

2. die sweep line erreicht den rechten Endpunkt eines Liniensegments,

3. die sweep line erreicht einen echten Schnittpunkt von zwei Liniensegmenten.

Um die Ereignisse von Typ 1 und 2 in der richtigen Reihenfolge bearbeiten zukonnen, sortieren wir vor Beginn des sweep alle Endpunkte li, ri nach ihren X-Koordinaten. Wie aber sollen wir die Ereignisse vom Typ 3 rechtzeitig erkennen?(Die Schnittpunkte sollen ja erst noch bestimmt werden!)

Zum Gluck konnen wir uns auf folgende geometrische Eigenschaft stutzen:

Lemma 6 Wenn zwei Liniensegmente einen echten Schnittpunkt haben, so sind sieunmittelbar vorher direkte Nachbarn in der Ordnung langs der sweep line.

Beweis. Sei p echter Schnittpunkt der beiden Segmente s2 und s3 mit X-Koordinatex2; siehe Abbildung 5.7. Weil nach unserer Annahme keines der anderen n − 2 Lini-ensegmente den Punkt p enthalt, gibt es ein ε > 0, so daß die Umgebung Uε(p) von s2

Page 13: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 79

X

Y

p

s2

s4

s1

s3

s5

x1 x2x2 - ε

Uε(p)

Abbildung 5.7: Die von der sweep line geschnittenen Liniensegmente sind nach deny-Werten der Schnittpunkte geordnet.

und s3 durchschnitten, aber von keinem anderen Segment geschnitten wird. Folglichsind fur jeden Zeitpunkt x ∈ (x2 − ε, x2) die Segmente s2, s3 direkte Nachbarn in derOrdnung langs der sweep line, also auch Nachbarn in der SSS spatestens nach demletzten Ereignis vor Erreichen von p. 2

Wir werden also keinen echten Schnittpunkt verpassen, wenn wir dafur sorgen,daß zwei Liniensegmente sofort auf Schnitt getestet werden, sobald sie in der Ordnunglangs der sweep line zu direkten Nachbarn werden!

Bei der Behandlung eines Ereignisses vom Typ 1 muß daher zunachst das neueLiniensegment s an der richtigen Stelle in die aktuelle Ordnung eingefugt werden.Sind danach die Segmente si und sj der direkte Vorganger und der direkte Nachfolgervon s langs der sweep line, so muß s mit si und mit sj auf echten Schnitt getestetwerden; in Abbildung 5.7 hat zum Beispiel s4 den Vorganger s1 und den Nachfolgers2, wenn die sweep line seinen linken Endpunkt erreicht hat.

Wenn die sweep line am rechten Endpunkt eines Segments s angekommen ist(Ereignis vom Typ 2), wird s aus der Sweep-Status-Struktur entfernt. Sein fruhererdirekter Vorganger und sein fruherer direkter Nachfolger sind danach selbst direkteNachbarn und mussen auf echten Schnitt getestet werden. Beim Entfernen von s1 inAbbildung 5.7 sind das die Segmente s3 und s4.

Besitzt ein Segment keinen Vorganger oder Nachfolger in der aktuellen Ordnung,so fallt der entsprechende Schnittest weg.

Wenn wir uns nur fur die Existenz eines echten Schnittpunkts interessieren, istunser Sweep-Algorithmus sehr einfach. Wir sortieren anfangs die 2n Endpunkteder Liniensegmente nach aufsteigenden X-Koordinaten und speichern sie in einemArray. Wahrend des sweep bearbeiten wir die zugehorigen Ereignisse vom Typ 1oder 2 in dieser Reihenfolge, wie oben beschrieben. Sobald der erste Schnittest ein

Page 14: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

80 KAPITEL 5. DAS SWEEP-VERFAHREN12

positives Ergebnis liefert, konnen wir den sweep beenden. Ereignisse vom Typ 3brauchen hierbei nicht behandelt zu werden. Die Sweep-Status-Struktur muß folgendeOperationen erlauben:

FugeEin(SSS,Seg,x): fugt Segment Seg entsprechend derOrdnung zur Zeit x in die SSS ein.

Entferne(SSS,Seg,x): entfernt Segment Seg aus der SSSzum Zeitpunkt x.

Vorg(SSS,Seg,x): bestimmt den Vorganger von Segin der SSS zum Zeitpunkt x.

Nachf (SSS,Seg,x): bestimmt den Nachfolger von Segin der SSS zum Zeitpunkt x.

Auch hier konnen wir zur Implementierung der SSS einen balancierten Binarbaummit verketteten Blattern verwenden. Gespeichert werden darin – durch Angabe derEndpunkte – die Liniensegmente entsprechend ihrer Ordnung langs der sweep line.

Um die bei jedem Zugriff erforderlichen Großenvergleiche zwischen Liniensegmen-ten auszufuhren, werden die zum momentanen X-Wert zugehorigen Y -Koordinatenberechnet und miteinander verglichen; aus diesem Grund ist es notwendig, bei jederOperation auf der SSS den Zeitparameter x zu ubergeben.

Jede der Operation ist in Zeit O(log n) ausfuhrbar, weil hochstens n Linienseg-mente gleichzeitig in der SSS gespeichert sind. Da die Bearbeitung von jedem der(hochstens) 2n vielen Ereignisse nur drei solche Operationen erfordert, ergibt sichfolgende Aussage:

Theorem 7 Man kann in Zeit O(n log n) und mit Speicherplatz O(n) herausfinden,ob von n Liniensegmenten in der Ebene mindestens zwei einen echten Schnittpunkthaben.

Wenn man davon ausgeht, daß die n Liniensegmente ohnehin gleichzeitig im Spei-cher gehalten werden mussen, so ist auch die lineare Schranke fur den Speicherplatz-bedarf optimal.

Ubungsaufgabe 5.5 Entdeckt der Sweep-Algorithmus den am weitesten links lie-genden echten Schnittpunkt von n Liniensegmenten immer als ersten? (1)

Alle echten Schnittpunkte zu berichten, ist ein etwas anspruchsvolleres Problem.Der gravierende Unterschied wird schon bei der Bearbeitung der Ereignisse vom Typ 1und Typ 2 deutlich: Wenn ein Schnittest von zwei direkten Nachbarn positiv verlau-fen ist, so mussen wir uns diesen echten Schnittpunkt als zukunftiges Ereignis vomTyp 3 vormerken und zum richtigen Zeitpunkt behandeln! Dort wechseln die beidensich schneidenden Liniensegmente in der Ordnung langs der sweep line ihre Platze;siehe zum Beispiel s3 und s2 zur Zeit x2 in Abbildung 5.7. Zur Ausfuhrung derVertauschung zweier benachbarter Segmente USeg und OSeg dient die OperationVertausche(SSS,USeg,OSeg,x).

Danach hat jedes von beiden einen neuen nachsten Nachbarn, mit dem er aufSchnitt zu testen ist; so hat zum Beispiel s3 nach der Vertauschung mit s2 den direkten

Page 15: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 81

Nachfolger s5. Wird ein echter Schnittpunkt festgestellt, wie hier zwischen s3 und s5,so muß er als zukunftiges Ereignis vom Typ 3 vorgemerkt werden.

Beim Aufzahlungsproblem sind also die Ereignisse, die wahrend des sweep zu be-handeln sind, nicht alle schon am Anfang bekannt; sie ergeben sich vielmehr erst nachund nach zur Laufzeit. Zu ihrer Verwaltung benotigen wir eine dynamische Ereignis-struktur ES , in der zukunftige Ereignisse in ihrer zeitlichen Reihenfolge verzeichnetsind. Außer der Initalisierung und dem Test, ob ES leer ist, sind folgende Operationenmoglich:

FugeEin(ES,Ereignis): Fugt Ereignis Ereignis entsprechendseiner Eintrittszeit in die ES ein.

NachstesEreignis(ES ): Liefert das zeitlich erste in ESgespeicherte Ereignis und entfernt es aus ES .

Ereignisse stellen wir uns dabei als Objekte folgenden Typs vor:

type tEreignis = recordZeit : real;case Typ : (LinkerEndpunkt, RechterEndpunkt, Schnittpunkt) of

LinkerEndpunkt, RechterEndpunkt :Seg : tSegment;

Schnittpunkt :USeg, OSeg : tSegment

end;

Fur ein solches Ereignis gibt Ereignis.Typ an, ob es sich um den linken oder rechtenEndpunkt des Liniensegments Ereignis.Seg handelt, oder um einen Schnittpunkt; indiesem Fall bezeichnet Ereignis.USeg das untere und Ereignis.OSeg das obere derbeiden beteiligten Liniensegmente unmittelbar links vom Schnittpunkt.

Die Komponente Ereignis.Zeit bezeichnet schließlich den Zeitpunkt, zu dem dasEreignis eintreten wird, also die X-Koordinate des linken oder rechten Endpunktsvon Ereignis.Seg oder die X-Koordinate des Schnittpunkts von Ereignis.USeg undEreignis.OSeg.

Einen Sweep-Algorithmus zur Aufzahlung aller echten Schnittpunkte von n Lini-ensegmenten konnen wir nun folgendermaßen skizzieren:

(*Initialisierung*)initialisiere die Strukturen SSS und ES ;sortiere die 2n Endpunkte nach aufsteigenden X-Koordinaten;erzeuge daraus Ereignisse;fuge diese Ereignisse in die ES ein;

(*sweep und Ausgabe*)while ES 6= ∅ do

Ereignis := NachstesEreignis(ES );with Ereignis do

case Typ ofLinker Endpunkt:

Page 16: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

82 KAPITEL 5. DAS SWEEP-VERFAHREN14

FugeEin(SSS , Seg , Zeit );VSeg := Vorg(SSS , Seg , Zeit );TesteSchnittErzeugeEreignis(VSeg , Seg );NSeg := Nachf (SSS , Seg , Zeit );TesteSchnittErzeugeEreignis(Seg , NSeg );

Rechter Endpunkt:VSeg := Vorg(SSS , Seg , Zeit );NSeg := Nachf (SSS , Seg , Zeit );Entferne(SSS , Seg , Zeit );TesteSchnittErzeugeEreignis(VSeg , NSeg );

Schnittpunkt:Berichte(USeg , OSeg ) als Paar mit Schnitt;Vertausche(SSS , USeg , OSeg, Zeit );VSeg := Vorg(SSS , OSeg, Zeit );TesteSchnittErzeugeEreignis(VSeg , OSeg );NSeg := Nachf (SSS , USeg , Zeit );TesteSchnittErzeugeEreignis(USeg , NSeg )

Bei einem Aufruf der Prozedur TesteSchnittErzeugeEreignis(S, T ) wird zunachstgetestet, ob die Liniensegmente S und T einen echten Schnittpunkt besitzen. Fallsja, wird ein neues Ereignis vom Typ Schnittpunkt erzeugt, mit USeg = S, OSeg = Tund der X-Koordinate des Schnittpunkts als Zeit . Dieses Ereignis wird dann in dieEreignisstruktur ES eingefugt.

Zur Implementierung der ES konnen wir eine Warteschlange (priority queue) ver-wenden, auf der jede der Operationen FugeEin und NachstesEreignis in Zeit O(log h)ausfuhrbar ist, wobei h die Anzahl der gespeicherten Ereignisse bedeutet (wer mag,kann auch hierfur einen balancierten Binarbaum nehmen).

Ubungsaufgabe 5.6 Kann es vorkommen, daß derselbe Schnittpunkt wahrend dessweep mehrere Male entdeckt wird? (1)

Theorem 8 Mit dem oben angegebenen Sweep-Verfahren kann man die k echtenSchnittpunkte von n Liniensegmenten in Zeit O((n+k) log n) und Speicherplatz O(n+k) bestimmen.

Beweis. Insgesamt gibt es 2n + k Ereignisse. Weil keines von ihnen mehrfach inder Ereignisstruktur vorkommt13, sind niemals mehr als O(n2) Ereignisse in der ESgespeichert; jeder Zugriff auf die ES ist also in Zeit O(log n2) = O(log n) ausfuhrbar.

Die while-Schleife wird 2n + k mal durchlaufen; bei jedem Durchlauf werdenhochstens sieben Operationen auf der SSS oder der ES ausgefuhrt. Daraus folgt dieBehauptung. 2

In Wahrheit ist die Schranke O(n + k) fur den Speicherplatzbedarf der Ereig-nisstruktur zu grob! Zwar konnen fur ein einzelnes Liniensegment n − 1 zukunftige

13Jeder Versuch, ein schon vorhandenes Objekt erneut einzufugen, wird von der Strukturabgewiesen.

Page 17: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 83

Schnittereignisse bekannt sein, an denen das Segment beteiligt ist, aber diese Si-tuation kann nicht fur alle Liniensegmente gleichzeitig eintreten. Pach und Sharir[8] konnten zeigen, daß der Umfang der Ereignisstruktur, und damit der gesamteSpeicherplatzbedarf des oben beschriebenen Sweep-Algorithmus, durch O(n(log n)2)beschrankt ist.

Es gibt aber eine ganz einfache Moglichkeit, den Speicherplatzbedarf der Ereig-nisstruktur zu reduzieren: Man merkt sich nur die Schnittpunkte zwischen solchenLiniensegmenten, die gegenwartig in der SSS benachbart sind; davon kann es zu je-dem Zeitpunkt hochstens n − 1 viele geben. Lemma 6 stellt sicher, daß dabei keinSchnittereignis ubersehen wird: Dicht vor dem Schnittpunkt mussen die beteiligtenSegmente ja benachbart sein!

Ubungsaufgabe 5.7 Was ist zu tun, um diesen Ansatz zu implementieren? (3)

Damit haben wir folgende Verbesserung von Theorem 8:

Theorem 9 Die k echten Schnittpunkte von n Liniensegmenten in der Ebene lassensich in Zeit O((n + k) log n) bestimmen, unter Benutzung von O(n) Speicherplatz.

Die Frage nach der genauen Komplexitat dieses Problems erwies sich als ziemlichschwierig und wurde erst vor kurzem endgultig beantwortet. Chazelle und Edelsbrun-ner [4] gaben 1992 einen Algorithmus an, der die k Schnittpunkte von n Linienseg-menten in optimaler Zeit O(n log n + k) berichtet, allerdings mit SpeicherplatzbedarfO(n + k). Balaban [1] schlug 1995 ein Verfahren vor, bei dem die optimale Laufzeitbei einem Speicherverbrauch von O(n) erreicht werden soll.

Wer sagt eigentlich, daß wir fur den sweep unbedingt eine Gerade verwendenmussen? Konnte man nicht ebensogut einen Kreis von einem Punkt aus expandierenlassen und damit die Ebene ausfegen?

Angenommen, wir wollten mit diesem Ansatz alle Schnittpunkte berichten. Wirwahlen einen Punkt z als Zentrum, der auf keinem Liniensegment liegt, und lassenvon dort aus einen Kreis expandieren. Zuvor werden alle Endpunkte nach ihremAbstand zu z sortiert. Alle Segmente, die vom Kreis geschnitten werden, sind aktiv;wir merken uns ihre Reihenfolge entlang der Kreislinie. Alle Segmente, die ganzim Innern des Kreises liegen, sind tot, die draußen liegenden sind schlafend; sieheAbbildung 5.8.

Auf den ersten Blick konnte man meinen, dieses Verfahren funktioniere genausogutwie der sweep mit einer Geraden. Es tritt hier aber ein Phanomen auf, das eineKomplikation mit sich bringt: Ein Liniensegment kann aktiv werden, bevor der Kreiseinen seiner Endpunkte erreicht hat! Dies wird z. B. fur Segment s in Abbildung 5.8eintreten. Die beiden Teile von s links und rechts vom Auftreffpunkt a sind wiezwei neue Segmente zu behandeln, die zufallig in a ihren gemeinsamen Anfangspunkthaben. Daher genugt es nicht, anfangs nur die Endpunkte der Liniensegmente, nachihrem Abstand zu z sortiert, in die Ereigniswarteschlange einzufugen. Man mußaußerdem fur jedes Segment den ersten Auftreffpunkt des sweep circle bestimmen;wenn es kein Endpunkt ist, gibt auch er zu einem Ereignis Anlaß.

In der Praxis kann die Verwendung eines sweep circle von Vorteil sein, wenn dieZahl der Segmente sehr groß ist und die Schnittpunkte nur fur alle Segmente in einembestimmten Bereich berichtet werden sollen.

Page 18: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

84 KAPITEL 5. DAS SWEEP-VERFAHREN15

z

a

s

Abbildung 5.8: Was passiert, wenn der sweep circle das Segment s erreicht?

Und wie sieht es in hoheren Dimensionen aus? Das Sweep-Verfahren laßt sichnaturlich auch im IRd anwenden. Betrachten wir etwa das Problem closest pair imIR3. Statt der sweep line wird nun eine sweep plane benotigt, die entlang der Z-Achsevorruckt. In der Sweep-Status-Struktur mussen alle Punkte mit Abstand < MinSoFarhinter der sweep plane gespeichert werden. Wann immer ein neuer Punkt r erreichtwird, sind alle Punkte in der SSS zu inspizieren, deren Projektion auf die sweep planein einem Quadrat der Kantenlange 2MinSoFar und Mittelpunkt r liegen. Hierzu wirdeine zweidimensionale dynamische Suchstruktur benotigt, die rechteckige Bereichsan-fragen unterstutzt. Solche Datenstrukturen werden zum Beispiel in Mehlhorn [7] oderKlein [6] behandelt.

Losungen der Ubungsaufgaben

Ubungsaufgabe 5.1 Obwohl dieses Problem zweidimensional aussieht, laßt es sichauf den eindimensionalen Fall reduzieren. Denn auch auf der Sinuskurve konnenzwei Punkte nur dann ein dichtestes Paar bilden, wenn sie benachbart sind; dieseEigenschaft hat die Sinuskurve mit der Geraden gemein.

Zum Beweis dieser Tatsache zeigen wir zunachst: Sind p1 = (x1, sin x1) und p2 =(x2, sin x2) zwei verschiedene Punkte auf der Sinuskurve, so schneidet ihr Bisektor

B(p1, p2) = { q ∈ IR2; |p1q| = |p2q| }

die Sinuskurve genau einmal, und zwar zwischen p1 und p2; siehe Abbildung 5.9.Die Steigung des Liniensegments p1 p2 hat den Betrag

|sin x2 − sin x1

x2 − x1| = | sin′ ξ| = | cos ξ| ≤ 1;

solch ein ξ existiert nach dem Mittelwertsatz der Differentialrechnung. Weil dieseUberlegung fur p1 und beliebige Kurvenpunkte p2 gilt, ist die Sinuskurve in die inAbbildung 5.9 grau dargestellten Winkelbereiche W1 und W2 eingesperrt, die aus denbeiden Nebendiagonalen durch p1 gebildet werden.

Page 19: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 85

W1 W2

p2

p1

B(p1,p2)

sin x

Abbildung 5.9: Der Bisektor B(p1, p2) von zwei Punkten auf der Sinuskurve schneidetsie genau einmal.

Angenommen, p2 liegt rechts von p1. Weil p2 den Bereich W2 nicht verlassen kann,kann der Bisektor B(p1, p2) den Bereich W1 nicht schneiden! Ebensowenig kann erden rechten Winkelbereich an p2 schneiden, der hier nicht eingezeichnet ist.

Alle Kurvenpunkte links von p1 liegen also im Bereich W1, der wiederum in derHalbebene links von B(p1, p2) enthalten ist; sie sind deshalb naher an p1 als an p2.Ebenso liegt jeder Punkt auf der Sinuskurve rechts von p2 naher an p2 als an p1.

Das bedeutet: Ein dichtestes Paar von n Punkten (xi, sin xi) kann nur aus Punktenbestehen, deren x-Koordinaten benachbart sind in der sortierten Reihenfolge

xπ(1) ≤ xπ(2) ≤ . . . ≤ xπ(n).

Wir sortieren also die Punkte pi nach aufsteigenden x-Koordinaten (d. h. nach ih-rer Reihenfolge auf der Sinuskurve) und betrachten in einem sweep alle Paare vonkonsekutiven Punkten. Dafur wird insgesamt O(n log n) Rechenzeit benotigt.

Ubungsaufgabe 5.2 Nach der Initialisierung ist zu jedem Zeitpunkt MinSoFar > 0,denn diese Variable hat stets den Abstand zweier verschiedener Punkte als Wert; derWert nimmt aber monoton ab.

Es folgt, daß immer links ≤ rechts gilt: Nur die Vergroßerung von links im then-Zweig ist kritisch; sie wird aber nur ausgefuhrt, wenn vorher

P [links].x + MinSoFar ≤ P [rechts].x

war, was wegen MinSoFar > 0 fur links = rechts unmoglich ware; also galt vorherlinks < rechts. Außerdem ist leicht zu sehen, daß nach jeder Aktualisierung von linksbzw. rechts diese Indizes zu einem Punkt mit minimaler X-Koordinate in der SSSgehoren bzw. zu einem Punkt mit minimaler X-Koordinate, der nicht in der SSSenthalten ist.

Wir zeigen jetzt durch Induktion uber die Anzahl der Durchlaufe der while-Schleife, daß stets I1 und I2 erfullt sind.

Page 20: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

86 KAPITEL 5. DAS SWEEP-VERFAHREN16

Beim ersten Durchlauf gilt I1 aufgrund der Initialisierung. Falls jetzt der else-Zweig betreten wird, ist rechts = 3, und die SSS enthalt genau P [1] und P [2]. Furbeide Punkte gilt

P [i].x > P [rechts].x − MinSoFar ,

denn weil die Bedingung der while-Schleife falsch ist, haben wir

P [links].x > P [rechts].x − MinSoFar ,

und jeder Punkt P [i] in der SSS hat eine X-Koordinate ≥ P [links].x. Also ist I2

erfullt.Wenn die while-Schleife erneut betreten wird, mussen wir zunachst zeigen, daß

die Invariante I1 gilt. Dazu unterscheiden wir, welcher Zweig beim vorangehendenDurchlauf ausgefuhrt worden ist. War es der then-Zweig, so gilt I1 unverandert. Lagder else-Fall vor, so hat sich die fur I1 relevante Punktmenge um den Punkt P [rechts]vergroßert. Um den Wert von MinSoFar korrekt zu aktualisieren, waren eigentlich dieAbstande von P [rechts] zu allen Punkten mit kleinerem Index zu uberprufen gewesen.Die letzte Anweisung im else-Zweig hat diese Uberprufung nur fur die Punkte in derSSS veranlaßt; das genugt aber, weil nach I2 die SSS zu dem Zeitpunkt alle Punkteenthielt, deren Abstand zu P [rechts] uberhaupt kleiner als MinSoFar sein kann. Auchin diesem Fall gilt also I1 zu Beginn des neuen Schleifendurchlaufs.

Wenn bei diesem Durchlauf der else-Fall eintritt, mussen wir zeigen, daß I2 erfulltist. Mit demselben Argument wie oben gilt

P [i].x > P [rechts].x − MinSoFar

fur alle Punkte P [i] in der SSS . Umgekehrt sei P [i] mit i ≤ rechts − 1 ein Punkt,der diese Ungleichung erfullt. Dann ist er irgendwann in die SSS eingefugt worden.Ware er inzwischen wieder entfernt worden, so hatten fur die damaligen Werte links’ ,rechts’ und MinSoFar’ die Aussagen i = links’ und

P [i].x ≤ P [rechts’ ].x − MinSoFar’

gelten mussen. Hieraus wurde insgesamt der Widerspruch

0 ≤ MinSoFar’ − MinSoFar < P [rechts’ ].x − P [rechts].x ≤ 0

folgen. Also ist P [i] immer noch in der SSS enthalten, und I2 gilt.

Ubungsaufgabe 5.3 Wir wollen zeigen, daß es in einem Rechteck R mit den Kan-tenlangen M und 2M hochstens sechs Punkte geben kann, deren offene Umkreise vomRadius M/2 paarweise disjunkt sind. Dazu wird R in sechs gleich große Rechecke derHohe 2

3M und der Breite M

2geteilt, siehe Abbildung 5.10 (i).

Zwei Punkte in einem Rechteck konnen hochstens so weit voneinander entferntsein wie seine Diagonale lang ist, hier also hochstens√(

2

3M)2

+(

M

2

)2

=5

6M < M

Also kann in jedem der sechs kleinen Rechtecke hochstens ein Kreismittelpunkt sitzen.Eine – im ubrigen auch die einzige! – solche Anordnung sehen wir in Abbildung 5.10(ii).

Page 21: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

5.3. SWEEP IN DER EBENE 87

2M

M

23_ M

M_2

(ii)(i)

Abbildung 5.10: Hochstens sechs Punkte mit gegenseitigem Mindestabstand M lassensich im Rechteck R unterbringen.

Ubungsaufgabe 5.4 Im Initialisierungsschritt werden die n Punkte nach ihren X-und nach ihren Y -Koordinaten sortiert (der Einfachheit halber nehmen wir an, daßkeine zwei Punkte dieselben X- oder Y -Koordinaten haben). Nun beginnt der rekur-sive Hauptteil des Verfahrens. Wir benutzen die X-Sortierung, um die Punktmengedurch eine senkrechte Gerade G in eine linke und eine rechte Halfte, L und R, zu tei-len. Aus dem sortierten Y -Verzeichnis stellen wir zwei nach Y -Koordinaten sortierteVerzeichnisse YL und YR fur die Punkte in L und R her (divide). Nun werden rekursivdie kleinsten Abstande ML und MR in L und R berechnet. Der kleinste Abstand inL ∪ R ist dann das Minimum der beiden Werte

MinSoFar = min(ML, MR)

M = minp∈L,q∈R

|pq|.

Zur Berechnung von M kann man eine Art sweep verwenden: Wir schieben ein an derGeraden G zentriertes achsenparalleles Rechteck B der Hohe MinSoFar und Breite2MinSoFar von oben nach unten uber die Ebene; siehe Abbildung 5.11. Wann immerein neuer Punkt von B uberdeckt wird, bestimmt man die Abstande zwischen ihmund allen Punkten im Rechteck, die auf der anderen Seite von G liegen. WegenUbungsaufgabe 5.3 sind dabei hochstens sechs Vergleiche auszufuhren. Das Minimumaller dieser Werte ist die gesuchte Zahl M . Damit ist der conquer-Schritt beendet.

Divide und conquer benotigen zusammen O(n) Zeit. Insgesamt ergibt sich deshalbeine Laufzeit in O(n log n).

Ubungsaufgabe 5.5 Nein. Zum Beispiel wird in Abbildung 5.12 der Schnittpunktp zuerst entdeckt, aber jedes der beiden beteiligten Segmente hat einen weiter linksgelegenen Schnittpunkt mit einem anderen Segment.

Ubungsaufgabe 5.6 Ja. In Abbildung 5.7 wird zum Beispiel der Schnittpunktzwischen s2 und s3 gleich am Anfang entdeckt und ein weiteres Mal, nachdem s4

gestorben ist.

Page 22: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

88 KAPITEL 5. DAS SWEEP-VERFAHREN17

B

R

G

L

MR

ML

MinSoFar

MinSoFar

MinSoFar

MinSoFar

Abbildung 5.11: Im conquer-Schritt wird das Rechteck B an der Geraden G hinab-geschoben. Der Abstand |pq| ist kleiner als MinSoFar .

p

Abbildung 5.12: Schnittpunkt p wird vom Sweep-Verfahren zuerst entdeckt.

Page 23: Kapitel 5 Das Sweep-Verfahren - Kooperative Systeme · Kapitel 5 Das Sweep-Verfahren 5.1 Einfuhrung¨ In diesem Kapitel geht es um eine der vielseitigsten Techniken der Algorithmischen

Literaturverzeichnis

[1] I. J. Balaban. An optimal algorithm for finding segment intersections. In Proc.11th Annu. ACM Sympos. Comput. Geom., pages 211–219, 1995.

[2] J. L. Bentley. Programming Pearls. Addison-Wesley, Reading, MA, 1985.

[3] J. L. Bentley and T. A. Ottmann. Algorithms for reporting and counting geometricintersections. IEEE Trans. Comput., C-28(9):643–647, Sept. 1979.

[4] B. Chazelle and H. Edelsbrunner. An optimal algorithm for intersecting linesegments in the plane. J. ACM, 39(1):1–54, 1992.

[5] K. Hinrichs, J. Nievergelt, and P. Schorn. Plane-sweep solves the closest pairproblem elegantly. Inform. Process. Lett., 26:255–261, 1988.

[6] R. Klein. Algorithmische Geometrie. Addison-Wesley, Bonn, 1997.

[7] K. Mehlhorn. Data Structures and Algorithms 3: Multi-dimensional Searchingand Computational Geometry, volume 3 of EATCS Monographs on TheoreticalComputer Science. Springer-Verlag, Heidelberg, Germany, 1984.

[8] J. Pach and M. Sharir. On vertical visibility in arrangements of segments and thequeue size in the Bentley-Ottmann line sweeping algorithm. SIAM J. Comput.,20:460–470, 1991.

89