矩阵链乘法动态规划

时间:2013-08-19 14:28:48

标签: algorithm dynamic matrix pseudocode

  // 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

我是初学者

1 个答案:

答案 0 :(得分:3)

首先,它是伪代码,这些数组是基于1的。如果您使用的是类C语言,这可能是第一个问题,因为C中的数组从索引0开始,到len-1结束,如果len是数组的长度。接下来,选择变量n小于矩阵总数1。如果您将n替换为p.length - 1,那么它可能会变得更加清晰。

  1. 您希望为所有可能的链长运行外循环(即链长L)。您从最小链长(仅两个矩阵)开始,以所有矩阵结束(即L2变为n)。在此之前,成本数组被初始化为只有一个矩阵的平凡情况(即没有乘法)。

  2. 这意味着i可以从1开始,直到最后一项减去链长n-L+1,请注意np.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++)。请注意,<=已替换为<

  3. 接下来,您试图从长度为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)的链。

  4. 最后,您需要检查ji之间所有链的成本。这就是jki的原因。对于链长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