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

Determining the big-O run-times of these different loops?

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

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

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

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

对于每个j,从j到0包含k 运行s,所以内循环是运行 j+1次。

对于从1到2*i的每个i,j运行s,所以内循环是运行1+1和2+1次i=1,然后也是3+ i=2 时 1 次和 4+1 次,依此类推。我希望你能看到,对于每个 i,内环比第 (2i+1) 个三角数少 运行 一个。第 n 个 triangular number 是 n(n+1)/2,所以对于每个 i,我们得到

的计数
(2i+1)(2i+1+1)/2 - 1

简化为

2 * i**2 + 3 * i

对于每个 n,i 运行s 从 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 代码检查了最后的表达式。