17 Dynamic Programming Matrix Chain Multiplication No Pause
17 Dynamic Programming Matrix Chain Multiplication No Pause
Chain Parenthesization
COMS10007 - Algorithms
Problem: Matrix-Multiplication
1 Input: Matrices A, B with A.columns = B.rows
2 Output: Matrix product A × B
Example:
q r
2 3 r 6 2 4
1 0 q 0 1 2
0 1 2
2 6 × 2 0 0 = 12
p 4 p
2
0 9 18 0 0
Runtime:
Three nested loops: O(A.rows · B.columns · A.columns)
Number of Multiplications: A.rows · B.columns · A.columns
Multiplying two n × n matrices: runtime O(n3 )
Dr. Christian Konrad Lecture 17/18: Matrix Chain Parenthesization 3 / 18
Background: Faster Matrix Multiplication
Important Problem:
Problem: Matrix-Chain-Multiplication
1 Input: A sequence (chain) of n matrices A1 , A2 , A3 , . . . , An
2 Output: The product A1 × A2 × A3 × · · · × An
Discussion:
Ai .columns = Ai+1 .rows for every 1 ≤ i < n
Assume Ai has dimension pi−1 × pi , for vector p[0 . . . n]
Matrix product is associative:
(A1 × A2 ) × A3 = A1 × (A2 × A3 )
A1 : 10 × 100 A2 : 100 × 5 A3 : 5 × 50
Computation of (A1 × A2 ) × A3 :
A1 × A2 = A12 requires 10 · 100 · 5 = 5000 multiplications
A12 × A3 requires 10 · 5 · 50 = 2500 multiplications
Total: 7500 multiplications
Computation of A1 × (A2 × A3 ):
A2 × A3 = A23 requires 100 · 5 · 50 = 25000 multiplications
A1 × A23 requires 10 · 100 · 50 = 50000 multiplications
Total: 75000 multiplications
Dr. Christian Konrad Lecture 17/18: Matrix Chain Parenthesization 6 / 18
The Matrix-Chain-Parenthesization Problem
Problem: Matrix-Chain-Parenthesization
1 Input: A sequence (chain) of n matrices A , A , A , . . . , A
1 2 3 n
2 Output: A parenthesization of A × A × A × · · · × A that
1 2 3 n
minimizes the number of scalar multiplications
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, . . .
(
0 if i = j ,
m[i, j] =
mini≤k<j {m[i, k] + m[k + 1, j] + pi−1 pk pj } if i < j .
Algorithmic Considerations:
As in Pole-Cutting, we could implement this recursive
formula directly. → exponential runtime
Instead, we compute the table m[i, j] bottom up
Observe that there are less than n2 subproblems m[i, j] (i and
j take values in {1, . . . , n})
We will see that computing one value m[i, j] takes O(n) time
This yields an O(n3 ) time algorithm
Useful Formula:
b
X
1=b−a+1
i=a
n n−l+1
X X i+l−2
X n n−l+1
X X i+l−2
X
O(1) = O(1) · 1
l=2 i=1 k=1 l=2 i=1 k=1
Xn X
n Xn Xn Xn n X
X n
≤ O(1) · 1 = O(1) · n = O(1) · n 1
l=1 i=1 k=1 l=1 i=1 l=1 i=1
Xn n
X
= O(1) · n n = O(1) · n2 1 = O(1) · n2 · n = O(1)n3
l=1 l=1
3
= O(n ) .
1 2 3 4
1
2
3
4
for i ← 1 . . . n do
m[i, i] ← 0
1 2 3 4
1 0
2 0
3 0
4 0
for i ← 1 . . . n do
m[i, i] ← 0
1 2 3 4
1 0
2 0
3 0
4 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 1, j = 2
1 2 3 4
1 0
2 126 0
3 0
4 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 1, j = 2
1 2 3 4
1 0
2 126 0
3 0
4 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 2, j = 3
1 2 3 4
1 0
2 126 0
3 84 0
4 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 2, j = 3
1 2 3 4
1 0
2 126 0
3 84 0
4 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 3, j = 4
1 2 3 4
1 0
2 126 0
3 84 0
4 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 2, i = 3, j = 4
1 2 3 4
1 0
2 126 0
3 84 0
4 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 3, i = 1, j = 3
1 2 3 4
1 0
2 126 0
3 106 84 0
4 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 3, i = 1, j = 3
1 2 3 4
1 0
2 126 0
3 106 84 0
4 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 3, i = 2, j = 4
1 2 3 4
1 0
2 126 0
3 106 84 0
4 210 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 3, i = 2, j = 4
1 2 3 4
1 0
2 126 0
3 106 84 0
4 210 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
l = 4, i = 1, j = 4
1 2 3 4
1 0
2 126 0
3 106 84 0
4 160 210 108 0
for l ← 2 . . . n do
for i ← 1 . . . n − l + 1 do
j ← i + l − 1 {right position}
m[i, j] ← ∞
for k ← i . . . j − 1 do
m[i, j] ← min{m[i, j], m[i, k] + m[k + 1, j] + pi−1 pk pj }
Example: n = 4 and p = 3 7 6 2 9
Algorithm outputs value of optimal solution: m[1, 4] = 160
We would like to know the optimal parenthesization as well
((A1 × A2 ) × A3 ) × A4
→ Modify algorithm to keep track of parameters that give
minimum in array s