功能乘法的理论分析

时间:2013-10-08 07:02:28

标签: c++ algorithm time-complexity

待办事项 一个 理论 分析 对于 该 赛跑 时间 的 该 以下 C ++ 功能 MMultiply。 计数 该 数 的 乘法 MMultiply 不 如 一个 功能 的 ñ 因为 在 这个 案件, ñ 是 该 尺寸 的 该 输入/尺寸 的 该 问题。 节目 您的 运作。 表达 该 回答 在 大 Ø 符号。

int I(int i, int j, int n)
{
    return n * i + j;
}

int sProduct(const int A[],const int B[],int i, int j, int n)
{
    int t = 0;
    for( int k=0; k<n; k++ )
    {
        int d = A[ I(i,k,n) ] * B[ I(k,j,n) ];
        t += d * d;
    }
    return t;
}

void MMultiply(const int A[], const int B[], int C[], int n)
{
    for( int i=0; i<n; i++ )
        for( int j=0; j<n; j++ )
            C[ I(i,j,n) ] = sProduct(A, B, i, j, n );
}

答案被发现是O(n ^ 3),但我不明白这是如何计算的。

MMultiply中的外循环给出n,内循环为n,所以用乘法查看函数有3 ...... M(n)= n * n(....)然后我我迷失了如何看待其他功能.T(n)和C(n)符号也让我失望......

1 个答案:

答案 0 :(得分:3)

  • i从0到n,总共n次。
  • 对于每个ij从0到n,因此每n i次,n*n次。{/ li>
  • 对于每个jk从0到n,因此每n j次,n*n*n次。{/ li>

有效的线路,即:

int d = A[ I(i,k,n) ] * B[ I(k,j,n) ];
t += d * d;

执行n*n*n = O(n 3 )次。

还有另一条线可行。这里的任务:

C[ I(i,j,n) ] = sProduct(A, B, i, j, n );

执行n*n = O(n 2 )次。所以整个算法是O(n 3 + n 2 )。当n增长时,n 2 项无关紧要,因此整个算法为O(n 3 )。

这给了我们上限,即在最坏的情况下会发生什么。请注意,即使在最好的情况下,这些行仍然会执行n 3 次,因此您可以说下限是Ω(n 3 )。这意味着算法是Θ(n 3 )(即下限和上限相同)。