[快学Python3]二分查找[策略优化版本]
时间:2022-05-07
本文章向大家介绍[快学Python3]二分查找[策略优化版本],主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
在上文《二分查找》中,我们了解了二分查找基本实现原理和具体的实现算法。
但大家有没有发现,如果目标查找值,如果在查找序列中存在多个,则查找返回的索引值,会有所变化。
那下面我们试着利用二分查找实现以下功能:
- 查找目标值在序列中第一次出现时的索引
- 查找目标值在序列中最后一次出现时的索引
例如,有序列如下:
seq = [1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8]
我们查找目标值: 5
- 第一次出现在索引为:4 的位置
- 最后一次出现在索引为:7 的位置
下面我们对二分查找算法进行策略改造升级为:
# 用于实现二分查找第一次出现的算法
first_binary_search(seq, query)
# 用于实现二分查找最后一次出现的算法
last__binary_search(seq, query)
代码实现
first优先策略算法实现
# -*- coding:utf-8 -*-
__author__ = '苦叶子'
# first二分查找算法
# seq 待查序列
# query 要查找的目标
def first_binary_search(seq, query):
# start为起始索引
# end 为结束索引
start, end = 0, len(seq) - 1
while start <= end:
mid = start + (end - start) // 2 # // 整除
if (mid == 0 and seq[mid] == query) or
(seq[mid] == query and seq[mid-1] < query):
# 这是实现first的最关键判断
# 在seq中找到目标query第一次出现的位置
# 返回对应的索引值
return mid
elif seq[mid] < query:
# 目标值大于中间值
# 说明目标值在mid - end之间
start = mid + 1
else:
# 目标值小于于中间值
# 说明目标值在start - mid之间
end = mid - 1
# 目标值不存在于seq中,返回None
return None
if __name__ == "__main__":
print("二分查找first示例")
print("二分查找只适合有序的序列")
seq = [1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 10, 13, 15]
# 返回7
print("5第一次出现的索引位置为: ", first_binary_search(seq, 5))
# 返回13
print("7第一次出现的索引位置为: ", first_binary_search(seq, 7))
# 返回15
print("8第一次出现的索引位置为: ", first_binary_search(seq, 8))
last优先策略算法实现
# -*- coding:utf-8 -*-
__author__ = '苦叶子'
# last二分查找算法
# seq 待查序列
# query 要查找的目标
def last_binary_search(seq, query):
# start为起始索引 # end 为结束索引
start, end = 0, len(seq) - 1
while start <= end:
mid = start + (end - start) // 2 # // 整除
if (seq[mid] == query and mid == len(seq) - 1) or
(seq[mid] == query and seq[mid+1] > query):
# 这是实现last的最关键判断
# 在seq中找到目标query第一次出现的位置
# 返回对应的索引值
return mid
elif seq[mid] < query:
# 目标值大于中间值
# 说明目标值在mid - end之间
start = mid + 1
else:
# 目标值小于于中间值
# 说明目标值在start - mid之间
end = mid - 1
# 目标值不存在于seq中,返回None
return None
if __name__ == "__main__":
print("二分查找last示例")
print("二分查找只适合有序的序列")
seq = [1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 10, 13, 15]
# 返回9
print("5最后一次出现的索引位置为: ", last_binary_search(seq, 5))
# 返回14
print("7最后一次出现的索引位置为: ", last_binary_search(seq, 7))
# 返回15
print("8最后一次出现的索引位置为: ", last_binary_search(seq, 8))
- 自己动手系列-延迟队列
- OVS中Action源码分析&自定义Action
- 读懂一行Full GC日志(回复JVM内存分配担保机制一文中 Mr/Mrs Xxx 在留言区提出的问题)
- 总结了一些指针易出错的常见问题(四)
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- 总结了一些指针易出错的常见问题(三)
- C++/C头文件 .h和 .c
- 史上最清晰的红黑树讲解(下)
- 网络操作系统VyOS安装与初步使用
- 为何webpack风靡全球?三大主流模块打包工具对比
- 今天研究了一下手机通信录管理系统(C语言)
- Android软件测试Monkey测试工具
- 程序员面试50题(4)—把字符串转换成整数[算法]
- 程序员面试50题(3)—翻转句子中单词的顺序[算法]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php+jQuery ajax实现的实时刷新显示数据功能示例
- yii2.0框架使用 beforeAction 防非法登陆的方法分析
- PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
- php项目中类的自动加载实例讲解
- Yii框架参数配置文件params用法实例分析
- 使用Kotlin实现文字渐变TextView的代码
- thinkPHP5框架路由常用知识点汇总
- PHP实现一个限制实例化次数的类示例
- AndroidStudio中重载方法@Override的使用详解
- mysqli扩展无法在PHP7下升级问题的解决
- PHP通过文件保存和更新信息的方法分析
- PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
- PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
- android之json数据过长打印不全问题的解决
- PHP实现时间日期友好显示实现代码