PYTHON学习之-----二分算法

什么是算法?

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态.

二分算法

假设要在电话簿中找一个名字以K打头的人,(现在谁还用电话簿!)
可以从头开始翻页,直到进入以K打头的部分。但你很可能不这样做,而
是从中间开始,因为你知道以K打头的名字在电话簿中间。
又假设要在字典中找一个以O打头的单词,你也将从中间附近开始。

这是一个查找问题,在前述所有情况下,都可使用同一种算法来解决问题,这种算法就是二分查找。
二分查找是一种算法,其输入的是一个有序的元素列表,如果要查找的元素包含在列表中,二分查找会返回其位置,否则会返回null.

举个例子:
你在1-100之间选择一个数字,我的目标是以最少的次数猜到这个数字,每次猜测后,你会说,小了,大了,或对了. 假如我从1,开始依次往后猜,过程便会是 ,1,小了…直到我说对,如果你选的数是99,那我就要说99个数字,而你会说98次小了和1次对了.
这是简单查找,或者说是傻找.
第二种方法 就是 我先从50开始,你会说小了,但是排除了1-50这个区间的所有数字,接下来,我猜75,大了,那余下的数字又排除了一半,使用二分算法时,猜测的都是中间的数字,从而每次都可以将余下的数字排除一半,接下来我猜63,大了,最后我猜57,对了

这样不过我猜那个数字,都可以在7次之内找到.

下面 我们来看看如何编写执行二分查找的Python代码。这里我们使用了数组,什么是数组呢?

你只需知道,可将一系列元素存储在一系列相邻的桶即是数组

这些桶从0开始编号:第一个桶的位置为#0,第二个桶为#1,第三个桶为#2,以此类推

函数binary_search接受一个有序数组和一个元素。如果指定的元素包含在数组中,这个函数将返回其位置。你将跟踪要在其中查找的数组部分——开始时为整个数组。

def binary_search(list, item):  # 其输入的是一个列表和查找的元素
    a = 0   # 数字在0~列表的长度之间
    b = len(list) - 1
    while a <= b:   # 判断列表之中是否存在数字
        find_num = (a + b)      # 找到列表中间的那个数字
        num = list[find_num]
        if num == item:     # 判断查找的元素是否就是列表中间的数字
            return find_num     # 若是则返回中间的那个数字
        elif num > item:        # 若中间的那个数字大于查找的数字
            b = find_num - 1        # 则将查找范围的尾减半
        else:                   # 若中间的那个数字小于查找的数字
            a = find_num + 1        # 则将查找范围的首减半
    return None


my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 5))        # 结果为2
print(binary_search(my_list, -5))       # 结果为None
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值