首页 > 其他 > 详细

二分法

时间:2020-05-21 09:09:21      阅读:31      评论:0      收藏:0      [点我收藏+]

二分法

需求

# 需求:有一个按照从小到大顺序排列的数字列表
#      需要从该数字列表中找到我们想要的那一个数字
#      如何做更高效?

nums = [-3,4,7,10,21,43,77,89]
find_num = 77 # 代表本次要查找的数字

常规方法

# 需求:有一个按照从小到大顺序排列的数字列表
#      需要从该数字列表中找到我们想要的那一个数字
#      如何做更高效?

nums = [-3,4,7,10,21,43,77,89]
find_num = 77 # 代表本次要查找的数字

count = 1
for i in nums:
    if i == find_num:
        print("找到了,查找次数为:{}次".format(count))
        break
    count+=1
else:
    print("没找到,共查找了:{}次".format(count))

# 平常的做法,只能靠运气来找。如果被排列的数值在整个列表的后面,刚好列表又十分庞大,
# 那么花费的时间是非常久的。

# ==== 执行结果 ====

"""
找到了,查找次数为:7次
"""

递归实现二分法

# 需求:有一个按照从小到大顺序排列的数字列表
#      需要从该数字列表中找到我们想要的那一个数字
#      如何做更高效?

nums = [-3,4,7,10,21,43,77,89]
find_num = 77 # 代表本次要查找的数字
count = 0

def binary_search(find_num,li):
    global count # 传入计数器
    count+=1

    if not len(li): # 判断新切分的列表长度
        print("没找到,查找次数为:{}次".format(count))
        return

    li.sort() # 进行排序
    mid_index = len(li) // 2
    mid_val = li[mid_index]


    if find_num > mid_val:
        new_l = li[mid_index+1:]
        res = binary_search(find_num,new_l)
        return res # 由于是递归,所以地推阶段时要每一层都返回

    elif find_num < mid_val:
        new_l = li[:mid_index]
        res = binary_search(find_num,new_l)
        return res

    else:
        print("找到了,查找次数为:{}次".format(count))
        return find_num

binary_search(find_num,nums)

# 二分法,传入的列表必须是有序的。每次查找都先拿到中间值,
# 判断中间值与查找值的大小。如果查找值较大则切分右边列表,继续拿中间值
# 重复比较步骤...

# ==== 执行结果 ====

"""
找到了,查找次数为:2次
"""

二分法图解

 


            技术分享图片

 

 

 

 

 

二分法

原文:https://www.cnblogs.com/Yunya-Cnblogs/p/12927470.html

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