练习 21:二分搜索

原文:Exercise 21: Binary Search

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

二分搜索算法是一个简单方法,在已排序的元素列表中查找元素。它很容易描述为接受排序列表,并将其分成两半,直到找到它或遍历完。如果你完成了练习 20,那么这个练习应该比较容易。

如果我们想在已排序的数值列表中找到数字X,我们将这样做:

  • 获取列表中间的数字(M)并将其与X进行比较。
  • 如果X == M,你就完成了。
  • 如果X > M,则在M + 1到列表末尾的区间内寻找。
  • 如果X < M,则在列表开头到M - 1的区间内寻找。
  • 重复它,直到找到X或者区间为空。

这适用于任何可以比较相等性的东西。它适用于字符串,数字和任何你可以排序的东西。

挑战练习

你的BSTree应该已经有了一个get操作,类似于二分搜索。不同的是BSTree已经分块了,所以没有必要再这么做了。在本练习中,你将为DoubleLinkedList和Python list实现二分搜索,并将其与BSTree.get的性能进行比较。你的目标是学习以下内容:

  • 对于简单的寻找元素,BSTree与 Python 的list相遇效果如何?
  • DoubleLinkedList的二分搜索有多糟糕?
  • BSTree的病态情况是否也会对list的二分搜索造成问题?

分析性能时,请不要包含排序数字所需的时间。这在进行全局优化时很重要,但在这种情况下,你只需要关心二分搜索的工作速度。你也可以使用 Python 内置列表的排序算法对list进行排序,因为这不是重点。这个练习完全关于,三种数据结构之间的搜索速度有多快。

研究性学习

  • 找出该算法需要执行的,最大的可能的比较数量。首先尝试自己弄清楚,然后研究算法来找出真正的答案。之后记住真正的答案。
  • 这里的任何优化可以应用于排序算法吗?
  • 尝试在每个数据结构中,可视化该算法正在做什么。例如,在DoubleLinkedList中,你几乎可以将其视为来回遍历,直到找到结果。
  • 为了给自己一个额外的挑战,尝试使DoubleLinkedList成为一个有序的链表,其中每次插入始终在排序后的位置。现在编写你的性能分析,包括添加元素和排序数字列表,来了解如何提高总体性能。

深入学习

研究其他搜索算法,特别是字符串。因为 Python 的字符串的实现方式,其中许多将很难在 Python 中实现,但是试一试吧。

笨办法学 Python · 续 练习 21:二分搜索相关推荐

  1. 笨办法学 Python · 续 中文版

    笨办法学 Python · 续 中文版 原书:Learn More Python 3 The Hard Way 译者:飞龙 自豪地采用谷歌翻译 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓 ...

  2. 笨办法学 Python · 续 练习 33:解析器

    练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...

  3. 笨办法学 Python · 续 练习 0:起步

    练习 0:起步 原文:Exercise 0: The Setup 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你需要设置和配置一些工具来学习此书.有可能你已经有了很多这些东西 ...

  4. 笨办法学 Python · 续 第二部分:简单的黑魔法

    第二部分:简单的黑魔法 原文:Part II: Quick Hacks 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你有最好的想法,你会打动世界!你会成为一个亿万富豪!你的大 ...

  5. 笨办法学 Python · 续 练习 52:`moreweb`

    练习 52:moreweb 原文:Exercise 52: moreweb 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 现在,你已经使用 Python http.server ...

  6. 笨办法学 Python · 续 练习 24:URL 快速路由

    练习 24:URL 快速路由 原文:Exercise 24: Fast URL Search 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我们将结束数据结构和算法的部分,并将 ...

  7. 笨办法学 Python · 续 练习 32:扫描器

    练习 32:扫描器 原文:Exercise 32: Scanners 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我的第一本书在练习 48 中非常偶然涉及到了扫描器,但现在我 ...

  8. 笨办法学 Python · 续 练习 22:后缀数组

    练习 22:后缀数组 原文:Exercise 22: Suffix Arrays 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 我想告诉你一个关于后缀数组的故事.在一段时间里, ...

  9. python描述器 有限状态机_笨办法学 Python · 续 练习 30:有限状态机

    练习 30:有限状态机 每当你阅读一本关于解析的书,都有一个可怕的章节,关于有限状态机(FSM).他们对"边"和"节点"进行了详细的分析,每个可能的" ...

最新文章

  1. mysql中有哪些数值型函数_mysql数值型函数汇总
  2. 经典C语言程序100例之六零
  3. 上拉加载_如何用Vue + Mint UI实现上拉加载更多
  4. python prettytable格式设置_Python prettytable模
  5. 【转】网站ICP备案和公安备案流程
  6. 主动降噪ANC(Active Noise Control)
  7. 使用阿里云对象存储OSS搭建网盘
  8. 如何在 Python 中使用 Plotly 创建太阳系的 3D 模型 (教程含源码)
  9. 【FreeSwitch开发实践】freeswitch配置wss证书问题 Encrypted Alert/Certification Unknown
  10. Cent OS7基础 第五节
  11. Java项目:毕业设计管理系统(java+SSM+jsp+mysql+maven)
  12. 计算机网络连接显示678是什么意思,WinXP宽带连接提示错误代码678怎么办?
  13. JVM参数-XX:+HeapDumpOnOutOfMemoryError使用方法
  14. Linux环境打包Qt程序并部署到Docker容器
  15. 安防百科-单了解ONVIF 协议
  16. jQuery插件综合应用(四)头像设置
  17. 二维数组求周长的问题
  18. u盘锁计算机,简单几步将U盘打造成电脑登录“密码锁”,不插入就别打开!
  19. SQL server 数据库多列分组查询
  20. Aqwa 带你掌握船舶与海洋工程水动力理论与工程应用

热门文章

  1. java ee 容器_javaee中web的四大容器简介
  2. C++ ifstream 读取文件大小和读取所有内容
  3. 06.QT菜单栏QAction学习(二)
  4. 【openMV】算法矫正镜头+视频格式对应的分辨率
  5. Mavlink 协议硬解析主要代码
  6. libevent源码深度剖析九
  7. linux 将任务挂到后台,linux下使用screen或则nohup将任务放到后台运行
  8. Mybatis与iBatis的主要区别对比
  9. Oracle_忘记密码
  10. iOS开发——高级技术PassBook服务