作为N的函数的最坏情况运行时间的增长顺序

时间:2015-09-09 04:35:17

标签: algorithm performance

给出以下代码片段:

a.out: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=f56e8ee17aa966e641c8b4e1ba3105abc077a143, not stripped

gcc (Ubuntu/Linaro 4.8.2-19ubuntu1) 4.8.2

Linux tegra-ubuntu 3.10.24-g6a2d13a #1 SMP PREEMPT Fri Apr 18 15:56:45 PDT 2014 armv7l armv7l armv7l GNU/Linux

我的假设:

  • 外环:O(N)
  • 中间循环:O(N * N)
  • 最内圈:O(N * N)

因此,总运行时间应为O(N ^ 5),对吧?

2 个答案:

答案 0 :(得分:2)

初步评论

sum(k=1,p,k^2) = p(p+1)(2p+1)/6 = O(p^3)
sum(k=1,p,k^6) = O(p^7)

计算复杂性

  1. 最内层的循环从k=1运行到j^2,因此它可以完成j^2次操作。
  2. 中间循环从j=1i^2,每一步我们都进行j^2次操作。根据我的初步观察,通过在第一个等式中替换p=i^2,我们可以为i^2(i^2+1)(2*i^2+1)/6的每个值计算总操作:i。这是O((i^2)^3) = O(i^6)次操作。
  3. 外部循环从i=1运行到n,并在每一步执行O(i^6)次操作。所以我们有O(n^7)次操作。
  4. <强>参考

答案 1 :(得分:1)

让我们打开每个循环运行的次数。

First loop    1, 2,   3,   4,   5,  ...., N
Second loop   1, 4,   9,  16,  25, ...., (N*N)             // N^2
Third loop    1, 16, 81, 256, 625, ...., ( (N*N)*(N*N) )   // N^4

所以,我认为复杂性应该是N ^ 4

编辑1

基于评论,我认为复杂性将是系列的总和

1, 16, 81, 256, 625, ...., ( (N*N)*(N*N) )

编辑2

我认为我们在打开循环时犯了一个错误(感谢CodeYogi)。让我们再试一次。

First loop    1, 2,   3,   4,   5,  ...., N
Second loop   1,  4(1,2,3, 4), 9  (1,2,....9),  16,  25, ...., (N*N)  
Third loop    1, 30(1+4+9+16), 285(1+4+...81), and so on..........