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
© Copyright 2024