确定这些不同循环的大O运行时间?

时间:2016-11-27 21:33:26

标签: algorithm math time-complexity big-o

确定这些不同循环的大O运行时间?

for i = 1 to n {
  ...
  for  j = 1 to 2*i {
    ...
    k = j;
    while (k>=0) {
      ...
      k = k-1;
    }
  }
}

我发现答案是O(n ^ 3)因为三个循环互相嵌套,我的答案是否正确?

1 个答案:

答案 0 :(得分:3)

这是一种启发式方法,但这种启发式方法可能会让您误入歧途。可以找到内循环数的确切公式。

对于每个j,k从j向下运行到0(含),因此内循环运行j + 1次。

对于每个i,j从1到2 * i运行,因此对于i = 1,内循环运行1 + 1和2 + 1次,然后对于i = 2运行3 + 1和4 + 1次,等等。我希望你能看到,对于每一个我,内环比第(2i + 1)个三角数少一个。第n triangular number次为n(n + 1)/ 2,因此对于每个我,我们得到的计数

(2i+1)(2i+1+1)/2 - 1

简化为

2 * i**2 + 3 * i

对于每个n,我从1到n运行,所以我们只将从1到n的最后一个表达式求和。这给了我们前n个平方数加上三次n次三角数的两倍。 the sum of the first n square numbers的公式是

n**3/3 + n**2/2 + n/6

所以我们简化

2*(n**3/3 + n**2/2 + n/6) + 3*(n*(n+1)/2)

我们得到了

2/3 * n**3 + 5/2 * n**2 + 11/6 * n

这显然是O(n ** 3),所以你的启发式是正确的。

我用一些简单的Python代码检查了最后的表达式。

相关问题