Muster Präs. 03

Transcription

Muster Präs. 03
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