Algorithmen und Datenstrukturen SS 2014 – ¨Ubung 8

Werbung
TU Ilmenau, Fakultät für Informatik und Automatisierung
FG Komplexitätstheorie und Effiziente Algorithmen
Univ.-Prof. Dr. M. Dietzfelbinger, Dipl.-Inf. M. Aumüller, Dipl.-Ing. C. Mattern
http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2014/aud/
Algorithmen und Datenstrukturen SS 2014 – Übung 8
Besprechung: 23. Kalenderwoche (2. Juni – 6. Juni 2014)
Vorbemerkungen: Dieses Übungsblatt behandelt Anwendungsmöglichkeiten des Paradigmas Divideand-Conquer. Wiederholen Sie dafür bitte den allgemeinen Aufbau eines Divide-and-Conquer-Algorithmus (Folie 18, Kapitel 8), und halten Sie sich bei der Aufgabenlösung an das dort vorgestellte Schema. Schätzen Sie die Laufzeit des von Ihnen formulierten Algorithmus in zwei Schritten ab: (i) Geben
Sie eine Rekurrenzungleichung zur Bestimmung der Laufzeit auf Eingaben der Größe n an. (ii) Lösen
Sie diese Rekurrenz entweder durch direktes Ausrechnen oder (im Vorgriff auf die Vorlesung am 2. Juni)
durch Anwendung des Master-Theorems (Folie 67, Kapitel 8). Für die direkte Lösung der Rekurrenz
nutzen Sie bitte vereinfachende Annahmen, z.B., dass n eine Zweierpotenz ist.
Aufgabe 1 (Suche eines Gipfels)
Wir nennen ein Array A[1..n] aus n verschiedenen natürlichen Zahlen unimodal, wenn ein Index i ∈
{1, . . . , n} existiert, so dass A[1..i] aufsteigend und A[i..n] absteigend sortiert ist. Das Element A[i] nennen
wir den Gipfel von A. Geben Sie einen Divide-and-Conquer-Algorithmus an, der folgendes Problem in
Zeit O(log n) löst:
Gipfelbestimmung
Input: Ein unimodales Array A[1..n].
Output: Der Gipfel von A.
Aufgabe 2 (Bestimmung der maximalen Differenz)
Geben Sie einen Divide-and-Conquer-Algorithmus mit Laufzeit O(n log n) für folgendes Problem an:
Maximale Differenz
Input: Ein Array A[1..n] mit n natürlichen Zahlen.
Output: Zwei Indizes i, j, 1 ≤ i ≤ j ≤ n, mit
A[ j] − A[i] = max{A[l] − A[k] | 1 ≤ k ≤ l ≤ n}.
Für besonders Interessierte: Geben Sie einen Algorithmus mit Laufzeit O(n) an. Überprüfen Sie dazu
unter Nutzung des Master-Theorems, 1. Fall, zuerst, welcher Teil- bzw. Kombinieraufwand zu diesem
Ziel führt.
Weiter auf der nächsten Seite!
2
Algorithmen und Datenstrukturen SS 2014 – Übung 8
Aufgabe 3
In dieser Aufgabe entwickeln wir einen Algorithmus für das folgende Problem:
Dichtestes Punktepaar
Input: Eine Menge von Punkten P = {p1 = (x1 , y1 ), . . . , pn = (xn , yn )} aus dem R2 .
Output: Ein Paar (pi , p j ) von Punkten mit i 6= j, das die euklidische Distanz
q
d(pi , p j ) = (xi − x j )2 + (yi − y j )2
unter allen möglichen Punktepaaren minimiert.
Die in der Punktemenge vorkommenden x- bzw. y-Koordinaten sind paarweise verschieden.
Der Divide-and-Conquer-Ansatz auf Input P arbeitet nun wie folgt: Falls P klein genug ist, bestimme
ein Paar dichtester Punkte naiv. Ansonsten, teile die Punkte gemäß ihrer x-Koordinate in zwei etwa
gleichgroße Mengen L und R. Bestimme rekursiv ein Paar dichtester Punkte (pL , qL ) in L und (pR , qR )
in R. Sei δ = min(d(pL , qL ), d(pR , qR )). Sei S = {(x, y) ∈ P | |x − x∗ | ≤ δ }. Sei Sy die Folge von Punkten
aus S nach y-Wert aufsteigend sortiert. Betrachte nun jeden Punkt in Sy und bestimme seine Distanz zu
den nächsten fünfzehn (!) Punkten in Sy . Sei (pS , qS ) das auf diese Weise gefundene Punktepaar mit
minimaler Distanz. Die Rückgabe ist ein dichtestes Punktepaar in {(pL , qL ), (pR , qR ), (pS , qS )}.
Zur Veranschaulichung ist der Rekursionsschritt in folgendem Bild visualisiert (L besteht aus den schwarzen Punkten; R besteht aus den weißen Punkten):
pR
δ
pL
qL
qR
−δ
+δ
x∗
x
Lösen Sie nun die folgenden Teilaufgaben:
1. Formulieren Sie den Algorithmus in Pseudocode! Gehen Sie dabei insbesondere darauf ein, wie die
Mengen L, R, und S (effizient) bestimmt werden.
Tipp: Sortieren Sie die Punktmenge P vor dem ersten Aufruf aufsteigend nach x- und nach y-Koordinate.
Die rekursive Prozedur erwartet dann drei Parameter P, Px , Py , wobei Px [Py ] die Folge von Punkten
aus P nach x-Koordinate [y-Koordinate] aufsteigend sortiert ist.
2. Geben Sie eine Rekurrenzungleichung zur Laufzeitbestimmung an und lösen Sie diese!
3. Beweisen Sie die Korrektheit des Algorithmus! Dafür ist es ausreichend, die Korrektheit der nachfolgenden beiden Lemmata zu zeigen:
Lemma 1. Falls zwei Punkte p ∈ L und q ∈ R mit d(p, q) < δ existieren, so gilt p, q ∈ S.
Lemma 2. Falls zwei Punkte p, q ∈ S mit d(p, q) < δ existieren, so liegen diese in Sy höchstens 15
Positionen voneinander entfernt.
Tipp zum Beweis von Lemma 2: Teilen Sie den vertikalen Streifen (x, y) ∈ R2 | |x − x∗ | ≤ δ in
Quadrate mit Kantenlänge δ /2 ein.
Herunterladen