首页 > 编程语言 > 详细

算法--二分查找

时间:2020-05-14 21:33:15      阅读:83      评论:0      收藏:0      [点我收藏+]

现有一个问题:

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

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)

 

算法--二分查找

原文:https://www.cnblogs.com/zhzhlong/p/12891152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!