确定这些不同循环的大O运行时间?
for i = 1 to n {
...
for j = 1 to 2*i {
...
k = j;
while (k>=0) {
...
k = k-1;
}
}
}
我发现答案是O(n ^ 3)因为三个循环互相嵌套,我的答案是否正确?
答案 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代码检查了最后的表达式。