For loop 三个相互依赖的嵌套循环的渐近分析

For loop 三个相互依赖的嵌套循环的渐近分析,for-loop,nested,complexity-theory,big-o,For Loop,Nested,Complexity Theory,Big O,我要分析的代码片段如下: int sum = 0; for (int i = 0; i < n; i++) for (int j = 0; j < i * i; j++) for (int k = 0; k < j; k++) sum++; int和=0; 对于(int i=0;i

我要分析的代码片段如下:

int sum = 0;
for (int i = 0; i < n; i++)
   for (int j = 0; j < i * i; j++)
      for (int k = 0; k < j; k++)
         sum++;
int和=0;
对于(int i=0;i

我知道第一个循环是O(n),但这就是我所知道的。我认为第二个循环可能是O(n^2),但我越想它,它就越没有意义。任何指导都将不胜感激。

尝试计算内部循环执行的次数:

中间的循环运行

0*0 times when i == 0
1*1 times when i == 1
2*2 times when i == 2
...
n*n = n^2 times when i == n.

因此,第一个循环执行了
n
次。每次,值
i
都会增加。对于每个这样的
i
,第二个循环执行
i*i
次。这意味着第二个循环执行
1*1+2*2+3*3+…+n*n

这是平方和,公式是。因此,我们有第二个循环执行
(n(1+n)(1+2n))/6次

因此,我们知道总共将有
(n(1+n)(1+2n))/6
j的值,并且对于这些值中的每一个,第三个循环将执行
1+2+…+j=j(j+1)/2次。实际上,计算第三个循环总共执行了多少次是非常困难的。幸运的是,您真正需要的是函数顺序的最小上界

您知道,对于
j
(n(1+n)(1+2n))/6
值中的每一个,第三个循环将执行少于
n(n+1)/2次。因此,您可以说操作
sum++
将执行少于
[(n(1+n)(1+2n))/6]*[n(n+1)/2]
次。经过一些快速的心算,这相当于一个最大次数为5的多项式,因此您的程序是
O(n^5)

(第一个参数是迭代器,第二个是上界,最后一个参数是我们要添加的)

这实际上是n个数对i*i的和。这意味着我们可以应用公式((n+1)*n)/2

这些都是众所周知的公式,玩了一小会儿,你会得到:

 N = (n^5)/10 + (n^4)/4 + (n^3)/3 + (n^2)/4 + n/15

这应该是循环所需的确切步数,但是如果您对O表示法感兴趣,您可以注意到n^5是增长最快的部分,因此解决方案是O(n^5)

如果您使用Sigma表示法系统地进行,您将得到以下结果:


最后一次运行时为O(n^2)。所有的跑步都远不止这些。是的。我的意思是,只有中间循环的复杂性是
O(n^2)
Then M = Sum(j=0,i^2,K) = Sum(j=0, i^2, j)
 M = Sum(j=0,i^2,j) = ((i^2+1)*(i^2))/2 = (i^4 + i^2)/2

 N = Sum(i=0, n, M) = 1/2 * ( Sum(i=0, n, (i^4)) + Sum(i=0, n, (i^2)) )
 N = (n^5)/10 + (n^4)/4 + (n^3)/3 + (n^2)/4 + n/15