二分查找的时间复杂度分析

222 阅读1分钟

为什么二分查找的时间复杂度是 O(logN)?

以下是大致的证明过程:

假设长度为 N 的数组,最多需要比较 f(N) 次才能找到目标元素。

  • 当 N 为1时,只需要比较一次,因此 f(1) = 1。
  • 当 N 为2时,先二分一次,然后在长度为1的子数组中查找,因此 f(2) = 1 + f(1)
  • 当 N 为3时,先二分一次,二分后的两个子数组长度都为1,因此 f(3) = 1 + f(1)
  • 当 N 为4时,有f(4) = 1 + f(2)
  • 重复上述步骤,当 N 为 n 时,得出比较次数为 f(n) = 1 + f(n/2)。其中,N/2 向下取整。

根据上述归纳,我们可以得出公式:

{f(1)=1f(N)=1+f(N/2)\begin{equation} \left\{ \begin{array}{l} f(1) = 1 \\ f(N) = 1 + f(N/2) \end{array} \right. \end{equation}

依次递推,我们可以得出:

f(N)=1+f(N/2)=1+1+f(N/4)=...=m+f(N/2m)f(N) = 1 + f(N/2) = 1 + 1 + f(N/4) = ... = m + f(N/2^m)

当 N/2^m =1,即 m = logN 时:

f(N)=logN+1f(N) = logN + 1

对于长度为N的数组,最多需要比较 logN + 1次。它的增长等级为 logN,因此二分查找算法的时间复杂度为 O(logN)。

参考资料:www.jianshu.com/p/4fe210d7a…