// Matrix Ai has dimension p[i-1] x p[i] for i = 1..n
Matrix-Chain-Order(int p[])
{
// length[p] = n + 1
n = p.length - 1;
// m[i,j] = Minimum number of scalar multiplications (i.e., cost)
// needed to compute the matrix A[i]A[i+1]...A[j] = A[i..j]
// cost is zero when multiplying one matrix
for (i = 1; i <= n; i++)
m[i,i] = 0;
for (L=2; L<=n; L++) { // L is chain length
for (i=1; i<=n-L+1; i++) {
j = i+L-1;
m[i,j] = MAXINT;
for (k=i; k<=j-1; k++) {
// q = cost/scalar multiplications
q = m[i,k] + m[k+1,j] + p[i-1]*p[k]*p[j];
if (q < m[i,j]) {
m[i,j] = q;
// s[i,j] = Second auxiliary table that stores k
// k = Index that achieved optimal cost
s[i,j] = k;
}
}
}
}
}
这是矩阵链乘法的伪代码 我能理解这部分
for (L=2; L<=n; L++) { // L is chain length
for (i=1; i<=n-L+1; i++) {
j = i+L-1;
m[i,j] = MAXINT;
为什么我要小于或等于(n-L + 1) 并且j = i + L-1
我是初学者
答案 0 :(得分:3)
首先,它是伪代码,这些数组是基于1的。如果您使用的是类C语言,这可能是第一个问题,因为C中的数组从索引0
开始,到len-1
结束,如果len
是数组的长度。接下来,选择变量n
小于矩阵总数1
。如果您将n
替换为p.length - 1
,那么它可能会变得更加清晰。
您希望为所有可能的链长运行外循环(即链长L
)。您从最小链长(仅两个矩阵)开始,以所有矩阵结束(即L
从2
变为n
)。在此之前,成本数组被初始化为只有一个矩阵的平凡情况(即没有乘法)。
这意味着i
可以从1
开始,直到最后一项减去链长n-L+1
,请注意n
是p.length - 1
所以这实际上是p.length - L
)。例如,如果您当前正在检查长度为4
的链,那么您的i
循环将实际运行如下:
L = 4;
for (i = 1; i <= p.length - 4; i++)
{
...
}
在C中,你会写for (i = 0; i < p.length - 4; i++)
。请注意,<=
已替换为<
。
接下来,您试图从长度为i
的{{1}}开始增加链的成本。这意味着链中的最后一个元素是L
。同样,如果当前链长为j = i + L -1
,那么您有:
L
换句话说,如果L = 4;
for (i = 1; i <= p.length - 4; i++)
{
j = i + 3;
...
}
为10,则希望i
为13,因为这是一条长度为4(10,11,12,13)的链。
最后,您需要检查j
和i
之间所有链的成本。这就是j
从k
到i
的原因。对于链长j-1
的示例,您有:
L=4
换句话说,如果L = 4;
for (i = 1; i <= p.length - 4; i++)
{
j = i + 3;
m[i,j] = MAXINT;
for (k = i; k <= j - 1; k++)
{
// get the cost of splitting at `k`,
// i.e. chains (i, k) and (k + 1, j)
}
}
为4,L
为10,i
为13,则您需要测试链j
,(10)(11,12,13)
和(10,11)(12,13)
。因此,(10,11,12)(13)
必须从k
转到i
。