内循环依赖于外循环的嵌套for循环的时间复杂度

Time complexity of nested for loops where inner loop depends on outer loop

我有一个嵌套的 for 循环:

for(i = 0; i < n*n; i++)
   for(j = 0; j <= i/5; j++)
      print("Hello World!");

如何找到这个循环的时间复杂度。

我考虑的是外循环,从0到n^2(不包括),所以它运行了n^2 + 1次。

对于内部循环,它取决于 i,这就是我迷路的地方。有什么指点吗?

几乎总是你可以只插入常识告诉你的数字来构成最坏的情况。除非所说的最坏情况只保证 运行 固定次数而不管 N(即所有循环都接近最优,除了最多 5 个循环不是,即使我们循环一千次 - 非常rare) - 然后用最坏的情况做数学运算。

就每个单独的循环而言:对每个循环都采取最坏的情况。这是对的,除非循环之间有 link,例如if inner loop 运行s 'worst case' only if some outer loop is guaranteed to 运行 best case, and vice versa - when there are a clear relationship.

所以,让我们在这里应用它:

  • i 运行s 从 0 到 n*n,这部分很简单。
  • j 运行s从0到i(我们可以忽略常数因子,所以/5部分是无关紧要的,我们可以忽略它)。

j循环的最坏情况是i等于n*n,这使得j运行从0到n*n。所以我们就用它吧。

这实际上是正确的答案;这是一个 运行s 进行 n*n 次迭代的循环(这是 j 循环),并且此过程重复 n*n 次(i 循环) ,总复杂度为 O(n^4)(哎哟,随着 n 的增长,它会很快下降)。

如果您不确定数学是否有效,请尝试找到线性。这保证了它。在这种情况下,最好的情况是 i 为 0,在这种情况下 j 循环 运行s 仅一次,而最坏的情况是 j 循环 运行s n*n 次。至关重要的是,j 循环的特征是线性的:只需绘制出第 j 循环的性能相对于第 i 循环的 'lifetime' 的性能变化情况,这是一个简单的直线关系。前 5 j 次循环 运行 一次,第二 5 j 次循环 运行 两次,一直到最后 j 次循环 运行s n*n/5 次。

所有 j 次循环的 'average' 就是该行的中间:n*n/5 的一半。这是 n*n/10,常数因子无关紧要,所以仍然是 n*n。因此,为什么这是 O(n^4),与 for (j = 0; j < n*n; j++) 相同。