赞
踩
这个模块只有几个函数,
一旦决定使用二分搜索时,立马要想到使用这个模块。
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
其目的在于查找该数值将会插入的位置并返回,而不会插入。
arr=[4,2,9,7]
arr.sort()
idx=bisect.bisect(arr,1)
print(arr,idx)
# 返回结果
[2, 4, 7, 9] 0
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
排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序。
insort(seq, item)
把变量item
插入到序列seq
中,并能保持seq
的升序顺序。
arr=[4,2,9,7]
arr.sort()
bisect.insort(arr,1)
print(arr)
# 返回结果
[1, 2, 4, 7, 9]
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。