在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下。而二分查找的效率往往会比线性查找更高。

一.二分查找的步骤

二分查找的步骤首先是将列表进行升序或者降序排列,否则无法进行数字的比较,也就无法进行二分查找。然后找到一个列表的中间数值(mid),如果列表当中的数字和为基数,则为最中间的那个数。如果为偶数,则为最中间的那两个数的左边那一个,比如说我们有一个列表,[1,2,3,4,5,6],列表当中的数字为偶数个,那么mid则是3。找到mid之后,再和我们需要查找的数字进行比较,如果比我们需要查找的数字要小,那么就让low=mid+1,即在Mid的右边一个,如果比我们需要的数字要大,则让high=mid—1,在high的左边一个,利用夹逼法直到mid等于var的时候这个时候在返回mid的值,这个值就是我们数字所在的顺序数,在列表当中的order或称index(索引)。我们下面一张图来表示二分查找的步骤,下面是举了一个最为简单的列子,数字的个数仅为4个,且为1,2,3,4。

假设我们想要找的数字为3的index,因此首先在第一次循环当中,1=low,4=high,mid=2,我们令var=3,也就是我们想要找的数为var,发现这个数的数值是比mid的数值更大的,因此low=mid+1,此时mid所代表的数值变成了3。紧接着我们进行下一次循环,我们发现var和mid是相等的,因此返回mid的数值(并非mid所对应在列表当中的数值,而是mid自己的值),这样就可以得到var的索引值了!实现的程序如下:

#首先咱们来看一个线性查找,这个的效率比较低

li = [1,2,3,4,0,4,2,3]#print(6 in li)# 这个就是线性查找,看6是否在里面#print(li.index(6))# 看6在第几个index

li.sort()print("进行排序之后的列表为:{}".format(li))defbin_search(li, var):

low=0

high= len(li) - 1

while low<=high:#这里不能够使用while true!!不然输入一个不存在的值的话就会导致mid做了加减法后low比high大或者high比Low小,失去了比较的意义

mid = (low + high) // 2

if li[mid] ==var:returnmidelif li[mid]

low= mid + 1

else:#li[mid] > var

high = mid - 1

return -1

#二分查找的时间复杂度为log(n)

if __name__ == "__main__":print(bin_search(li, 3))

在程序当中需要注意的是循环while的判断条件是low<=high,因为如果在输入的值var不属于列表的情况下,运算到最后low就会大于high,这种情况下是应该直接返回-1的,而不是继续运算到无穷无尽。在这个程序当中我们设定了列表li,并通过定义二分查找函数来执行二分查找的过程。程序也很通俗易懂,和之前我们讲过的二分查找的步骤是一样的,下面我们来看一个利用二分查找的例题:

二.例题

这个例题节选自悉尼大学“Python编程”这门课的每周同步编程练习,题目是这样的:

输入一个序列,然后让整个序列变成一个有序的列表,最后找到数字8在这个列表当中的位置,我们可以使用二分查找来做这道题目,标准的Example如下:

现在我们使用二分查找算法来实现这个问题,首先是输入的字符串用input()函数来进行接收,但是接收之后的数字是字符串,我们需要使用split()函数将其每一个元素通过间隔开,由于使用了split()函数,因此就会自己动返回一个列表,不过里面每一个数字也还是string型,我们再利用一个for循环将其改变为int型,再重新灌入一个列表当中,形成interger型的列表,也就是我们第二个的输出结果,最后运用咱们刚才的二分查找法,得到数字8的index值,程序如下:

defbinary_search(list, var):

low=0

high= len(list)-1

while low <=high:

mid= (low+high)//2

if list[mid] ==var:returnmidelif list[mid]

low=mid+1

else:

high=mid-1

return -1a= input("Enter some integers:")

a= a.split(",")print(a)

ls=[]for i ina:

b=int(i)

ls.append(b)print("我们得到的数组是:{}".format(ls))#将列表进行升序排列,这样才可以使用二分查找算法

ls.sort()print(ls)if __name__ == "__main__":print(binary_search(ls,5))

输出结果如下:

E:\conda\python.exe F:/computer/datast/T4Q6P4.py

Enter some integers:23,4456,234,67,5['23', '4456', '234', '67', '5']

我们得到的数组是:[23, 4456, 234, 67, 5]

[5, 23, 67, 234, 4456]

0

今天的教程就到这里了!希望你看了之后会有收获!

python实现二分查找_数据结构和算法:Python实现二分查找(Binary_search)相关推荐

  1. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  2. 数据结构与算法python版 期末考试_数据结构与算法Python版期末在线考试OJ部分

    1 二叉树路径(10分) 题目内容: 给定一个二叉查找树的节点插入顺序,请重新构建这个二叉查找树,并按从左至右顺序返回所有根节点至叶节点的路径 输入格式: 一行整数,以空格分隔 注:测试用例中不包含重 ...

  3. mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...

    中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...

  4. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  5. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

  6. python数据结构视频百度云盘_数据结构与算法Python视频领课

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 课程简介: 本课程包含Python编程基础的基本语法及变量,基本数据结构,Code Structure,Function.让学生在学会Python基础的同 ...

  7. d - 数据结构实验之查找四:二分查找_数据结构与算法笔记

    二分查找(上):如何用最省内存的方式实现快速查找功能? 二分查找(下):如何快速定位IP对应的省份地址? 变体一:查找第一个值等于给定值的元素 变体二:查找最后一个值等于给定值的元素 变体三:查找第一 ...

  8. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  9. node 获取表单数据 为空_数据结构与算法(python)单向链表篇

    链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...

最新文章

  1. 初步了解Linux strace 命令和跟踪进程产生的系统调用
  2. 货郎问题:回溯法和限界分支法
  3. 设计移动App的十大技巧
  4. 通用智能传感集线器(Sensorhub)介绍
  5. java的serversocket_Java ServerSocket 实现聊天室功能(简易版)
  6. 【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解
  7. 苹果电脑如何使用Tuxera NTFS for mac抹掉NTFS格式
  8. 2020 cr节目源_2020最新直播源
  9. 不显示BOM清单的版本
  10. 移动硬盘只显示盘符,拒绝访问解决方法
  11. 腾讯视频qlv格式转MP4格式
  12. VMware Workstation Pro详细安装教程
  13. idea页面不显示鼠标光标了?_Mac鼠标光标消失怎么办?苹果电脑鼠标指针不显示的解决方法
  14. Git 切换分支的命令
  15. js实现颜色从蓝色渐变到红色
  16. 1100 Mars Numbers
  17. 学点历史-欧洲君主命名
  18. signature=da0cbfb45ebebe4ea0118c0a20df185e,MS15-018:Internet Explorer 累积安全更新:2015 年 3 月 10 日...
  19. 微信拍一拍怎么设置?详细教程,图文分享
  20. 如何网上打印公司章程?网上打印公司章程的流程

热门文章

  1. 周志华机器学习:决策树
  2. 电脑网络里面无法显示本计算机,电脑的本地连接不见了怎么办 电脑的本地连接不见了解决方法...
  3. QTableView 设置行间距
  4. 读wildmagic和ogre源码的感受
  5. Centos6.6安装简易桌面环境
  6. win10系统笔记本电脑修改注册表设置自动锁屏时间的方法
  7. iis6.0的网站建设及权限设置
  8. 爬取(明星网)明星面部数据
  9. 数据处理:1 用pandas处理大型csv文件 2 使用Pandas分块处理大文件 3 分块读取
  10. 妙手回春,AI修复让老旧视频重焕新生