算法--二分查找

现有一个问题:

  给一个列表,以及一个元素,返回: 元素的下表或未查找到元素

1. 顺序查找

从列表第一个元素开始,顺序进行搜索,直到找到为止。

时间复杂度:O(n)

2. 二分查找

从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

示例:列表[1,2,3,4,5,6,7,8,9],使用二分查找来查找3

图一: 待查找值3与中间值mid比较

 

图二: 候选区减少一半

 

 

图三: 再次比较

 

 

图四: 候选区再次减少一半

 

 

图五: 最后要么找到,要么没有

 

 

循环版本:

善用low high mid mid+1 mid-1 ,比切片好, 时间度O(n)

li = list(range(10))

def foo(li, arg):                   # 时间复杂度: O(logn)
    low = 0
    high = len(li) - 1          # high/low是索引(下标)
    while low <= high:
        mid = (high + low) // 2
        if arg < li[mid]:
            high = mid - 1
        elif arg > li[mid]:
            low = mid + 1
        else:
            return mid
    return None

print(foo(li, 3))
# 3

递归版本:

def binary_search(lst, arg, low, high): 
    if low <= high:
        mid = (low + high) // 2
        if arg > lst[mid]:
            return binary_search(lst, arg, mid + 1, high)
        elif arg < lst[mid]:
            return binary_search(lst, arg, low, mid - 1)
        else:
            return mid
    else:
        return None


li = list(range(10))
print(binary_search(li, 3, 0, len(li) - 1))

时间复杂度: O(logn)

 

posted @ 2020-05-14 20:22  静静别跑  阅读(145)  评论(0编辑  收藏  举报