DAP2 Präsenzübung 4

Transcription

DAP2 Präsenzübung 4
SoSe 2015
C. Sohler
J. Flake, A. Krivo²ija
B. Rudak, V.Volz
DAP2 Präsenzübung 4
Besprechung: 06.05.2015 08.05.2015
: (Strassen Matrixmultiplikationsalgorithmus)
In der Vorlesung gibt es Satz 15, dessen Beweis übersprungen wurde. Wir beschäftigen uns hier
damit. Es entspricht dem bekannten Matrixmultiplikationsalgorithmus von V. Strassen.
Satz 15 Zwei n × n Matrizen können mit Hilfe des Teile & Herrsche Verfahrens in O(n )
worst case Laufzeit multipliziert werden.
a) Beschreiben Sie den Algorithmus mit eigenen Wörten und im Pseudocode.
b) Beweisen Sie die Korrektheit dieses Algorithmus.
c) Beweisen Sie, dass die Laufzeit dieses Algorithmus O(n ) ist.
Präsenzaufgabe 4.1
2.81
2.81
Lösung:
a) Wir wissen schon, dass es
(1)
gilt, wenn A, B, C , D, E, F , G und H reelle Zahlen sind. Wir können auch jede Matrix
m × n mit Nullzeilen bzw. Nullspalten so erweitern, dass die Matrix die Dimensionen
2 × 2 ist, wo k = dlog max{m, n}e ist. Die Nullen haben keinen Einuss auf Sum
bzw. Multiplikation den Rest der Matrizen. Deswegen können wir annehmen, dass die
Eingabematrizen Quadratmatrizen sind, wobei die Dimensionen die 2er Potenzen sind.
Seien die Eingabematrizen der Dimension n × n
A B
E F
P =
Q=
,
(2)
C D
G H
wobei die Matrizen A, B, C , D, E, F , G und H die Dimensionen n/2 × n/2 haben. Seien
die Matrizen folgendermaÿen deniert
k
A B
E F
AE + BG AF + BH
·
=
C D
G H
CE + DG CF + DH
k
2
P1
P2
P3
P4
P5
P6
P7
=
=
=
=
=
=
=
A · (F − H)
(A + B) · H
(C + D) · E
D · (G − E)
(A + D) · (E + H)
(B − D) · (G + H)
(A − C) · (E + F )
1
Dann haben wir folgenden Pseudocode
MM(P, Q)
Input: Zwei Matrizen P [1..n, 1..n], Q[1..n, 1..n], deniert wie in (2)
Output: Produkt P · Q
1.
2.
3.
if n = 1 then
return P · Q
else
← M M (A, (F − H))
← M M ((A + B), H)
← M M ((C + D), E)
← M M (D, (G − E))
← M M ((A + D), (E + H))
← M M ((B − D), (G + H))
←M M ((A − C), (E + F ))
P4 + P5 + P6 − P2
P1 + P2
R←
P3 + P4
P 1 + P5 − P3 − P7
return R
P1
P2
P3
P4
P5
P6
P7
4.
5.
6.
7.
8.
9.
10.
11.
12.
b) Wir beweisen die Korrektheit des Algorithmus mittels vollständiger Induktion nach k, wo
n = 2 ist die Dimension der Matrizen P und Q.
IA Wenn k = 0 ist, multiplizieren wir zwei Zahlen und geben diese zurück. Wenn k = 1,
die Korrektheit folgt von der Denition der Matrixmultiplikation (1).
IV Es gelte die Behauptung dass der Algorithmus die Matrixmultiplikation zweier Matrizen der Dimension 2 korrekt berechnet, für beliebiges aber festes k.
IS Seien P und Q der Dimension 2
× 2 . Wir berechnen
k
k
k+1
AE + BG =
=
=
=
AF + BH =
=
CE + DG =
=
CF + DH =
=
=
=
k+1
P4 + P 5 + P6 − P 2
D · (G − E) + (A + D) · (E + H) + (B − D) · (G + H) − (A + B) · H
DG − DE + AE + AH + DE + DH + BG + BH − DG − DH − AH − BH
AE + BG
P1 + P2 = A · (F − H) + (A + B) · H
AF − AH + AH + BH = AF + BH
P3 + P4 = (C + D) · E + D · (G − E)
CE + DE + DG − DE = CE + DG
P1 + P5 − P3 − P 7
A · (F − H) + (A + D) · (E + H) − (C + D) · E − (A − C) · (E + F )
AF − AH + AE + AH + DE + DH − CE − DE − AE − AF + CE + CF
CF + DH
Da die Matrizen A, B, C , D, E, F , G und H der Dimension 2 sind, sind nach der
Induktionsvoraussetzung die Multiplikationen oben korrekt berechnet. Somit ist die
Multiplikation P · Q korrekt berechnet.
k
2
c) Wir haben die Rekursionsgleichung
für k = 1 ,
+ 4 · s · n für k > 1
wenn n = 2 ist. Wir nehmen als bekannt an, dass man zwei Matrizen der Dimensionen
n × n in Laufzeit s · n = O(n ) berechnen kann. Die Abbruchbedingung wird getroen,
wenn k = 1, d.h. wir multiplizieren
die Zahlen wie in (1).
− sn ∈ O(n
) (wir nehmen, oBdA an, dass
Behauptung: T (n) ≤ 12 + s n
n eine 2er Potenz ist). Dann gilt für ein k mit n/2 > 1:
(
12
T (n) =
7·T
n
2
2
k
2
2
16
3
T (n)
=
=
=
(k=log2 n)
=
=
2
log2 7
k
n
n 2 7·T
+ 4sn = 7 · 7 · T 2 + 4s
+ n2
2
2
2
n 7
2
7 · T 2 + · 4sn2 + 4sn2
2
4
n 72
7
73 · T 3 + 2 · 4sn2 + · 4sn2 + 4sn2
2
4
4
k−1
n
X 7 i
k
2
. . . = 7 · T k + 4sn
2
4
i=0
n
=
=
16
3
log2 7
2
(7/4)log2 n − 1
7/4 − 1
16 log2 7 16 2
16
16
log2 7
12n
+ sn
− sn = 12 + s nlog2 7 − sn2
3
3
3
3
log2 7
2.81
O(n
) = O(2 )
7log2 n · T (1) + 4sn2 ·
Beweis:
Für n = 1 ist T (1) = 12 = 12 + s 1 − s · 1 = 12 +
(I.V.) Die Behauptung gelte für ein beliebiges aber festes n .
(I.S.) Betrachte n = 2 · n . Dann gilt
16
3
(I.A.)
log2 7
16
3
2
16
s
3
−
0
0
T (n)
=
(IV)
=
=
=
=
=
2n0
2
7·T
+ 4sn2 = 7 · T (n0 ) + 4s(4n20 )
16
16 2
log2 7
7·
12 + s n0
− sn0 + 16sn20
3
3
16
16
7 · 12 + s 7log2 n0 − 7 · sn20 + 16sn20
3
3
16
4
12 + s 71+log2 n0 − · 16sn20
3
3
16
16
12 + s 7log2 2n0 −
· s · 4n20
3
3
16
16
12 + s nlog2 7 −
· s · n2
3
3
Somit gilt die Behauptung für alle natürlichen Zahlen n.
3
16
s
3
.
=1
: (Teile und Herrsche)
Betrachten Sie das Problem der
.
Gegeben ist ein Array A[1..n] von ganzen Zahlen. Gesucht ist die Länge eines maximalen
Teilarrays A[i..j] mit 1 ≤ i ≤ j ≤ n und der Eigenschaft A[i] < A[i + 1] < . . . < A[j].
a) Bestimmen Sie für das folgende Array eine längste ansteigende, zusammenhängende Teilfolge.
4 -5 -3 -2 5 -2 0 3 2
b) Geben Sie unter Verwendung der
Methode einen rekursiven Algorithmus (in Pseudocode) an, mit dem die Länge des längsten ansteigenden, zusammenhängenden Teilarrays berechnet werden kann.
c) Zeigen Sie die Korrektheit der rekursiven Formulierung des Algorithmus und bestimmen
Sie die asymptotische Worst-Case Komplexität Ihres Algorithmus.
Präsenzaufgabe 4.2
längsten ansteigenden, zusammenhängenden Teilfolge
Teile und Herrsche
Lösung:
1. Die längste ansteigende, zusammenhängende Teilfolge ist −5 − 3 − 2 5.
2. Wir verwenden eine rekursive Hilfsfunktion, die zu einem Array A = [a , a , . . . , a ] ein
Tripel (l , m , r ) von Teilarrays von A liefert, wobei
• l die Länge der längsten ansteigenden, zusammenhängenden Teilfolge von A ist,
die in a beginnt,
• m die Länge einer längsten ansteigenden, zusammenhängenden Teilfolge von A ist,
und
• r die Länge der längsten ansteigenden, zusammenhängenden Teilfolge von A ist,
die in a endet.
Wird ein Array A = [a , a , . . . , a ] zerlegt in die beiden Teilarrays A = [a , a , . . . , a ]
und A = [a , . . . , a ], so gilt, da eine längeres ansteigendes und zusammenhängendes
neues Teilarray nur dann entstehen kann, wenn a ≤ a :
p
A
A
p+1
q
A
A
p
A
A
q
p
00
k+1
p+1
0
q
q
k
(
max {mA0 , mA00 , rA0 + lA00 }
mA =
max {mA0 , mA00 }
(
lA0 + lA00
lA =
lA0
(
rA0 + rA00
rA =
rA00
falls a
sonst
falls a
sonst
k+1
falls a
sonst
k
≤ ak+1
und l
k
≤ ak+1
und r
4
A0
A00
k
≤ ak+1
= length (A0 )
= length (A00 )
p
p+1
k
1.
2.
Mit diesen Vorüberlegungen können wir den Teile-und Herrsche Algorithmus angeben,
der in einer rekursiv denierten Hilfsfunktion LLhilf zum Tragen kommt:
LLISA(A)
Input: Ein Array A[1..n], n ≥ 1, von ganzen Zahlen
Output: Länge eines längsten ansteigenden, zusammenhängenden Teilarrays
(l , m , r ) ← LLhilf (A, 1, n)
A
A
A
â LLhilf (A, 1, n) liefert das Tripel (lA , mA , rA ) als Ergebnis
return mA
( );
Input: Ein Array A[1..n] von ganzen Zahlen, p, q
Output: Tripel (l , m , r ) der Längen längster ansteigender, zusammenhängender
Teilarrays in A[p..q]
LLhilf A, p, q
A
1.
2.
3.
A
A
if p = q then
return (1, 1, 1)
else
8.
c
k ← b p+q
2
(l1 , m1 , r1 ) ← LLhilf A, p, k
(l2 , m2 , r2 ) ← LLhilf A, k + 1, q
if A[k] ≤ A[k + 1] then
m ← max{m1 , m2 , r1 + l2 }
9.
else
4.
5.
6.
7.
(
(
)
)
12.
m ← max{m1 , m2 }
if A[k] ≤ A[k + 1] und l1 = k − p + 1 then
l ← l1 + l2
13.
else
10.
11.
16.
l ← l1
if A[k] ≤ A[k + 1]
r ← r1 + 2 2
17.
else
14.
15.
18.
19.
und
r2 = q − k then
r ← r2
return (l, m, r)
3. Zur Korrektheit:
Wir zeigen, dass LLhilf angewandt auf (A, p, q) ein Tripel (l, m, r) berechnet, so dass
• l die Länge des in p beginnenden längsten ansteigenden, zusammenhängenden Teilarrays von A[p..q] ist,
• m die Länge des längsten ansteigenden, zusammenhängenden Teilarrays von A[p..q]
ist, und
• r die Länge des in q endenden längsten ansteigenden, zusammenhängenden Teilarrays
von A[p..q] ist.
Oensichtlich gilt die Behauptung im Fall p = q, da hier jeweils die Länge 1 als Ergebnis geliefert wird. Im Induktionsschritt ist vorausgesetzt, dass die Behauptung für die
Eingaben (A, p, k) und (A, k + 1, q) gilt. Mit den Vorüberlegungen folgt dann, dass die
Behauptung auch für (A, p, q) gilt.
5
Für die Bestimmung des Berechnungsaufwandes in Abhängigkeit von n = q−p+1 erhalten
wir für LLhilf die folgende Rekursionsgleichung (wir nehmen n als eine Zweierpotenz an):
(
2
falls n = 1
T (n) =
2 · T ( ) + 10 sonst
so dass sich T (n) ∈ O(n) ergibt. Damit wird auch die Länge der längsten ansteigenden,
zusammenhängenden Teilfolge in Zeit O(n) berechnet.
n
2
6