SoSe 2015 C. Sohler J. Flake, A. Krivo²ija R. Penninger, B. Rudak, V.Volz DAP2 Präsenzübung 3 Besprechung: 29.04.2015 30.04.2015 Präsenzaufgabe 3.1: (Rekursionsgleichung) Gegeben sei die Rekursionsgleichung: ( 1 T (n) = 2·T n 4 +3·n für n = 1 für n > 1 Bestimmen Sie eine asymptotische obere Schranke für T (n) und beweisen Sie sie mittels vollständiger Induktion. Sie dürfen annehmen, dass n von der Form 4k für ein k ∈ N ist. Sie dürfen dazu nicht das Master-Theorem verwenden. Lösung: √ Behauptung: T (n) = 6n − 5 n = O(n) (wir nehmen an, dass n eine 4er Potenz ist). n T (n) = 2 · T + 3n n 4 n n n 2 + 3n = 2 · T 2 + 3 · + 3n = 2· 2·T 2 +3· 4 4 2 n 4 n n n 3 = 2 ·T 3 +3· 2 +3· 1 +3· 0 4 2 2 2 k−1 n X 1 = . . . = 2k · T k + 3n 4 2i i=0 für alle k , so dass n > 4k . Wenn k = log4 n, gilt weiter: log4 n−1 log4 n T (n) = 2 · T (1) + 3n X i=0 = √ 1 n + 6n · 1 − √ n 1 − 2log14 n 1 1 2 · 1 + 3n · = n 2i 1 − 12 √ = 6n − 5 n = O(n) Die bisherige Analyse ist eher ein intuitives, schlaues Erraten der Lösung. Die Behauptung ist mittels vollständiger Induktion zu beweisen: Beweis: (I.A.) Für n = 1 ist T (n) = 1 = 6 · 1 − 5 · √ 1 = 1. 1 (I.V.) Die Behauptung gelte für ein beliebiges, aber festes n0 . (I.S.) Betrachte n = 4n0 (die nächste 4er Potenz). Dann gilt T (n) = (IV) = = 2·T 4n0 4 + 3n = 2 · T (n0 ) + 3 · 4n0 √ 2 · (6n0 − 5 n0 ) + 12n0 = √ √ √ 24n0 − 5 · 2 n0 = 6 · 4n0 − 5 · 4n0 = 6n − 5 n. Damit folgt dass die Behauptung für allen natürlichen Zahlen n gilt. Präsenzaufgabe 3.2: (Teile und Herrsche) Gegeben sei ein Array A[1 . . . n] über einem Datentyp, für den keine Ordnung seiner Elemente vorliegt. Wohl aber ist ein Vergleich A[i] = A[j] in konstanter Zeit möglich. Ein solches Array A[1 . . . n] besitzt nun ein majorisierendes Element, falls mehr als die Hälfte seiner Elemente denselben Wert besitzt. a) Geben Sie einen Teile-und-Herrsche Algorithmus in Pseudocode an, der in O(n · log n) Laufzeit feststellt, ob in einem Array A[1 . . . n] ein majorisierendes Element vorhanden ist und, falls dies der Fall ist, dieses auch ausgibt. b) Analysieren Sie die Laufzeit Ihres Algorithmus und beweisen Sie die Laufzeitschranke mittels vollständiger Induktion. c) Beweisen Sie die Korrektheit Ihres Algorithmus. Lösung: a) Pseudocode Hauptidee ist: ist a ein majorisierendes Element des Arrays A und splittet man A in zwei Hälften, so muss a auch majorisierendes Element mindestens einer der beiden Hälften sein. Findet der Algorithmus in den Zeilen 4 und 5 nach dem rekursiven Aufruf für die beiden Teilprobleme ein Element b, das ein majorisierendes Element sowohl der einen wie auch der anderen Hälfte ist, dann ist b auch majorisierendes Element von A. Ist b nur majorisierendes Element der einen Hälfte, so muss durch einfaches Zählen seines Vorkommens geprüft werden, ob es tatsächlich ein majorisierendes Element von A ist. 2 ME(A[1..n]): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // Eingabe: Array A // Ausgabe: majorisierendes Element if n = 1 then return A[1] k ← b n2 c; majl = M E(A[1..k]); majr = M E(A[k + 1..n]); if majl = majr then return majl lz ← Anzahl Vorkommen von majl in A[1..n]; rz ← Anzahl Vorkommen von majr in A[1..n]; if lz ≥ k + 1 then return majl if rz ≥ k + 1 then return majr return kein majorisierendes Element vorhanden; b) Laufzeitanalyse Für die Laufzeitanalyse sieht man, dass die benötigte Laufzeit T (n) wenn n = 1 gleich T (n) = 2 ist (Zeilen 1 und 2). Wenn n > 1 ist, hat man n + 2 · c1 · n + c2 T (n) = 2 · T 2 wobei 2 · c1 · n ist die Laufzeit der Zeilen 8 und 9, und c2 ist die Laufzeit der Zeilen 6, 7 und 10-14. Sei eine Konstante c > 0 ausgewählt, so dass 2 · c1 · n + c2 ≤ c · n ist. Insgesamt haben wir die Gleichung ( 2 für n = 1 T (n) = 2 · T n2 + c · n für n > 1 Wir lösen diese Gleichung mit der Annahme dass n von der Form 2k ist. n T (n) = 2 · T + cn 2 n n n = 2· 2·T 2 +c· + cn = 22 · T 2 + 2cn 2 n 2 n3 3 k = 2 · T 3 + 3 · c · n = ... = 2 · T k + k · c · n 2 2 für alle k , so dass n > 2k . Wenn k = log2 n, gilt weiter: T (n) ≤ 2log2 n · T (1) + c · n · log2 n = 2n + cn log2 n = O(n log n) Die Behauptung, dass T (n) ≤ 2n + cn log2 n ist, ist mittels vollständiger Induktion zu beweisen: Beweis: 3 (I.A.) Für n = 1 ist T (n) = 2 ≤ 2 · 1 + c · 1 · log2 1 = 2. (I.V.) Die Behauptung gelte für ein beliebiges, aber festes n0 . (I.S.) Betrachte n = 2n0 (die nächste 2er Potenz). Dann gilt T (n) = (IV) 2·T 2n0 2 + cn = 2 · T (n0 ) + cn n ≤ 2 · (2n0 + cn0 log2 n0 ) + cn = 2n + cn log2 = 2n + cn · (log2 n − 1 + 1) = 2n + cn log2 n. 2 + cn Damit folgt dass die Behauptung für allen natürlichen Zahlen n gilt. c) Korrektheitsbeweis Wir beweisen die Korrektheit unseres Algorithmus mittels vollständiger Induktion. Behauptung: Der Algorithmus ME(A[1..n]) berechnet das majorisierende Element (wenn vorhanden) für das Array A der Länge n, wenn n eine beliebige natürliche Zahl n ist. (I.A.) Wenn n = 1 ist, ist das einzige Element gleichzeitig das majorisierende Element. Das wird in der Zeile 2 korrekt zurückgegeben. (I.V.) Die Behauptung gelte für alle natürliche Zahlen 1, 2, . . . , n0 , wobei n0 beliebige natürliche Zahl ist. aber fest ausgewhlte (I.S.) Sei n = n0 + 1 > 1. Dann ist die Bedingung in der Zeile 1 falsch. In den Zeilen 4 und 5 wird der Algorithmus zweimal aufgerufen, mit Arrays der Länge k = b n2 c und n − k = n − b n2 c als Argument. Da 1 ≤ k ≤ n0 < n und 1 ≤ n − k ≤ n0 < n ist, sind nach der Induktionsvoraussetzung majl und majr die korrekt gefundene majorisierende Elemente von Subarrays A[1..k] und A[k + 1..n] (wenn vorhanden). Wenn majl = majr ist, ist dann dieses Element auch ein majorisierendes Element von ganzen Array A[1..n], was in der Zeile 7 zurückgegeben wird (als mindestens die Hälfte von Elemente in beiden Subarrays gleich majl ist, somit auch mindestens die Hälfte von Elemente von A[1..n]). Wenn nicht, dann zählen wir mit Variablen lz und rz , wie oft kommen die Elemente majl und majr im ganzen Array A[1..n] vor (Zeilen 8 und 9). Wenn eine von diesen zwei Variablen gröÿer als die Hälfte von n ist, ist dieses Element das gesuchte majorisierende Element, sonst gibt es kein solches Element (Zeilen 10-14). Damit wurde es gezeigt, dass auch für n = n0 + 1 der Algorithmus ME(A[1..n]) korrekt das majorisierende Element berechnet. Somit gilt die Behauptung für alle natürliche Zahlen n ∈ N. 4
© Copyright 2024