首页 > 其他 > 详细

二分查找

时间:2020-05-31 23:56:24      阅读:98      评论:0      收藏:0      [点我收藏+]

面试官:会二分查找吗?来,写一下

def binary_search(alist,num):
    n = len(alist)
    
    if len(alist) == 0:
        return False
    mid = n // 2
    
    if alist[mid] == num:
        return True
    elif alist[mid] < num:
        return binary_search(alist[mid+1:],num)
    else: 
        return binary_search(alist[0:mid],num)

if __name__ == "__main__":
    li = list(range(1,40,4))
    
    
    print(binary_search(li,23))


# def binary_search(alist, item):
#     if len(alist) == 0:
#         return False
#     else:
#         midpoint = len(alist)//2
#         if alist[midpoint] == item:
#           return True
#         else:
#           if item < alist[midpoint]:
#             return binary_search(alist[:midpoint],item)
#           else:
#             return binary_search(alist[midpoint+1:],item)

 

面试官:假如我找不到这个数,我需要返回这个数的所在区间,你怎么改:

答:再开两个变量,用以记录每次比较的 alist[mid],

def binary_search(alist,num,left=0,right=0):
    n = len(alist)

    if len(alist) == 0:
        return [left,right]
    mid = n // 2

    if alist[mid] == num:
        return True
    elif alist[mid] < num:
        left = alist[mid]
        return binary_search(alist[mid+1:],num,left,right)
    else:
        right = alist[mid]
        return binary_search(alist[0:mid],num,left,right)

还有一种就是让你返回和寻找的目标值接近的数,就比较一下左边界和由边界即可得到

 

面试官:那么给你的输入类似于这样的,li = [21, 25, 29, 33, 37,1, 5, 9, 13, 17, ],它原本是一个有序的数组,循环移动过了一些元素,现在我需要找到里面的最小数,你会用什么办法

1.最直接的就是 res = min(li),但这多半被扣分,
2.直接遍历,冒泡得到最小的,O(n),效果一般般,
3.前面他问这么多二分查找,只用二分查找得到转折的区间,那个小的数就是最小数了
li[mid] 和 li[-1] 进行比较,37 > 17,说明最小数在 li[mid+1:]
反之说明在 li[:mid+1] 这里的 mid+1 要取到,不然可能遗漏了一点
def minnums(ali):
if len(ali) == 0:
return
elif len(ali) == 1:
return ali
elif len(ali) == 2:
if ali[0] < ali[1]:
return ali[0]
else:
return ali[1]
else:
mid = len(ali) // 2
if ali[mid] > ali[-1]:
return minnums(ali[mid+1:])
else:
return minnums(ali[:mid+1])

 

二分查找

原文:https://www.cnblogs.com/xtoshii/p/13022245.html

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