待办事项 一个 理论 分析 对于 该 赛跑 时间 的 该 以下 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)符号也让我失望......
答案 0 :(得分:3)
i
从0到n,总共n
次。i
,j
从0到n,因此每n
i
次,n*n
次。{/ li>
j
,k
从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 )(即下限和上限相同)。