代码片段的大哦符号

时间:2011-01-31 00:09:03

标签: code-analysis big-o

我迷失在这些代码片段上,并且很难找到任何其他类似的例子。

//Code fragment 1  
sum = 0;  
for(i = 0;i < n; i++)  
 for(J=1;j<i*i;J++)    
   for(K=0;k<j;k++)
    sum++;

我猜测片段1是O(n ^ 4)。

//Code fragment 2
sum = 0;
for( 1; i < n; i++ )
 for (j =1;,j < i * i; j++)
  if( j % i == 0 )
   for( k = 0; k < j; k++)
     sum++;

我很遗憾。不确定if语句如何影响循环。

感谢您的帮助时间!

4 个答案:

答案 0 :(得分:4)

第一个实际上是O(n^5)sum++行执行1 ^ 4次,然后执行2 ^ 4次,然后执行3 ^ 4,依此类推。权限之和kn^(k+1)中有一个词(请参阅例如Faulhaber's formula),因此在这种情况下n^5

对于第二个,考虑它的方法是内部循环仅在ji的倍数时执行。所以第二个循环也可以写成for (j = 1; j < i * i; j+=i)。但这与for (j = 1; j < i; j++)相同。所以我们现在有一系列立方体,而不是4的幂。因此,最高项是n^4

答案 1 :(得分:1)

我很确定第一个片段实际上是O(n ^ 5)。

由于:

n次,

i^2次,其中i实际上是n的一半(对于这种情况的平均值i,因为对于每个x,存在相应的nx,其总和为2n)因此n^2 / 4倍。 (一次)

然后,又一次,

当你这样做时:n * a * a,或n * n * n / 4 * n * n / 4 = n ^ 5/16,或O(n ^ 5)

我相信第二个是O(4),因为:

它重复了n次。

然后它迭代n * n次,(字面上是n * n / 4,但不是O符号)

然后只有1 / n被if通过(我不记得我是怎么得到的)

然后重复n * n。

所以,n * n * n * n * n / n = n ^ 4。

答案 2 :(得分:0)

如果sum非常便于计算,您可以为n=10n=50运行这些,等等,然后查看O(N ^ 2),O中的哪一个( N ^ 3),O(N ^ 4),O(N ^ 6)是更好的匹配。 (请注意,最内层循环的索引也运行到n * n ...)

答案 3 :(得分:-1)

首先,我同意你对第一个场景的假设。这是我对第二个的细分。

If语句将导致最后一个循环只运行一半的时间,因为i * i的奇数值只会导致i * i可以分解为的素数值的第三个内循环。 big-O中的底线我们忽略常量,所以我认为你看O(n ^ 3)。