python bisect_python bisect
Python的bisect模块,用于维护有序列表。bisect模块实现了将元素插入一个有序序列的算法,它利用二分算法实现排序,相比于每次调用sort而言,这样无疑要高效许多。bisect_*系列方法用于求索引,insort_*系列方法用于有序插入
1. 常用方法
I. bisect.bisect_left(a, x, lo=0, hi=len(a))
a是一个有序列表,x是插入其中的元素, lo和hi分别代表列表的切片索引(默认为0和列表长度)
此方法用于寻找一个保证插入元素后列表仍然有序的索引值。当元素x插入a列表后列表仍保持有序状态,且当列表内已经有与x值相同的元素时,x会插入到其中所有相同元素的最左边,方法会返回所插入元素在列表中的索引,并保证在索引值左边的元素都比所插入元素小,右边的都不比所插入元素大(大于等于)
import bisect
if __name__ == '__main__':
l = [1, 2, 3, 4]
k = []
print(bisect.bisect_left(l, 3))
print(bisect.bisect_left(k, 2))
>>> 2
>>> 0
II. bisect.bisect_right、bisect.bisect
这两种都方法和bisect_left类似,唯一的区别就是出现相同元素会优先向右边插入,同样是返回索引值。
import bisect
if __name__ == '__main__':
l = [1, 2, 3, 4]
k = [1, 2, 3, 3, 3, 4]
print(bisect.bisect_right(l, 3))
print(bisect.bisect_right(k, 3))
print(bisect.bisect(l, 3))
print(bisect.bisect(k, 3))
>>> 3
>>> 5
>>> 3
>>> 5
III. bisect.insort_left(a, x, lo=0, hi=len(a))
不破壞 a 的排序的情况下下插入x, 和 a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。搜寻只需要 O(log n)时间而插入需要很慢的 O(n)时间,这使得插入操作主导了需要花费的时间。
if __name__ == '__main__':
l = [1, 2, 3, 4]
k = [1, 2, 3, 3, 3, 4]
bisect.insort_right(l, 3)
print(l)
l.insert(bisect.bisect_right(l, 3), 3)
print(l)
>>> [1, 2, 3, 3, 4]
>>> [1, 2, 3, 3, 3, 4]
IV. bisect.insort_right(a,x, lo=0, hi=len(a))、 bisect.insort(a, x,lo=0, hi=len(a))
与insort_left用法类似,区别在于对于重复的值会执行右插,插入的位置在所有a列表中的x的后面(右边)
if __name__ == '__main__':
l = [1, 2, 3, 4]
k = [1, 2, 3, 3, 3, 4]
bisect.insort_right(l, 3)
print(l)
l.insert(bisect.bisect_right(l, 3), 3)
print(l)
>>> [1, 2, 3, 3, 4]
>>> [1, 2, 3, 3, 3, 4]
2. 二分查找
前文说到过二分查找,二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。每次查询会将表分为两部分,然后对于符合要求的那一部分继续执行同上所述的查找流程,直至无法再细分子表。
I.表必须采用顺序存储结构
II.必须按关键字大小有序排列
我们也可以自己来实现一下二分查找方法,虽然效率上会低于bisect
I. 循环实现
def binary_search_by_cycle(lst, item, start, end):
while start <= end:
mid = (start + end) // 2
if lst[mid] == item:
return mid
elif lst[mid] < item:
start = mid + 1
else:
end = mid - 1
return None
if __name__ == '__main__':
l = [i for i in range(1, 10000, 2)]
print(binary_search_by_cycle(l, 9979, 0, len(l)))
>>> 4989
II. 递归实现
def binary_search_by_recursion(lst, item, start, end):
if start > end:
return None
mid = (start + end) // 2
if lst[mid] < item:
return binary_search_by_recursion(lst, item, mid+1, end)
elif lst[mid] > item:
return binary_search_by_recursion(lst, item, start, mid-1)
else:
return mid
if __name__ == '__main__':
l = [i for i in range(1, 10000, 2)]
print(binary_search_by_recursion(l, 9979, 0, len(l)))
>>> 4989
python bisect_python bisect相关推荐
- python bisect_python bisect模块
如果在插入新元素的同时还想保持有序序列的顺序, 那么需要用到 bisect.insort. bisect.bisect 的作用则是快速查找. 今天同事说到了一个python的排序模块bisect,觉得 ...
- python bisect_python中bisect模块用法实例
本文实例讲述了python中bisect模块用法,分享给大家供大家参考. 具体方法分析如下: 这个模块只有几个函数,一旦决定使用二分搜索时,立马要想到使用这个模块. 示例代码如下: import bi ...
- python bisect_Python中bisect的用法及示例详解
bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = ...
- python bisect_Python中bisect的使用
在中第十章的练习中,涉及到了分半查找的bisect模块.为此,在网上查阅了Python中bisect模块的相关内容.有几个链接相对权威和明白: 这里,就我有疑问的地方做个记录: 第一,bisect模块 ...
- python bisect_Python中bisect的用法
分析如下: 一般来说,Python中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序.下面的代码演示了如何进行操作:import bisect import random ...
- python bisect_Python 中的bisect
Python 中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序.下面的代码演示了如何进行操作: import bisect import random random.s ...
- python bisect_Python的bisect模块
Python的列表(list)类型内部是一个线性表,在线性表中查找元素复杂度为O(N),即调用list.index()的复杂的是O(N).当数据量较大时,应该使用二分查找优化,二分查找范围每次缩小一般 ...
- python bisect_Python实现二分查找与bisect模块详解
前言 其实Python 的列表(list)内部实现是一个数组,也就是一个线性表.在列表中查找元素可以使用 list.index()方法,其时间复杂度为O(n) .对于大数据量,则可以用二分查找进行优化 ...
- python使用方法-Python中bisect的使用方法
Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着数据量的上升,list.index()的性能也逐步下降,所以 ...
最新文章
- 修改cpu型号重启不变_猫头鹰展示D系列新款140毫米CPU散热器:更大散热片,能压400瓦...
- 用物理学突破深度学习理论瓶颈? Google-斯坦福发布《深度学习统计力学》综述论文,30页pdf阐述深度学习成功机制...
- js中父窗口获得模态窗口的返回值
- YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
- struts2的namespace的问题
- Kafka:集群部署
- JavaScript中的arguments对象
- 计算机211学校四川,四川省有哪些211大学?附排名
- bin和sbin区别
- 使用plsql管理oracle数据库连接,使用PLSQL连接远程oracle数据库
- velocity语法
- 大疆文档(2)-指南
- 机器学习之BP算法推导
- mac 设置maven环境变量并永久生效
- 一个链接,让你的网站访客直接和你qq聊天
- 完整版 :数据分析师的一天
- CSS入门(CSS常用属性----字体、对齐方式、display属性、浮动)
- Emscripten中的虚拟文件系统
- Unity获取物体下的子物体
- 如何在GooglePlay上下载收费应用(APP)