Pythonic版二分查找实现过程原理解析


Posted in Python onAugust 11, 2020

前提:升序数组,待查元素在数组中。

二分查找:就是一个递归函数c。待查元素a,当前数组中位数b,如果b=a则返回b的索引,b>a则在b左侧的子数组中调用函数c,否则在b右侧子数组中调用函数c。

第一次思考,按着上面的思路编程后的结果:

def binary_search(index, a, value):
  if a[(len(a) - 1) // 2] == value:
    return index + (len(a) - 1) // 2
  elif a[(len(a) - 1) // 2] < value:
    return binary_search(index + (len(a) - 1) // 2 + 1, a[(len(a) - 1) // 2 + 1:], value)
  else:
    return binary_search(index, a[0:(len(a) - 1) // 2 + 1], value)

第二次思考,简化中位数计算逻辑:

def binary_search(index, a, value):
  if a[len(a) // 2] == value:
    return index + len(a) // 2
  elif a[len(a) // 2] < value:
    return binary_search(index + len(a) // 2, a[len(a) // 2:], value)
  else:
    return binary_search(index, a[0:len(a) // 2], value)

第三次思考,去掉return,改为lambda形式:

binary_search = lambda index,a,value: index + len(a) // 2 if a[len(a) // 2] == value else binary_search(index + len(a) // 2, a[len(a) // 2:], value) if a[len(a) // 2] < value else binary_search(index, a[0:len(a) // 2], value)

以上就是二分查找变为“一行代码”版的过程。

运行测试:

if __name__ == '__main__':
  a = [1, 2, 33, 43, 52, 66, 88, 99, 111, 120]
  print(f"Target index: {binary_search(0, a, value=33)}")

结果如下:

Pythonic版二分查找实现过程原理解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python下尝试多线程编程
Apr 28 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
使用python实现链表操作
Jan 26 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
pandas 实现将NaN转换为None
May 14 Python
Python3合并两个有序数组代码实例
Aug 11 #Python
Python基于gevent实现文件字符串查找器
Aug 11 #Python
Python3如何实现Win10桌面自动切换
Aug 11 #Python
Python3如何使用多线程升程序运行速度
Aug 11 #Python
使用Python pip怎么升级pip
Aug 11 #Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 #Python
Python 代码调试技巧示例代码
Aug 11 #Python
You might like
php 生成饼图 三维饼图
2009/09/28 PHP
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
php 如何获取数组第一个值
2013/08/06 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
Yii2如何批量添加数据
2016/05/17 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
Vue 过滤器filters及基本用法
2017/12/26 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Python中的枚举类型示例介绍
2019/01/09 Python
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
派出所所长先进事迹
2014/05/19 职场文书
暑期教师培训方案
2014/06/07 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
清洁员岗位职责
2015/02/15 职场文书
百家讲坛观后感
2015/06/12 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python