5

我有一个程序,并试图计算它的复杂性。我想确定我没有弄错

for(int i=4; i<=n; i=i*4)
{
    cout<<"counter for first loop: "<<++count1<<endl;
    for(int j=i;j>=0;j=j-4)
    {
        cout<<"counter for second loop: "<<++count2<<endl;
        for(int k=0;k<=n;k++)
        {
            cout<<"counter for third loop: "<<++count3<<endl;
        }
    }
}

这里,第三个循环的复杂度是O(n),那么再加上第二个循环,复杂度就变成了O(n.log 4 i),整个程序的复杂度是O(n.(log 4 i) 2 ) . 我的回答对吗?谢谢

4

2 回答 2

2

最内层循环的复杂度为 O(n)。中间一个的复杂度是O(i/4),反过来又是O(i)。最外层循环的复杂度为 O(log 4 n)。代码的总复杂度是 O(nilog 4 n) ,它等于 O (n.(log 4 n) 2 )。

于 2013-02-26T11:16:07.120 回答
0

您可以像下面这样正式进行:

在此处输入图像描述

执行这个片段:

sum = 0;
for( i = 4 ;  i <= n;  i = i * 4 ) {
    for( j = i ; j >= 0 ; j = j - 4 ) {
        for( k = 0 ; k <= n ; k ++ ) {
            sum ++;
        }
    }
}

我们获得:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

结果与上述公式完全一致。

此外,两个内部循环的运行时间都是 O(n) ...这意味着,当一起执行时,我们得到 O(n²)。

于 2014-04-13T19:42:29.510 回答