这个模块只有几个函数,
一旦决定使用二分搜索时,立马要想到使用这个模块。
1 bisect模块简介
Python的列表(list)类型内部是一个线性表,在线性表中查找元素复杂度为O(N),即调用list.index()的复杂的是O(N)。当数据量较大时,应该使用二分查找优化,二分查找范围每次缩小一般,复杂度为log(N),数据量越大速度差距越明显。
bisect模块就是基于二分实现的,二分查找要求列表是有序的 ,bisect实现了在一个有序列表中①插入元素并保持列表为有序状态、或②返回插入位置但并不进行实际的插入。
bisect一共有6个函数:['bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right'],使用这些函数前要确保操作的列表是有序的 。
import bisect
2 bisect
其目的在于查找该数值将会插入的位置并返回,而不会插入。
arr=[4,2,9,7]
arr.sort()
idx=bisect.bisect(arr,1)
print(arr,idx)
# 返回结果
[2, 4, 7, 9] 0
3 bisect_left 和 bisect_right
bisect_left 和 bisect_right 函数,用入处理将会插入重复数值的情况,返回将会插入的位置。
bisect_left(seq, x)x存在时返回x左侧的位置;bisect_right(seq, x)x存在时返回x右侧的位置。
arr=[4,2,9,7]
arr.sort()
idx=bisect.bisect_left(arr,2)
print(arr,idx)
idx=bisect.bisect_left(arr,3)
print(arr,idx)
# 返回结果
[2, 4, 7, 9] 0
[2, 4, 7, 9] 1
arr=[4,2,9,7]
arr.sort()
idx=bisect.bisect_right(arr,2)
print(arr,idx)
idx=bisect.bisect_right(arr,3)
print(arr,idx)
# 返回结果
[2, 4, 7, 9] 1
[2, 4, 7, 9] 1
4 insort
排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序。
insort(seq, item)把变量item插入到序列seq中,并能保持seq的升序顺序。
arr=[4,2,9,7]
arr.sort()
bisect.insort(arr,1)
print(arr)
# 返回结果
[1, 2, 4, 7, 9]
5 insort_left 和 insort_right
insort_left 和 insort_right 会进行实际的插入,保持seq的升序顺序。
insort_left(seq, x)x存在时插入在左侧插入;insort_right(seq, x)x存在时在右侧插入。
arr=[4,2,9,7]
arr.sort()
bisect.insort_left(arr,2)
print(arr)
bisect.insort_right(arr,9)
print(arr)
# 返回结果
[2, 2, 4, 7, 9]
[2, 2, 4, 7, 9, 9]
Reference:https://www.cnblogs.com/ldy-miss/p/12061437.html
本文介绍了Python标准库中的bisect模块,该模块提供了基于二分查找的高效算法来处理有序列表。主要内容包括bisect、bisect_left、bisect_right用于查找插入位置的方法,以及insort、insort_left、insort_right用于保持列表有序性的插入方法。

2835

被折叠的 条评论
为什么被折叠?



