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.