大O时间复杂性令人困惑的while循环

时间:2015-10-02 22:04:24

标签: while-loop big-o time-complexity

作为一个时间复杂性的例子(刷新我的想法)我试图解决以下算法的运行时间(以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循环的运行时间感到有些困惑。虽然我知道while循环在第一次执行时运行两次,然后是4次,然后是6 ...所有的2的倍数。这会让它运行O(nlog(n))次吗?

2 个答案:

答案 0 :(得分:1)

重复除法为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)

答案 1 :(得分:0)

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

第一个为i的每个值执行i次 第三个,j从2 ^ i开始,并且成功地被2分割,因此它也执行了i次。

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

相关问题