为什么时间复杂度为O(log n)?

时间:2018-01-26 07:51:09

标签: algorithm time-complexity complexity-theory

int algorithm(int n) {
    int k = 0;
    while(n>1) {
       n=n/2;  // integer division
       k++;
    }
    return k;
}

时间复杂度为O(log n)?为什么呢?

3 个答案:

答案 0 :(得分:4)

如果您将n写为二进制数,例如11011011,则在循环退出之前所需的连续值为

11011011
 1101101
  110110
   11011
    1101
     110
      11
       1

因此,迭代次数(k的最终值)等于n的初始位数。从

2^(k-1) ≤ n < 2^k

这是具有k位的条件,你绘制

k-1 ≤ log2(n) < k.

答案 1 :(得分:1)

原因是循环,除法和加法中的操作是O(1)。现在,考虑一些m的n = 2 ^ m的迭代次数,并将此数字与log_2(n)进行比较。推广到n,这不是2的幂是很容易的。通过i(n)表示输入n的循环的迭代次数,并且取2 ^ m <1。 n&lt; 2 ^(m + 1),注意i(n)= i(2 ^ m)(谢谢,整数除法)。

答案 2 :(得分:1)

您反复将 n 除以2,直到达到1或更低。因此,您的停止条件(大致)由等式 n / 2 ^ k = 1 &lt; =&gt;表示。 n = 2 ^ k &lt; =&gt; log_2 n = k(/是代码中的整数除法)。允许粗糙度,因为我们正在处理 O(),并且常量将会消失。