# What is the time complexity of matrix chain multiplication?

## What is the time complexity of matrix chain multiplication?

Matrix chain multiplication is a classic optimization problem in computer science and is often used in algorithm analysis and dynamic programming. It involves finding the most efficient way to multiply a chain of matrices to minimize the total number of scalar multiplications. In this essay, we will explore the concept of matrix chain multiplication, its time complexity, the dynamic programming approach to solving it, and the underlying principles that make it an essential problem in algorithm design.

1. Introduction to Matrix Chain Multiplication:

Matrix chain multiplication is a problem where we are given a chain of matrices, and we need to determine the most efficient way to multiply them to minimize the total number of scalar multiplications. The order in which we multiply the matrices can significantly affect the overall computational cost.

2. Problem Formulation:

Let's consider a sequence of matrices A_1, A_2, ..., A_n, where the dimensions of the matrices are given by d_i x d_{i+1} for 1 ≤ i < n. The goal is to find the optimal parenthesization of the matrices that minimizes the total number of scalar multiplications required.

For example, suppose we have four matrices with dimensions:

A_1: 10x30 A_2: 30x5 A_3: 5x60 A_4: 60x10

There are several possible ways to parenthesize the matrices, resulting in different numbers of scalar multiplications. The optimal parenthesization is the one that requires the fewest scalar multiplications.

3. Naive Approach:

A naive approach to solving the matrix chain multiplication problem is to consider all possible parenthesizations and compute the number of scalar multiplications for each. However, this approach is inefficient and has an exponential time complexity, as the number of possible parenthesizations grows exponentially with the number of matrices.

4. Dynamic Programming Approach:

To overcome the inefficiency of the naive approach, we can use dynamic programming to find the optimal solution efficiently. The dynamic programming approach breaks the problem into smaller subproblems and stores the results of these subproblems to avoid redundant computations.

The dynamic programming solution to the matrix chain multiplication problem involves the following steps:

Step 1: Define Subproblems:

We define the subproblem as finding the optimal parenthesization for a subchain of matrices within the given chain.

For a given chain of matrices A_i, A_{i+1}, ..., A_j, where 1 ≤ i < j ≤ n, we want to find the optimal k such that the matrices are parenthesized as (A_i)(A_{i+1})...(A_k) and (A_{k+1})(A_{k+2})...(A_j). The objective is to minimize the total number of scalar multiplications for the entire chain.

Step 2: Recurrence Relation:

To solve the subproblem efficiently, we need to find a recurrence relation that relates the optimal solution for the subproblem to the optimal solutions for its smaller subproblems.

Let m[i][j] represent the minimum number of scalar multiplications needed to multiply the matrices A_i to A_j inclusively. Then, we can express the recurrence relation as follows:

m[i][j] = min(m[i][k] + m[k+1][j] + d_i x d_{k+1} x d_{j+1}) for all i ≤ k < j

The recurrence relation states that the minimum number of scalar multiplications needed to multiply the matrices A_i to A_j can be obtained by considering all possible values of k, where i ≤ k < j. The term m[i][k] represents the minimum number of scalar multiplications needed for the subchain A_i to A_k, and m[k+1][j] represents the minimum number of scalar multiplications needed for the subchain A_{k+1} to A_j. The term d_i x d_{k+1} x d_{j+1} represents the number of scalar multiplications needed to compute the resulting matrix of multiplying A_i to A_k with A_{k+1} to A_j.

Step 3: Base Case:

The base case of the dynamic programming solution is when the subchain contains only one matrix (i = j). In this case, no scalar multiplications are needed, so m[i][j] = 0.

Step 4: Filling the Table:

To find the optimal solution for the entire chain of matrices (A_1, A_2, ..., A_n), we need to fill in the dynamic programming table m[][] in a bottom-up manner.

We start by filling in the base cases (i = j), where m[i][j] = 0. Then, we proceed to fill in the table for increasing subchain lengths (j - i). For each subchain length, we compute the values of m[i][j] using the recurrence relation described earlier.

Finally, the value m[1][n] represents the minimum number of scalar multiplications needed to multiply the entire chain of matrices A_1 to A_n.

5. Time Complexity of Dynamic Programming Solution:

The time complexity of the dynamic programming solution to the matrix chain multiplication problem is O(n^3), where n is the number of matrices in the chain.

Explanation of Time Complexity:

The dynamic programming table m[][] has dimensions n x n, representing all possible subchains of the given chain of matrices. Filling in the table requires computing the optimal solution for each subchain, which involves considering all possible values of k for each subchain.

For each subchain length (j - i), there are at most n - 1 possible values of k to consider (since i ≤ k < j). Hence, the number of computations required to fill in each entry m[i][j] is proportional to n - 1. As there are n^2 entries in the dynamic programming table, the overall time complexity is O(n^3).

6. Conclusion:

Matrix chain multiplication is a classic optimization problem in computer science, where the goal is to find the most efficient way to multiply a chain of matrices to minimize the total number of scalar multiplications. The dynamic programming approach offers an efficient solution to this problem, with a time complexity of O(n^3), where n is the number of matrices in the chain.

By breaking the problem into smaller subproblems and using a recurrence relation, dynamic programming allows us to compute the optimal solution for the entire chain in a systematic and efficient manner. The matrix chain multiplication problem is not only important in algorithm design and analysis but also finds practical applications in various fields, such as computer graphics, robotics, and numerical computation.

Thank You