二分法查找

  如果让你在一堆数中,查看某个数是否存在?你会怎么找?

  按常识是不是一个一个看过去?这个我们就叫顺序查找

  最好的情况就是看到第一个就是你要的,就不会往下看了,但是如果是最后一个数是你想要的,这种情况下,查看次数就变成了数字的个数

  如果数很多时,比如亿计,会不会觉得效率很低

def linear_search(li, val):
    for ind, v in enumerate(li):
        if v == val:
            return ind
    else:
        return None

 

  下面我们介绍的二分法查找,要比顺序查找有效的多,但是前提示是这堆数字要有序

  实现思路大体如下:

  • 取最中间数,拿它和查找值比较
  • 如果中间数大(假设数是从小到大排),那说要找的数在左边,排除右边
  • 取左边一半里的中间数,和查找值比较,这样又可以排除一半,这循环下去,直到找到或得到没有这个数

   编写二分法查找的代码时,注意左右边界的变化,以及取中间值比较,一直循环的条件就是左右边界不碰头left<=right

def binary_search(li, val):
    left = 0
    right = len(li) - 1
    while left <= right:    # 候选区有值
        mid = (left + right) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val: # 带查找的值在mid左侧
            right = mid - 1
        else: # li[mid] < val 带查找的值在mid右侧
            left = mid + 1
    else:
        return None

  总结:二分法查找前提是有序的,当然排序也又是要多花时间的,用不用二分法查找看场景,如果你只是查一次,那二分法查找,反而更慢,因为排序,如果你查好多次,那就可以排好一次好,复用二分法查找

posted @ 2018-12-18 14:13  财经知识狂魔  阅读(260)  评论(0编辑  收藏  举报