目录

简介

方法

二分查找

目标值区间左侧

目标值区间右侧

插入【可不学】

目标值区间左侧

目标值区间右侧

参考


简介

方法

二分查找

目标值区间左侧

bisect_left(a, x, lo=0, hi=len(a))

a 中找到 x 合适的插入点以维持有序。参数 lohi 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 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模块相关推荐

  1. python bisect_Python实现二分查找与bisect模块详解

    前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...

  2. 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 ...

  3. Python二分查找算法

    二分查找算法 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,6 ...

  4. python二分查找算法_如何使用python的二分查找算法

    如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29

  5. python折半查找算法_跟黄哥学python序列文章之python二分查找算法

    在计算机科学中,二分查找算法(binary search).也称折半搜索(英语:half-interval search), 二分搜索法.二分搜索.二分探索,是一种在有序数组中查找某一特定元素的搜索算 ...

  6. python 二分查找算法实现

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 二分查找算法的时间复杂度是O( ...

  7. Python二分查找与插入模块bisect

    Python的二分查找与插入bisect模块,查询函数主要使用bisect.bisect(),bisect.bisect_left(),bisect.bisect_right(),插入函数主要使用bi ...

  8. 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]和 ...

  9. python --- 二分查找算法

    二分查找法:在我的理解中这个查找方法为什么会叫二分呢,我认为是将要查询的一个列表分成了两份,然后在利用某个值来进行比较,在一个不断循环的过程中来找出我们要找的某一个值. 废话不多说,先上代码: 1 d ...

最新文章

  1. 数据库sql linux,linux安装mysql数据库
  2. MySQL集群中主从切换
  3. elemet UI 中表格数据的排序操作
  4. gitlab使用git sourcetree时候的命令
  5. 环形数组求最大子数组之和
  6. 使cmd窗口不自动关闭
  7. 21世纪经济网APP
  8. VS2008内嵌水晶报表翻页BUG修正方法
  9. TCP SYN-Cookie背后的人和事
  10. C语言关键字浅析-char
  11. python简单的爬虫实例
  12. c语言 10个小程序,分享10个基础C语言的小程序
  13. 解压缩文件常用命令——linux
  14. 10. InnoDB表空间加密
  15. 2021年职业院校技能大赛“网络安全”项目江西省A模块
  16. 微信公众平台版面设计需要服务器,微信公众平台丨排版的基本原则
  17. Linux 中的内存使用率计算方式
  18. 代码显示return的用法(c语言和java的比较和整合)
  19. 央视揭秘网络推广:水军横行 想让你红你就红
  20. 天道酬勤之Java 实例 - 数组获取最大和最小值

热门文章

  1. Android google翻译踩坑之旅
  2. 【专题地图编制设计与制作】
  3. #项目#layui后台管理模板总结
  4. Field II 超声线阵成像系列1——复合平面波成像
  5. WPF 几行代码实现窗体毛玻璃效果(Aero Glass)
  6. 做To B,考验的是长期主义
  7. 开机之后,鼠标一直转圈
  8. Java学习笔记-3
  9. java 黑白皇后算法_JNI学习之步步深入四--皇后的祝福
  10. 免费远程办公软件亲测