Big O - 时间复杂度令人费解的 while 循环

Big O - Time Complexity puzzling for while loops

作为一个时间复杂度的例子(让我耳目一新),我试图解决找到以下算法的 运行ning 时间(在 n 方面):

for (i=1; i <= n; i++) {      //O(n)
  k = 1;
  for (j=1; j <= i; j++) {    //O(n)
    k = 2*k;
  }
  j = k*k;
  while (j > 1) {             //O(..?)
    j = j / 2;
  }
}

我理解前两个 for 循环加起来需要 O(n^2),但是我对如何找到 while 循环的 运行ning 时间有点困惑。虽然我知道 while 循环 运行s 第一次执行两次,然后是 4 次,然后是 6 次……都是 2 的倍数。这是否会使它成为 运行 O(nlog(n)) 次?

重复除法为log_2(j),与log(j) / log(2)相同。 log(2) 是常量,所以写成 log(j).

因为 O(log(n))O(n) 循环的深度相同,而 O(n) 循环使 O(log(n)) 循环相形见绌,因此两者合并需要 O(n) 时间。

最终时间复杂度为O(n^2)

对于 i 的每个值,我们执行两个循环。

第一个对每个i值执行i次 第三个,j从2^i开始,除以2成功,所以也执行了i次。

总共有 O(1+2+..+n) ~ O(n(n+1)/2) ~ O(n^2)