嵌套在 for 循环中的 while 循环的大 O 是 O(n),为什么?

时间:2021-06-08 13:56:38

标签: algorithm time-complexity big-o

我想弄清楚为什么以下是 O(n)。我的疑问实际上是关于如何在不替换值的情况下计算内循环的迭代次数

*Edit: 换句话说,谁能告诉我使用 sigma 表示法的推导?

n = 10
j = 1
for i in range(n):
      while j < i:
        j *= 2

很容易看出,每个 while 值最多执行一次内部 i,但我很难更一般地了解如何计算 {{1} 的最后一个值}} 以便使用 T(n) 在总和中执行相应的操作。谁能给出计算结果?

2 个答案:

答案 0 :(得分:2)

n = 10
j = 1
for i in range(n):
      while j < i:
        j *= 2

迭代 1:i = 11 < 1 为假;

迭代2:i = 21 < 2为真,=> j变为1 * 2 = 2; (i = 2j = 2);

迭代3:i = 32 < 3为真,=> j变为2 * 2 = 4; (i = 3j = 4);

迭代 4:i = 44 < 4 为假; (i = 4j = 4);

迭代 5:i = 54 < 5 为真,=> j 变为 2 * 4 = 8; (i = 5j = 8);

。 . .

那么在接下来的三个迭代中,j = 8 不会小于 i..

那么 j 将小于 9,依此类推。

因此,有些迭代中 j < i 的计算结果为 true,但即使在这些情况下,嵌套的 while 循环也不会存活很长时间。

它有点摊销,但总的来说,while j < i仍然是一个低得多的项。

因此,根据渐近测量,高阶为O(n)。

答案 1 :(得分:0)

我想我找到了一种更抽象的分析方法,它补充了之前的答案和评论。

请注意:

  1. j的变量while loop定义在for loop之外,这意味着如果满足j < ij 将被更新,然后发生 for loop 的新迭代,更新 i

  2. 由于 j 不会在 for loop 的每次迭代中重置为 1,因此我们期望 的运行次数为 O(n) < Log_2(n),这表明它是 O(1)。

  3. 通过检查(如上一个答案),我们可以确认 (2.),其中对于每个 i,while 循环最多运行一次。

评论:
我是这方面的新手,我正在寻找使用 sigma 符号的更封闭的数学证明,其方式与其他嵌套循环的情况类似,其中内部循环的总运行次数可以作为算术元素的总和找到或几何级数,例如,视情况而定。但是使用参数 (1.) 和 (2.) 是我能得到的更接近的。

无论如何,非常感谢您的帮助:)