• Keine Ergebnisse gefunden

Nächste Paare

N/A
N/A
Protected

Academic year: 2022

Aktie "Nächste Paare"

Copied!
66
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Datenstrukturen und Algorithmen

Christian Sohler

(2)

Nächste Paare

Geometrisches Problem:

• Problem: Nächstes Paar

• Eingabe: n Punkte in der Ebene

• Ausgabe: Das Paar q,r mit geringstem Abstand

Beispiel:

(3)

Nächste Paare

Geometrisches Problem:

• Problem: Nächstes Paar

• Eingabe: n Punkte in der Ebene

• Ausgabe: Das Paar q,r mit geringstem Abstand

Beispiel:

(4)

Nächste Paare

Notation:

• d(q,r) bezeichnet Abstand zwischen q und r

(5)

Nächste Paare

Notation:

• d(q,r) bezeichnet Abstand zwischen q und r

q

r d(q,r)

(6)

Nächste Paare

Plan für 2D:

• Wie MergeSort nur im 2D

(7)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

(8)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

Q R

(9)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

Q R

q*1 q*2

r*1 r*2

(10)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

Q R

q*1 q*2

r*1 r*2

(11)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

Wir wissen:

(q*,q*) ist nächstes Paar in Q.

1 2

Q

q*1 q*2

(12)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

r* r*

1 2

R

Wir wissen:

(r*,r*) ist nächstes Paar in R.

1 2

(13)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

q*1 q*2

r*1 r*2

Q R

Wir wissen nicht:

Gibt es Paare (q,r) mit q∈Q und r∈R, die nah beieinander

liegen?

?

(14)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

q*1 q*2

r*1 r*2

Q R

Wir wissen nicht:

Gibt es Paare (q,r) mit q∈Q und r∈R, die nah beieinander

liegen?

?

(15)

Nächste Paare

Plan:

• Wie MergeSort nur im 2D

• Sortiere Punktmenge nach x-Koordinate

• Teile in der Mitte

• Löse rekursiv

• Füge zusammen

q*1 q*2

r*1 r*2

Q R

Wir wissen nicht:

Gibt es Paare (q,r) mit q∈Q und r∈R, die nah beieinander

liegen?

?

(16)

Nächste Paare

Definition:

δ = min{d(q*, q* ), d(r*, r* )}

q*

q*

r* r*

1

1 2

2

Q R

δ 2

1 1 2

(17)

Nächste Paare

Wichtige Beobachtung:

Sind q,r∈Q, dann gilt d(p,r)≥ δ.

Sind q,r∈R, dann gild d(p,r)≥ δ.

Q R

q*

q*

1

2

r* r*

1 2 δ

(18)

Nächste Paare

Lemma 7

Gibt es q∈Q und r∈R mit d(q,r) < δ, dann sind sowohl q als auch r höchstens δ von L entfernt.

Q R

q*

q*

1

2

r* r*

1 2 δ

(19)

Nächste Paare

Lemma 7

Gibt es q∈Q und r∈R mit d(q,r) < δ, dann sind sowohl q als auch r höchstens δ von L entfernt.

δ δ

Q R

q*

q*

1

2

r* r*

1 2 δ

(20)

Nächste Paare

Was gewinnen wir?

• Alle Punkte können nahe an L liegen

δ δ

Q R

q*

q*

1

2

r* r*

1 2 δ

(21)

Nächste Paare

Abhilfe:

• Wir wollen nur Paare (q,r) testen, wenn (a) q und r nah an L liegen und

(b) q und r kleinen Abstand in y-Richtung haben

Q R

q*

q*

1

2

r* r*

1 2 δ

(22)

Nächste Paare

Idee:

• Sortiere nahe Punkte nach y-Koordinate

• Zeige: Liegen in dieser Sortierung mehr als c Punkte

zwischen q und r, dann kann (q,r) nicht nächstes Paar sein

q*

q*

1

2

r* r*

1 2 δ

(23)

Nächste Paare

Idee:

• Sortiere nahe Punkte nach y-Koordinate

• Zeige: Liegen in dieser Sortierung mehr als c Punkte

zwischen q und r, dann kann (q,r) nicht nächstes Paar sein

r* r*

1 2 δ q

c Punkte dazwischen:

q*

q*

1

2

(24)

Nächste Paare

Idee:

• Sortiere nahe Punkte nach y-Koordinate

• Zeige: Liegen in dieser Sortierung mehr als c Punkte

zwischen q und r, dann kann (q,r) nicht nächstes Paar sein

r* r*

1 2 δ q

c Punkte dazwischen:

Wir brauchen (q,r) nicht testen q*

q*

1

2

(25)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

q*

q*

1

2

r* r*

1 2 δ

(26)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Teile Nahbereich in Quadrate der Seitenlänge δ/2 auf

Beh.: In jedem Quadrat ist nur ein Punkt. δ/2

δ/2

L

(27)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Teile Nahbereich in Quadrate der Seitenlänge δ/2 auf

Beh.: In jedem Quadrat ist nur ein Punkt.

Beweis:

• Annahme: Zwei Punkte q,r in

δ/2 δ/2

L

(28)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Teile Nahbereich in Quadrate der Seitenlänge δ/2 auf

Beh.: In jedem Quadrat ist nur ein Punkt.

Beweis:

• Annahme: Zwei Punkte q,r in

δ/2 δ/2

L

(29)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Teile Nahbereich in Quadrate der Seitenlänge δ/2 auf

Beh.: In jedem Quadrat ist nur ein Punkt.

Beweis:

• Annahme: Zwei Punkte q,r in

δ/2 δ/2

L

(30)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Seien mind. 15 Punkte zwischen q und r

δ/2 δ/2

L

(31)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Seien mind. 15 Punkte zwischen q und r

δ/2 δ/2

L

Zwischen den beiden roten Punkten liegen

15 andere Punkte

(32)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Seien mind. 15 Punkte zwischen q und r

• Dann sind mindestens 3 Reihen

Quadrate zwischen q,r, weil in jedem

Quadrat höchstens ein Punkt ist δ/2 δ/2

L

(33)

Nächste Paare

Lemma 8

Liegen in der Sortierung mindestens 15 Punkte zwischen q und r, dann ist d(q,r) >δ.

Beweis:

• Seien mind. 15 Punkte zwischen q und r

• Dann sind mindestens 3 Reihen

Quadrate zwischen q,r, weil in jedem Quadrat höchstens ein Punkt ist

• Dann muss d(q,r) mindestens

δ/2 δ/2

L

(34)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

(35)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

Q L R

(36)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

Q L R

(37)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

• Sortiere Punkte mit Abstand zu L höchstens δ nach y-Koord.

L δ δ

Q δ R

(38)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

• Sortiere Punkte mit Abstand zu L höchstens δ nach y-Koord.

• Teste alle Paare, deren Abstand in der Sortierung kleiner als 16 ist

Q δ L R

δ δ

(39)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

• Sortiere Punkte mit Abstand zu L höchstens δ nach y-Koord.

• Teste alle Paare, deren Abstand in der Sortierung kleiner als 16 ist

Q δ L R

δ δ

(40)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

• Sortiere Punkte mit Abstand zu L höchstens δ nach y-Koord.

• Teste alle Paare, deren Abstand in der Sortierung kleiner als 16 ist

Q δ L R

δ δ

(41)

Nächste Paare

Der Algorithmus im Überblick:

• Teile Punktmenge an Linie L in Q und R auf

• Löse Problem rekursiv auf Q und R

• Sortiere Punkte mit Abstand zu L höchstens δ nach y-Koord.

• Teste alle Paare, deren Abstand in der Sortierung kleiner als 16 ist

Q δ L R

δ δ

(42)

Nächste Paare

NächstesPaar(P)

1. MergeSort(P, a, length[P]) ¾ Sortiere nach x-Koordinate 2. return NächstesPaarRec(P,1,length[P])

(43)

Nächste Paare

NächstesPaar(P)

1. MergeSort(P, a, length[P]) Θ(n log n) 2. return NächstesPaarRec(P,1,length[P])

(44)

Nächste Paare

NächstesPaar(P)

1. MergeSort(P, a, length[P]) Θ(n log n) 2. return NächstesPaarRec(P,1,length[P]) T(n)+Θ(1)

n=length[P]

(45)

Nächste Paare

NächstesPaar(P)

1. MergeSort(P, a, length[P]) Θ(n log n) 2. return NächstesPaarRec(P,1,length[P]) T(n)+Θ(1)

T(n) + Θ(n log n)

(46)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

(47)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

Rekursionsabbruch bei 2 oder 3 Punkten

(48)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

Berechnung des mittleren Elements

(Median)

(49)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

Rekursiver Aufruf für linke Hälfte

(50)

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

Nächste Paare

Rekursiver Aufruf für rechte Hälfte

(51)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

(52)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c) 7. ¾ Zusammensetzen

Θ(1)

(53)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) 6. (r*, r*) ←NächstesPaar(P, b+1, c)

7. ¾ Zusammensetzen

Θ(1) Θ(1)

(54)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) T(n/2) 6. (r*, r*) ←NächstesPaar(P, b+1, c) T(n/2)

7. ¾ Zusammensetzen

n=c-a

Θ(1) Θ(1)

(55)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) T(n/2) 6. (r*, r*) ←NächstesPaar(P, b+1, c) T(n/2)

7. ¾ Zusammensetzen Θ(n log n) Θ(1) Θ(1)

(56)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) T(n/2) 6. (r*, r*) ←NächstesPaar(P, b+1, c) T(n/2)

7. ¾ Zusammensetzen Θ(n log n) Θ(1) Θ(1)

2 T(n/2) +Θ(n log n)

(57)

Nächste Paare

NächstesPaarRec(P,a,c)

1. if b-a=1 then return (P[a],P[a+1])

2. if b-a=2 then return nächstes Paar aus

(P[a],P[a+1]), (P[a],P[a+2]), (P[a+1], P[a+2]) 4. b ←⎣(a+c)/2⎦

5. (q*, q*) ← NächstesPaar(P, a, b) T(n/2) 6. (r*, r*) ←NächstesPaar(P, b+1, c) T(n/2)

7. ¾ Zusammensetzen Θ(n log n) Θ(1) Θ(1)

2 T(n/2) +Θ(n log n)

(58)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

(59)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

Alle Punkte mit Abstand höchstens δ

zu L werden nach R kopiert

(60)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

R wird nach y-Koordinate sortiert

(61)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

(q,r) wird mit initialisiert (hier kann

man jedes beliebige Paar verwenden)

(62)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

Für alle Punkte aus R teste, ob sie zusammen

mit einem ihrer 15 Nachfolger ein besseres

Paar bilden als das bislang gemerkte

(63)

Nächste Paare

Zusammensetzen

1. k=0

2. for i←a to c do

3. if d(P[i],L) < min{d(q*,q*),d(r*,r*)} then 4. k←k+1; R[k]←P[a]

5. MergeSort(R,1,k) ¾ Sortiere nach y-Koordinate 6. (q,r)← (P[a], P[a+1])

7. for i←1 to k do

8. for j←1 to 15 do 9. if i+j ≤ k then

Gib das beste gefundene Paar

zurück

(64)

Nächste Paare

Laufzeit:

• T(n) = 2 ⋅ T(n/2) + Θ(n log n)

• T(n) = O(n log²n) [Substitutionsmethode]

Satz 9

Das nächste Paar von n Punkten in der Ebene kann in O(n log²n) Zeit berechnet werden.

Hinweis:

(65)

Zusammenfassung

Teile & Herrsche:

• Problem in Teilprobleme aufteilen

• Teilprobleme rekursiv lösen

• Lösung aus Teillösungen zusammensetzen

Probleme:

• Wie setzt man zusammen?

[erfordert algorithmisches Geschick und Übung]

(66)

Zusammenfassung

Teile & Herrsche:

• Problem in Teilprobleme aufteilen

• Teilprobleme rekursiv lösen

• Lösung aus Teillösungen zusammensetzen

Algorithmen:

• MergeSort

• Binäre Suche

Referenzen