Given a sequence of matrices, find the most efficient way to multiply these matrices together. The problem is not actually to perform the multiplications, but merely to decide in which order to perform the multiplications.
We have many options to multiply a chain of matrices because matrix multiplication is associative. In other words, no matter how we parenthesize the product, the result will be the same. For example, if we had four matrices A, B, C, and D, we would have:
(ABC)D = (AB)(CD) = A(BCD) = ....
However, the order in which we parenthesize the product affects the number of simple arithmetic operations needed to compute the product, or the efficiency. For example, suppose A is a 10 × 30 matrix, B is a 30 × 5 matrix, and C is a 5 × 60 matrix. Then,
(AB)C = (10 × 30 × 5) + (10 × 5 × 60) = 1500 + 3000 = 4500 operations
A(BC) = (30 × 5 × 60) + (10 × 30 × 60) = 9000 + 18000 = 27000 operations.
Clearly the first parenthesization requires less number of operations.
Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i - 1] x p[i]. We need to write a function MatrixChainOrder() that should return the minimum number of multiplications needed to multiply the chain.
Input: p[] = {40, 20, 30, 10, 30}
Output: 26000
There are 4 matrices of dimensions 40 x 20, 20 x 30, 30 x 10 and 10 x 30.
Let the input 4 matrices be A, B, C and D. The minimum number of multiplications are obtained by putting parenthesis in following way (A(BC))D --> 20 * 30 * 10 + 40 * 20 * 10 + 40 * 10 * 30
Input: p[] = {10, 20, 30, 40, 30}
Output: 30000
There are 4 matrices of dimensions 10 x 20, 20 x 30, 30 x 40 and 40 x 30.
Let the input 4 matrices be A, B, C and D. The minimum number of multiplications are obtained by putting parenthesis in following way
((AB)C)D --> 10 * 20 * 30 + 10 * 30 * 40 + 10 * 40 * 30
Input: p[] = {10, 20, 30}
Output: 6000
There are only two matrices of dimensions 10 x 20 and 20 x 30. So there is only one way to multiply the matrices, cost of which is 10 * 20 * 30
Output: Minimum number of multiplications is 30
The time complexity of the above naive recursive approach is exponential. It should be noted that the above function computes the same subproblems again and again. See the following recursion tree for a matrix chain of size 4. The function MatrixChainOrder(p, 3, 4) is called two times. We can see that there are many subproblems being called more than once.
Since same subproblems are called again, this problem has Overlapping Subproblems property. So Matrix Chain Multiplication problem has both properties (see this and this) of a dynamic programming problem. Like other typical Dynamic Programming(DP) problems, recomputations of same subproblems can be avoided by constructing a temporary array m[][] in bottom up manner.
Following is the implementation of the Matrix Chain Multiplication problem using Dynamic Programming (Tabulation vs Memoization)
1. Using Memoization
Output: Minimum number of multiplications is 18
2. Using Tabulation
Output: Minimum number of multiplications is 18
Time Complexity: O(n3 )
Auxiliary Space: O(n2)
81 videos|80 docs|33 tests
|
1. What is matrix chain multiplication and why is it important in computer science engineering? |
2. How is matrix chain multiplication different from regular matrix multiplication? |
3. What is the complexity of matrix chain multiplication? |
4. How can matrix chain multiplication be solved using dynamic programming? |
5. Can matrix chain multiplication be parallelized for faster computation? |
|
Explore Courses for Computer Science Engineering (CSE) exam
|