在网站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 = 1
和j = 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
也有同样的问题。
答案 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)
最终乘法的标量乘法次数。