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单线程实现多个定时器示例
Mar 30 Python
python错误处理详解
Sep 28 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python实现人民币大写转换
Jun 20 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
利用Python计算KS的实例详解
Mar 03 Python
Python requests上传文件实现步骤
Sep 15 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
python中requests库+xpath+lxml简单使用
Apr 29 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
mysql 字段类型说明
2007/04/27 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
$.each与$().each的区别示例介绍
2014/03/20 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python基础教程项目三之万能的XML
2018/04/02 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
python requests 测试代理ip是否生效
2018/07/25 Python
python super函数使用方法详解
2020/02/14 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
如何进行Linux分区优化
2013/02/12 面试题
专升本个人自我评价
2013/12/22 职场文书
运动会广播稿80字
2014/01/23 职场文书
青年志愿者活动方案
2014/08/17 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
信用卡收入证明范本
2015/06/12 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python