C ++ Matrix-Chain-Order /无法获得所需的输出

时间:2015-04-17 22:00:53

标签: c++ algorithm c++11 matrix

#include <string>
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

int main()
{
     double m[7][7]; //2d dimension array m
     int s[7][7]; //2d dimension array s
     int p[7] = {30,35,15,5,10,20,25}; //array p to store numbers

     int j;
     double q;

     int n = 5;

    for(int i = 1; i != n; ++i) //initialize m[1][1], m[2][2], ... to zero
        m[i][i] = 0;
    for(int l = 2; l != n; ++l) // performing the algorithm 
    {
        for(int i = 1; i != (n-l+1); ++i)
        {
            j = i + (l-1);
            m[i][j] = numeric_limits<double>::max(); // find the max
            for(int k = i; k != (j-1); ++k)
            {
                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] = k;
                }
            }
        }
    }

以下测试:

    for(int i = 0; i != 4; ++i)
    {
        for(int j = 0; j != 4; ++j)
        {
            // print the m[i][j] to test the output
            cout << "m[" << i << "][" << j << "] " << " = " << m[i][j] << endl;;
        }
    }
}

我正在执行矩阵链顺序,输出(我的测试用例)在执行算法后应该有值。但它就像图片一样零。例如,m 1 [2]应为30 * 35 * 15 = 15750。

my output

2 个答案:

答案 0 :(得分:0)

C数组的索引从0开始,而不是1

更改

for(int i = 1; i != n; ++i)
    m[i][i] = 0;

for(int i = 0; i != n; ++i)
    m[i][i] = 0;

更改

for(int l = 2; l != n; ++l)
{
    for(int i = 1; i != (n-l+1); ++i)

for(int l = 1; l != n; ++l)
// Start from 1 instead of 2
{
    for(int i = 0; i != (n-l+1); ++i)
    // Start from 0 instead of 1

<强>更新

目前还不清楚你的算法是什么,但行

for(int k = i; k != (j-1); ++k)

似乎是一个问题。当你进入循环时,你有:

l = 1
i = 0
j = 0

您将k初始化为i,即0。因此,条件k != (j-1)永远不会成立,并且循环会一直运行,直到达到某种限制 - 很可能会产生浮点数的溢出/下溢。

更改该行:

for(int k = i; k < (j-1); ++k)

会让你的程序运行,但我不知道这是否是你程序的正确逻辑。

答案 1 :(得分:0)

我建议更改一些for循环布尔语句  “(整数)!=(整数)”到“(整数)&lt; =(整数)”取决于具体情况。例如,在执行算法步骤之后的for循环中,您有:

for(int i = 1; i != (n-l+1); ++i)相当于for(int i = 1; i < (n-l+1); i++)

但算法的正确for循环是:

for(i=1;i<=n-l+1;i++)

此算法中n是乘以矩阵的数量,int p[]保持维度。如果有n维,则应该有n-1个矩阵。

也到最后 m[1][n-1]保持矩阵链的最小乘法次数。

GeeksforGeeks在解释算法如何工作方面做得非常出色,并且他们使用了类似的算法。看看你是否还有兴趣:

http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/