Divide & Conquer Teile & Herrsche: • Problem in Teilprobleme aufteilen • Teilprobleme rekursiv lösen • Lösung aus Teillösungen zusammensetzen Probleme: • Wie setzt man zusammen? [erfordert algorithmisches Geschick und Übung] • Laufzeitanalyse (Auflösen der Rekursion) [ist normalerweise nach Standardschema; erfordert ebenfalls Übung] SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 1 Divide & Conquer Teile & Herrsche: • Problem in Teilprobleme aufteilen • Teilprobleme rekursiv lösen • Lösung aus Teillösungen zusammensetzen Algorithmen: • Merge Sort • Quick Sort SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 2 Matrix Multiplikation 3 7 5 4 2 1 1 0 0 3 10 2 1 0 2 1 1 4 0 0 0 3 2 0 1 3 1 1 2 3 0 2 SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer = 3 Matrix Multiplikation 3 7 5 4 2 1 1 0 29 20 23 29 0 3 10 2 1 0 2 1 1 4 0 0 0 3 2 0 1 3 1 1 2 3 0 2 14 14 … … … SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer = 4 Matrix Multiplikation Teile & Herrsche: • Problem: Berechne das Produkt zweier n×n Matrizen • Eingabe: Matrizen X,Y • Ausgabe: Matrix Z = X⋅Y x1,1 x 2,1 X= x 3,1 x 4,1 SS 2008 x1,2 x 2,2 x 3,2 x 4,2 x1,3 x 2,3 x 3,3 x 4,3 x1,4 y1,1 x 2,4 y 2,1 , Y= y 3,1 x 3,4 y x 4,4 4,1 Datenstrukturen und Algorithmen 17. Divide & Conquer y1,2 y 2,2 y 3,2 y 4,2 y1,3 y 2,3 y 3,3 y 4,3 y1,4 y 2,4 y 3,4 y 4,4 5 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 6 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) 7 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) 8 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) 9 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) Θ(n²) 10 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) Θ(n²) Θ(n³) 11 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) Θ(n²) Θ(n³) Θ(n 3 ) 12 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) Θ(n²) Θ(n³) Θ(n 3 ) Θ(1) 13 Matrix Multiplikation MatrixMultiplikation(Array X, Y, n) 1. new array Z[1,..,n][1,..,n] 2. for i←1 to n do 3. for j ← 1 to n do 4. Z[i][j] ← 0 5. for k ←1 to n do 6. Z[i][j] ← Z[i][j] + X[i][k] ⋅ Y[k][j] 7. return Z SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer Laufzeit: Θ(n²) Θ(n) Θ(n²) Θ(n²) Θ(n³) Θ(n 3 ) Θ(1) Θ(n³) 14 Matrix Multiplikation Teile und Herrsche: A B E F AE + BG AF + BH × = C D G H CE + DG CF + DH Aufwand: • 8 Multiplikationen von n/2×n/2 Matrizen • 4 Additionen von n/2×n/2 Matrizen SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 15 Matrix Multiplikation Teile und Herrsche: A B E F AE + BG AF + BH × = C D G H CE + DG CF + DH Aufwand: • 8 Multiplikationen von n/2×n/2 Matrizen • 4 Additionen von n/2×n/2 Matrizen Laufzeit: • T(n) = 8⋅T(n/2) + Θ(n²) SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 16 Matrix Multiplikation Laufzeit: • T(n) = 8 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 17 Matrix Multiplikation Laufzeit: • T(n) = 8 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² • Fall 1: Laufzeit Θ(n SS 2008 log a b ) = Θ(n³) Datenstrukturen und Algorithmen 17. Divide & Conquer 18 Matrix Multiplikation Laufzeit: • T(n) = 8 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² log a b • Fall 1: Laufzeit Θ(n ) = Θ(n³) • Formaler Beweis durch Induktion!! SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 19 Matrix Multiplikation Laufzeit: • T(n) = 8 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² log a b • Fall 1: Laufzeit Θ(n ) = Θ(n³) • Formaler Beweis durch Induktion!! • Nicht besser als einfacher Algorithmus SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 20 Matrix Multiplikation Teile und Herrsche (Algorithmus von Strassen): A B E F AE + BG AF + BH × = C D G H CE + DG CF + DH Trick: P1 = A⋅(F-H) P2 = (A+B)⋅H P3 = (C+D)⋅E P4 = D⋅(G-E) SS 2008 P5 = (A+D)⋅(E+H) P6 = (B-D)⋅(G+H) P7 = (A-C)⋅(E+F) Datenstrukturen und Algorithmen 17. Divide & Conquer 21 Matrix Multiplikation Teile und Herrsche (Algorithmus von Strassen): A B E F AE + BG AF + BH × = C D G H CE + DG CF + DH Trick: P1 = A⋅(F-H) P2 = (A+B)⋅H P3 = (C+D)⋅E P4 = D⋅(G-E) SS 2008 P5 = (A+D)⋅(E+H) AE+BG = P5 + P4 - P2 + P6 P6 = (B-D)⋅(G+H) AF+BH = P1 + P2 P7 = (A-C)⋅(E+F) CE+DG = P3 + P4 CF+DH = P5+ P1 - P3 - P7 Datenstrukturen und Algorithmen 17. Divide & Conquer 22 Matrix Multiplikation Teile und Herrsche: A B E F AE + BG AF + BH × = C D G H CE + DG CF + DH Trick: P1 = A⋅(F-H) P2 = (A+B)⋅H P3 = (C+D)⋅E P4 = D⋅(G-E) SS 2008 P5 = (A+D)⋅(E+H) AE+BG = P5 + P4 - P2 + P6 P6 = (B-D)⋅(G+H) AF+BH = P1 + P2 P7 = (A-C)⋅(E+F) CE+DG = P3 + P4 CF+DH = P5+ P1 - P3 - P7 7 Multiplikationen!!! 23 Datenstrukturen und Algorithmen 17. Divide & Conquer 23 Matrix Multiplikation Laufzeit: • T(n) = 7 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 24 Matrix Multiplikation Laufzeit: • T(n) = 7 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² • Fall 1: Laufzeit Θ(n SS 2008 log a b ) Datenstrukturen und Algorithmen 17. Divide & Conquer 25 Matrix Multiplikation Laufzeit: • T(n) = 7 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² • Fall 1: Laufzeit Θ(n SS 2008 log a b )=Θ(n log 7 2 ) Datenstrukturen und Algorithmen 17. Divide & Conquer 26 Matrix Multiplikation Laufzeit: • T(n) = 7 ⋅ T(n/2) + k⋅n² a f(n) b Master Theorem: • f(n) = k ⋅ n² log a b log 7 2 2,81 • Fall 1: Laufzeit Θ(n )=Θ(n ) = Θ(n ) • Verbesserter Algorithmus! (Erheblicher Unterschied für große Eingaben) SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 27 Matrix Multiplikation Satz 17.1 Das Produkt zweier n×n Matrizen kann in Θ(n berechnet werden. SS 2008 Datenstrukturen und Algorithmen 17. Divide & Conquer 2,81 ) Laufzeit 28