函数乘法的理论分析
Posted
技术标签:
【中文标题】函数乘法的理论分析【英文标题】:theoretical analysis of multiplications in function 【发布时间】:2013-10-08 07:02:28 【问题描述】:做 一种 理论上的 分析 为了 这 跑步 时间 的 这 下列的 C++ 功能 M乘法。 数数 这 数字 的 乘法 M乘法 做 作为 一种 功能 的 n 因为 在 这 案子, n 是 这 尺寸 的 这 输入/尺寸 的 这 问题。 显示 您的 工作。 表达 这 回答 在 大的 ○ 符号。
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】:i
从 0 到 n,所以总共有 n
次。
对于每个i
,j
从 0 到 n,因此每个 i
,n*n
总共有 n
次。
对于每个j
,k
从 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)。
这给了我们上限,即在最坏的情况下会发生什么。请注意,即使在最好的情况下,这些行仍然会执行 n3 次,因此您也可以说下限也是 Ω(n3)。这意味着算法是 Θ(n3) (即下限和上限相同)。
【讨论】:
以上是关于函数乘法的理论分析的主要内容,如果未能解决你的问题,请参考以下文章