函数乘法的理论分析

theoretical analysis of multiplications in function

本文关键字:理论 函数      更新时间:2023-10-16

Do一个理论分析为这运行时间之这以后C++功能嗯。计数这数之乘法唰做如一个功能之n因为在这箱n是这大小之这输入/大小之这问题。显示你运作。表达这答在大O表示法。

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( 符号也让我失望......

  • i从 0 到 n,总共 n 次。
  • 对于每个ij从0到n,所以每个i n次,总共n*n次。
  • 对于每个jk从0到n,所以每个j n次,总共n*n*n次。

确实有效的行,即:

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

执行 n*n*n = O(n3( 次。

还有另一行确实有效。这里的作业:

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

执行 n*n = O(n2( 次。所以整个算法是 O(n3 + n2(。随着n的增长,n2 项无关紧要,因此整个算法为 O(n3(。

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