我迷失在这些代码片段上,并且很难找到任何其他类似的例子。
//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语句如何影响循环。
感谢您的帮助时间!
答案 0 :(得分:4)
第一个实际上是O(n^5)
。 sum++
行执行1 ^ 4次,然后执行2 ^ 4次,然后执行3 ^ 4,依此类推。权限之和k
在n^(k+1)
中有一个词(请参阅例如Faulhaber's formula),因此在这种情况下n^5
。
对于第二个,考虑它的方法是内部循环仅在j
是i
的倍数时执行。所以第二个循环也可以写成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=10
,n=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)。