算法1——二分查找和时间复杂度

如何理解二分查找(binary search)?

当我们查字典,查电话时,有两种查询方式,一是简单查找,从头开始找,从字母A开始一页一页找;第二种是近似二分查找,如果我们要查询X开头的姓名,势必会直接翻到字典的后半部分,而不会从第一页开始一直翻到字母X的位置。

那么二分查找代表的是,每次从中间开始找。比如我们要从1-100中找出一个数字,例如80,按照二分查找的方法,先查100/2 = 50,50比80小,那么再查75,还是比80小,再查87,比80大,接下来再取75-87的中间数与80进行比较,最后查到80。那么对于1-100的100个数字,用二分查找法,我们最多需要查找几次呢?答案是log(100)。每次取一半,相当于每次除以2,一共100个数,我们要算的就是我们需要除以几次2。

这样看来,二分查找比简单查找要方便有效的多。但是二分查找必须是在有序条件下进行的,如果字典、电话簿不是按照字母排列,如果1-100个数字不是按照升序排列,那么二分查找就没有任何意义了。

关于时间复杂度(time complexity)

从字面意义上来理解,时间复杂度用来计算整个算法所耗用时间,但是用整个算法的增速来解释更为准确。上面我们提到,二分查找的时间复杂度是O(log100),如果是n个数,那么时间复杂度变为O(logn);相比较,简单查找的时间复杂度是O(n)。

算法1——二分查找和时间复杂度_第1张图片

从上面这幅图来看,一开始两者差别不大,但是当数量级变成100或者一亿的时候,简单查找的增速,时间复杂度就远远高于二分查找了。

代码实现(python)

def binarySearch(list, target):
  lo = 0
  hi = len(list) - 1
  while lo <= hi:
    mid = (lo + hi) // 2
    if list[mid] == target:
      return mid
    elif list[mid] < target:
      lo = mid + 1
    else:
      hi = mid - 1
  return None
Reference: 理解来源于《算法图解》

你可能感兴趣的:(算法)