矩阵链乘法

时间:2014-08-13 14:13:36

标签: c recursion matrix-multiplication

在网站geeksforgeeks上,我遇到了matrix chain multiplication的任务。

有一个针对该问题的递归解决方案,但我无法理解代码。实际上,我遇到了某段代码的问题。

首先是代码:

#include <stdio.h>
#include <limits.h>

//Matrix Ai has dimension p[i-1] x p[i] for i = 1...n
int MatrixChainOrder(int p[], int i, int j)
{
    if(i == j)
        return 0;
    int k, min = INT_MAX, count;

    for(k=i; k < j; k++) {
        count = MatrixChainOrder(p,i,k) + MatrixChainOrder(p,k+1,j) + p[i-1]*p[k]*p[j];

    if(count < min)
        min = count;
    }

    return min;
}

int main() {

    int arr[] = {1, 2, 3, 4, 3};
    int n = sizeof(arr)/sizeof(arr[0]);

    printf("Minimum number of multiplications is %d ", MatrixChainOrder(arr, 1, n-1));

    getchar();
    return 0;
}

矩阵为:A = 1x2,B = 2x3,C = 3x4,D = 4x3

导致我遇到麻烦的那条线是

count = MatrixChainOrder(p,i,k) + MatrixChainOrder(p,k+1,j) + p[i-1]*p[k]*p[j];

在for循环的开头,i = 1j = 4。因此, p[i-1]*p[k]*p[j] 会评估为 p[0]*p[1]*p[4] = 1x2x3 ,这显然是错误的,因为矩阵A只能乘以B.我运行代码并且这里似乎没有任何结果,因为 p[i-1]*p[k]*p[j] 没有给出结果,而且案例i = 2, j = 4也有同样的问题。

是的,有人可以开导我吗?如果你在这段代码中解释我的递归,我将不胜感激。我指的是方式和方式。

1 个答案:

答案 0 :(得分:4)

答案在于递归正在做什么。假设这表示乘以ABCD,则使用i=1, j=4, k=1的循环迭代表示由(A)(BCD)执行此计算。 MatrixChainOrder(p,i,k)计算计算(A)1x2矩阵的最佳方式,MatrixChainOrder(p,k+1,j)计算计算(BCD)2x3矩阵的最佳方式。

最后,您对p[i-1]*p[k]*p[j]感兴趣的术语是执行(A)(BCD)最终乘法的标量乘法次数。