二分查找法

序言引在正式的聊二分法之前,我们先来看一下下面的小例子:l.index(66)…我们之所以用index方法可以找到,是因为python帮我们实现了查找方法。如果,index方法不给你用了。。

大家好,又见面了,我是你们的朋友全栈君。

序言引 

在正式的聊二分法之前,我们先来看一下下面的小例子:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

如果让你从这个列表中找到66的位置,你要怎么做?

l.index(66)…

我们之所以用index方法可以找到,是因为python帮我们实现了查找方法。如果,index方法不给你用了。。。你还能找到这个66么?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

i = 0
for num in l:
    if num == 66:
        print(i)
    i+=1

上面这个方法就实现了从一个列表中找到66所在的位置了。

但我们现在是怎么找到这个数的呀?是不是循环这个列表,一个一个的找的呀?假如我们这个列表特别长,里面好好几十万个数,那我们找一个数如果运气不好的话是不是要对比十几万次?这样效率太低了,我们得想一个新办法。

二分查找算法

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

<span role="heading" aria-level="2">二分查找法 

这就是二分查找算法

那么落实到代码上我们应该怎么实现呢? 

简单版二分法

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(l,66)
func(l,6)

升级版本二分法

def search(num,l,start=None,end=None):
    start = start if start else 0
    end = end if end else len(l) - 1
    mid = (end - start)//2 + start
    if start > end:
        return None
    elif l[mid] > num :
        return search(num,l,start,mid-1)
    elif l[mid] < num:
        return search(num,l,mid+1,end)
    elif l[mid] == num:
        return mid

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124500.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据数据建模[通俗易懂]

    大数据数据建模[通俗易懂]今天给大家分享一下 数据开发工作中数据建模的步骤,                           第一步:选择模型或者自定义模型这第一步需要我们基于业务问题,来决定我们需要选择哪种模型,目前市场中有很多模型可以供我们选择,比如,如果要预测产品销量,则可以选择数值预测模型(比如回归模型,时序预测……);如果要预测员工是否离职,则可…

    2022年5月3日
    100
  • io流怎么用_io流java

    io流怎么用_io流java相信大家都能体会到,io流用到的地方很多,就比如上传下载,传输,设计模式等….基础打扎实了,才能玩更高端的。在博主认为真正懂IO流的优秀程序员每次在使用IO流之前都会明确分析如下四点:>(1)明确要操作的数据是数据源还是数据目的(也就是要读还是要写)(2)明确要操作的设备上的数据是字节还是文本(3)明确数据所在的具体设备(4)明确是否需要额外功能(比如是否需要转换流、高效流等)

    2022年10月20日
    4
  • Java考试题30道(附答案)

    Java考试题30道(附答案)1. 在WEB-INF目录下,必须存放的文件为:   BA.class文件B.web.xmlB.jar文件D.html文件2.下面哪个不是JAVA关键字  A  A integer  B double  C float  D default3. 构造函数何时被调用( )  BA.类定义时B.创建对象时C.调用对象方法时D.使用对象的变量时4. 下面哪项不是respons…

    2025年6月2日
    3
  • C++进制转换(十进制转二进制、八进制、随意进制)

    C++进制转换(十进制转二进制、八进制、随意进制)

    2021年12月14日
    104
  • 数据库导入sql文件_mysql导入sql文件命令

    数据库导入sql文件_mysql导入sql文件命令Sql文件导入数据库-保姆级教程,铁打的保姆,希望对大家能有所帮助,不要忘了点赞+收藏哦

    2022年10月2日
    2
  • FORM表单

    FORM简介我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否

    2022年3月29日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号