1. 之前分析了好多排序算法,可难理解了呢!!(泣不成声)
    这次我要把二分查找总结一下,这个算法不算难度特别大,欢迎大家参考借鉴
  2.  
  3. 我不喜欢太官方的定义,太晦涩的语言,让人看了就头晕。我希望加入我自己的理解,能帮助大家更好的理解算法的原理
    同时也欢迎大家批评指正
  4.  
  5. 二分查找:
    我们手里有一个长度为n的正序数列,当我们想查找一个数 x是否在这个数列当中的时候
    1 取数列正中间的数mid
    如果midx相等,则找到结果,查找成功 返回True
    如果midx大,则x应该在mid的左侧,我们把mid左侧当作一个新的数列li
    如果midx小,则x应该在mid的右侧,我们把mid右侧当作一个新的数列li
    2 对于新的数列li 进行1的查找工作
  6.  
  7. 3 一直重复上面查找,生成新的数列li为空的时候则 数列当中没有数x 返回False
  8.  
  9. 时间复杂度:最优O(1) 我们取第一次中间数mid 找到了 这种概率很低
    最坏O(log n) 假设n个数的数列,每次把数列分成两半,n除以多少次2 等于1 呢? log n
  10.  
  11. 首先我们用递归的方式实现二分查找算法:
  1. #递归实现二分查找 li是列表 item是要查找的元素
  2. def merge_search( li ,item ):
  3. #传来的列表每次都是新生成的,如果发现里面没有元素,则是查找到尽头都没找到
  4. if not li :
  5. return False
  6.  
  7. mid = len(li)//2 #mid记录li的中间位置
  8. #检查一下 如果中间这个数就是要找的元素 返回真
  9. if li[mid] == item :
  10. return True
  11. # 如果mid比item大,说明item可能会出现在mid左边,对左边再查找
  12. elif li[mid]> item :
  13. return merge_search( li[:mid] ,item )
  14. # mid 比item小,说明item有可能在mid右边,对右边再查找
  15. else :
  16. return merge_search( li[mid+1:] , item )
  17.  
  18. if __name__ == '__main__':
  19. li = [1,2,3,4,5,6,7]
  20. print( merge_search(li , 0) ) #False
  21. print( merge_search(li , 1) ) #True

下面我们尝试用while循环去实现二分查找:

  1. def merge_search( li , item ):
  2. #获取li的开始 结束
  3. start = 0
  4. end = len(li)-1
  5.  
  6. #只要start和end 还没错开 就一直找
  7. while start <= end :
  8. #通过计算获取当前查找范围的中间位置
  9. mid = (start + end)//2
  10. #如果中间数就是item则返回True
  11. if li[mid] == item :
  12. return True
  13. #如果mid比item大,说明item可能会出现在mid左边,对左边再查找
  14. elif li[mid]> item :
  15. end = mid - 1
  16. # mid 比item小,说明item有可能在mid右边,对右边再查找
  17. else :
  18. start = mid + 1
  19. #跳出循环说明没找到 返回错误
  20. return False
  21.  
  22. if __name__ == '__main__':
  23. li = [1,2,3,4,5,6,7,8]
  24. print( merge_search(li , 8) ) #True
  25. print( merge_search(li , 0) ) #False

OK 以上就是两种实现二分查找的方法。

因为思想相同,他们的时间复杂度是一样的。

但是递归的方式,每次都要开新的列表,实际上空间复杂度会更大一些。

  1.  
  2. 谢谢你的观赏~欢迎大家批评指正!
  3.  

python中两种方法实现二分法查找,细致分析二分法查找算法的更多相关文章

  1. Python中两种处理错误方法的比较

    我所说的处理错误的方法,其实是try:,except和raise这两种. 首先抛出一个实例, dictt={'a':1,'b':2,'c':3} try: if dictt['d']>1: #字 ...

  2. HTML5中两种方法实现客户端存储数据

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  3. python中两种栈实现方式的性能对比

    在计算机的世界中,同一个问题,使用不同的数据结构和算法实现,所使用的资源有很大差别 为了方便量化python中算法的资源消耗,对性能做测试非常有必要,这里针对stack做了python语言 下的性能分 ...

  4. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  5. python中两种拷贝目录方法的比较

    首先是用python自己的api: shutil.copytree('./build/tested/doc', './build/tested/build/doc') 优点是改变平台时不需要修改代码, ...

  6. 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解

    方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二   1. 方法一: 思路: 1. 新创建一个链表节点头,假设这里就叫 head3: 2. 因为另外两个链表都为单调递增,所 ...

  7. Python学习--两种方法爬取网页图片(requests/urllib)

    实际上,简单的图片爬虫就三个步骤: 获取网页代码 使用正则表达式,寻找图片链接 下载图片链接资源到电脑 下面以博客园为例子,不同的网站可能需要更改正则表达式形式. requests版本: import ...

  8. 求逆元的两种方法+求逆元的O(n)递推算法

    到国庆假期都是复习阶段..所以把一些东西整理重温一下. gcd(a,p)=1,ax≡1(%p),则x为a的逆元.注意前提:gcd(a,p)=1; 方法一:拓展欧几里得 gcd(a,p)=1,ax≡1( ...

  9. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

随机推荐

  1. WordPress给网站添加支付宝捐赠功能

    最开始是在陌小雨的博客上看见这个功能,其实一般个人网站都会添加这个功能,下面我会讲解两种,不多说,上图: 1.添加到网页中任何位置: 上图这个功能可以添加到网页中的任何位置,可以在文章中添加,也可以利 ...

  2. 引用第三方dll引发的问题解决

    引用的程序集错误  如果引用第三方dll,调试出现引用的程序集出现错误,可以下载dependency,查看这个dll的依赖dll,如果本地电脑没有依赖dll或依赖dll出现问题,则下载或取代依赖dll ...

  3. cesium Animation显示系统时间

    var d = new Date(); var hour = 0 - d.getTimezoneOffset(); viewer.animation.viewModel.timeFormatter = ...

  4. zabbix自定义key监控memcache状态及其他服务进程

    一.在客户端 1.到/usr/loca/zabbix/conf/zabbix_agentd.conf里添加         UserParameter=memcached_stats[*],(echo ...

  5. APS期刊投稿准备: REVTex格式

    APS是American Physics Society的简称.旗下比较有影响力的期刊有: "pra, prb, prc, prd, pre, prl, prstab, prstper, o ...

  6. Dependency Walker的替代品Dependencies

    在c++时代, Dependency Walker基本上是大部分程序员必备的工具之一,很可惜的是从2006起就不更新了.而且只支持vc的名字undemangle, https://github.com ...

  7. 关于Linux中文件,链接的一些思考

    在Unix系统中,操作系统为磁盘上的文本与图像,鼠标键盘操作,网络交互等IO操作设计了一组通用API. 使他们被处理的时候可统一用字节流的方式.所以说,除了进程之外,其他的一切均可看做文件. Linu ...

  8. Kaggle竞赛 —— 房价预测 (House Prices)

    完整代码见kaggle kernel 或 Github 比赛页面:https://www.kaggle.com/c/house-prices-advanced-regression-technique ...

  9. [福大软工] W班 第2次成绩排行榜

    作业链接 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/866 评分细则 本次个人项目分数由三部分组成 ...

  10. alpha-咸鱼冲刺day7

    一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在写登陆+注册ing 注册搞出来了!!!!!!!!QAQ(喜极而泣!!!!.jpg) 四,问题困难 数据流程大概是搞定了.不过 ...