当前位置: 首页 > news >正文

6.7 二分查找

(1)查找:

  查找是在一个项目集合中找到一个特定项目的算法过程。查找通常的答案是真的或假的,因为该项目是否存在。 查找的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找

(2)二分查找:

  二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

  

(3)代码实现:

 1 # 二分查找 非递归实现
 2 def binary_search1(alist, item):
 3     """二分查找,非递归"""
 4     n = len(alist)
 5     first = 0
 6     last = n-1
 7     while first <= last:
 8         mid = (first + last) // 2
 9         if alist[mid] == item:
10             return True
11         elif item < alist[mid]:
12             last = mid - 1
13         else:
14             first = mid + 1
15     return False
16 
17 # 二分查找 递归实现
18 def binary_search2(alist, item):
19     """二分查找,递归"""
20     n = len(alist)
21     if n > 0:
22         mid = n // 2
23         if alist[mid] == item:
24             return True
25         elif item < alist[mid]:
26             return binary_search2(alist[:mid], item)
27         else:
28             return binary_search2(alist[mid+1:], item)
29     return False
30 
31 
32 if __name__ == "__main__":
33     li = [17, 20, 26, 31, 44, 54, 55, 77, 93]
34     print("非递归版本:")
35     print(li)
36     print(binary_search1(li, 55))
37     print(binary_search1(li, 100))
38 
39     print("-"*50)
40 
41     print("递归版本:")
42     print(binary_search2(li, 55))
43     print(binary_search2(li, 100))

(4)运行结果:

  

(5)时间复杂度:

    最优时间复杂度:O(1)

    最坏时间复杂度:O(logn)

转载于:https://www.cnblogs.com/si-lei/p/9267441.html

相关文章:

  • oracle手工收集awr报告_oracle手工生成AWR报告方法
  • 《杜拉拉升职记》//TODO
  • php缓存accestoken_php微信开发(1):缓存access_token的方法
  • git 更新代码到本地
  • python subprocess使用_python subprocess使用-阿里云开发者社区
  • tomcat日志神器--kibana
  • python计算相同生日概率_用python计算下一个生日前的天数
  • java保证多线程的执行顺序
  • php 文本显示一部分_使用简单,功能全面的 PHP 命令行应用库
  • jzoj4196 二分图计数 解题报告(容斥原理)
  • 华为上半年手机销量_国产手机上半年销量出炉:小米华为所向无敌
  • Python2与Python3区别
  • 计算混响时间的意义_计算你房间的混响时间
  • cordova打开文件_cordova插件之下载文件并打开
  • Fragment切换返回
  • 分享一款快速APP功能测试工具
  • [译] React v16.8: 含有Hooks的版本
  • AWS实战 - 利用IAM对S3做访问控制
  • CAP 一致性协议及应用解析
  • CentOS7简单部署NFS
  • Go 语言编译器的 //go: 详解
  • java多线程
  • JAVA之继承和多态
  • java中具有继承关系的类及其对象初始化顺序
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • learning koa2.x
  • Quartz初级教程
  • WePY 在小程序性能调优上做出的探究
  • 计算机在识别图像时“看到”了什么?
  • 经典排序算法及其 Java 实现
  • 手写双向链表LinkedList的几个常用功能
  • 阿里云ACE认证学习知识点梳理
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​Spring Boot 分片上传文件
  • # .NET Framework中使用命名管道进行进程间通信
  • # 飞书APP集成平台-数字化落地
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $$$$GB2312-80区位编码表$$$$
  • (3)(3.5) 遥测无线电区域条例
  • (4)logging(日志模块)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • .NET MVC第三章、三种传值方式
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET下的多线程编程—1-线程机制概述
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [CERC2017]Cumulative Code
  • [CF543A]/[CF544C]Writing Code