二分查找法

序言引在正式的聊二分法之前,我们先来看一下下面的小例子: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年3月29日 下午4:00
下一篇 2022年3月29日 下午4:00


相关推荐

  • LeapFTP 注册码

    LeapFTP 注册码LeapFTPv2 7 6 613 汉化版 II 特别版 Name crskyCode 214065 658136565htt www crsky com soft 664 htmlLeapFTPv 7 6 613 英文版 http www crsky com soft 378 htmlName crskyCode 214065 658136565Lea

    2025年8月8日
    3
  • 大数据教程,大数据学习线路图

    大数据教程,大数据学习线路图前言先引用一下马云大大的话:很多人还没搞清楚什么是PC互联网,移动互联网来了,我们还没搞清楚移动互联的时候,大数据时代又来了。马云深度解析大数据“大数据”是近年来IT行业的热词,并广泛的应用在各行各业。特别是近年来随着社交网络、物联网、云计算以及多种传感器的广泛应用,以数量庞大,种类众多,时效性强为特征的非结构化的数据不断涌现,数据的重要性愈发凸显,传统的数据存储、分析技术难以实时处…

    2022年5月22日
    72
  • 素数算法总结

    素数算法总结素数算法总结转载自:_Wilbert在平时做题目或者进行预算的时候,素数的出现次数总是十分频繁。今天我们就来一点一点的说一说关于素数的一些算法。素数算法总结朴素判断素数算法Miller_Rabin素性测试筛选法容斥原理Meissel-Lehmer算法朴素判断素数算法就判断素数而言,事实上是非常简单的了。根据定义,判断一个整数n是否是素数,只需要去判断在整数区间[2,n-1]之内

    2022年6月18日
    25
  • java pfx_如何在Java处理PFX格式证书

    java pfx_如何在Java处理PFX格式证书如何在Java处理PFX格式证书公钥加密技术12号标准(PublicKeyCryptographyStandards#12,PKCS#12)为存储和传输用户或服务器私钥、公钥和证书指定了一个可移植的格式。它是一种二进制格式,这些文件也称为PFX文件。开发人员通常需要将PFX文件转换为某些不同的格式,如PEM或JKS,以便可以为使用SSL通信的独立Java客户端或WebLogicServe…

    2022年5月1日
    119
  • JavaScript进阶(八)JS实现图片预览并导入服务器功能

    JavaScript进阶(八)JS实现图片预览并导入服务器功能JS实现导入文件功能赠人玫瑰,手留余香。若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉!(PS:此篇博文是自己在午饭时间所写,为此没吃午饭,这就是程序猿的生活。)项目开发过程中,需要实现文件上传功能。借此机会学习之。使用HTML中现有的inputtype“file”可以支持这一功能。如下所示:

    2022年7月14日
    20
  • 树莓派安装pycharm

    树莓派安装pycharm一 点击此链接点击 Tools 点击 PyCharm 点击 Download 点击 Linux 下载 Community 版本二 U 盘拷贝至树莓派 home pi 文件夹下三 输入命令 lspycharm community 2020 2 4 targz 找到文件四 输入命令 tar xvzfpycharm community202 2 4 tar gz C 进行解压即可安装在 home 目录中

    2026年3月26日
    1

发表回复

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

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