Python-二分查找算法bisect模块
目录
简介
方法
二分查找
目标值区间左侧
目标值区间右侧
插入【可不学】
目标值区间左侧
目标值区间右侧
参考
简介
方法
二分查找
目标值区间左侧
bisect_left
(a, x, lo=0, hi=len(a))
在 a 中找到 x 合适的插入点以维持有序。参数 lo 和 hi 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 x 已经在 a 里存在,那么插入点会在已存在元素之前(也就是左边)。如果 a 是列表(list)的话,返回值是可以被放在 list.insert(index,object)
的第一个参数的。
返回的插入点 i 可以将数组 a 分成两部分。左侧是 all(val < x for val in a[lo:i])
,右侧是 all(val >= x for val in a[i:hi])
。
>>> from bisect import *
>>> lst = [1,2,2,5]
>>> bisect_left(lst,4)
3
>>> lst[:3]
[1, 2, 2]
>>> lst[3:]
[5]
对于列表lst来说,以bisect_left返回的index为界限,lst[:index]为小于x的,lst[index:]为大于或等于x的。
>>> lst.insert(bisect_left(lst,4),4)
>>> lst[3]
4
使用insert方法插入x后,x就是在bisect_left返回的那个索引位置
源代码
def bisect_left(a, x, lo=0, hi=None):"""Return the index where to insert item x in list a, assuming a is sorted.The return value i is such that all e in a[:i] have e < x, and all e ina[i:] have e >= x. So if x already appears in the list, a.insert(x) willinsert just before the leftmost x already there.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched."""if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)while lo < hi:mid = (lo+hi)//2if a[mid] < x: lo = mid+1else: hi = midreturn lo
注意,源代码使用的是(lo+hi)//2,如果使用模块刷题时超时(Python自动转为大数运算,时间过长),可自己写个二分查找,改为lo+(hi-lo)//2。
目标值区间右侧
bisect.bisect_right
(a, x, lo=0, hi=len(a))
bisect.bisect
(a, x, lo=0, hi=len(a))
类似于bisect_left
(a, x, lo=0, hi=len(a)),但是返回的插入点是 a 中已存在元素 x 的右侧。
返回的插入点 i 可以将数组 a 分成两部分。左侧是 all(val <= x for val in a[lo:i])
,右侧是 all(val > x for val in a[i:hi])
。
>>> bisect_right(lst,4)
4
>>> lst[:4]
[1, 2, 2, 4]
>>> lst[4:]
[5]
对于列表lst来说,以bisect_left返回的index为界限,lst[:index]为小于或等于x的,lst[index:]为大于x的。
>>> lst.insert(bisect_right(lst,4),4)
>>> lst[4]
4
注意,已存在的4是lst[3],新插入的4是lst[4]
插入【可不学】
目标值区间左侧
bisect.
insort_left
(a, x, lo=0, hi=len(a))
将 x 插入到一个有序序列 a 里,并维持其有序。如果 a 有序的话,这相当于 a.insert(bisect.bisect_left(a, x, lo, hi), x)
。要注意搜索是 O(log n) 的,插入却是 O(n) 的。
注意,是insort_left,不是insert_left,意思是insert到一个sort后的序列。
>>> insort_left(lst,3)
>>> lst
[1, 2, 2, 3, 4, 4, 5]
源代码
def insort_left(a, x, lo=0, hi=None):"""Insert item x in list a, and keep it sorted assuming a is sorted.If x is already in a, insert it to the left of the leftmost x.Optional args lo (default 0) and hi (default len(a)) bound theslice of a to be searched."""if lo < 0:raise ValueError('lo must be non-negative')if hi is None:hi = len(a)while lo < hi:mid = (lo+hi)//2if a[mid] < x: lo = mid+1else: hi = mida.insert(lo, x)
通过源代码发现,这就是一个二分查找和插入的过程,没必要记下来。
目标值区间右侧
bisect.
insort_right
(a, x, lo=0, hi=len(a))
bisect.
insort
(a, x, lo=0, hi=len(a))
类似于insort_left
(a, x, lo=0, hi=len(a)),但是把 x 插入到 a 中已存在元素 x 的右侧。
>>> insort_right(lst,3)
>>> lst
[1, 2, 2, 3, 3, 4, 4, 5]
注:看源代码发现真的没有性能提升,里面就是调用的insert,可以不学插入这两个函数。
参考
python-数组二分查找算法
更多python相关内容:【python总结】python学习框架梳理
本人b站账号:lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。
Python-二分查找算法bisect模块相关推荐
- python bisect_Python实现二分查找与bisect模块详解
前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...
- Python 二分查找算法
如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76 ...
- Python二分查找算法
二分查找算法 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,6 ...
- python二分查找算法_如何使用python的二分查找算法
如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29
- python折半查找算法_跟黄哥学python序列文章之python二分查找算法
在计算机科学中,二分查找算法(binary search).也称折半搜索(英语:half-interval search), 二分搜索法.二分搜索.二分探索,是一种在有序数组中查找某一特定元素的搜索算 ...
- python 二分查找算法实现
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 二分查找算法的时间复杂度是O( ...
- Python二分查找与插入模块bisect
Python的二分查找与插入bisect模块,查询函数主要使用bisect.bisect(),bisect.bisect_left(),bisect.bisect_right(),插入函数主要使用bi ...
- python 二分查找算法_Python实现二分查找法
用Python来实现二分查找 1.问题需求 输入列表[1,4,4,5,7,7,8,9,9,10]和目标整数1,输出其所在的位置为0,即第1次出现在第0个位置.输入列表[1,2,3,3,4,5,10]和 ...
- python --- 二分查找算法
二分查找法:在我的理解中这个查找方法为什么会叫二分呢,我认为是将要查询的一个列表分成了两份,然后在利用某个值来进行比较,在一个不断循环的过程中来找出我们要找的某一个值. 废话不多说,先上代码: 1 d ...
最新文章
- 数据库sql linux,linux安装mysql数据库
- MySQL集群中主从切换
- elemet UI 中表格数据的排序操作
- gitlab使用git sourcetree时候的命令
- 环形数组求最大子数组之和
- 使cmd窗口不自动关闭
- 21世纪经济网APP
- VS2008内嵌水晶报表翻页BUG修正方法
- TCP SYN-Cookie背后的人和事
- C语言关键字浅析-char
- python简单的爬虫实例
- c语言 10个小程序,分享10个基础C语言的小程序
- 解压缩文件常用命令——linux
- 10. InnoDB表空间加密
- 2021年职业院校技能大赛“网络安全”项目江西省A模块
- 微信公众平台版面设计需要服务器,微信公众平台丨排版的基本原则
- Linux 中的内存使用率计算方式
- 代码显示return的用法(c语言和java的比较和整合)
- 央视揭秘网络推广:水军横行 想让你红你就红
- 天道酬勤之Java 实例 - 数组获取最大和最小值