bisect 是 python 内置模块,用于有序序列的插入和查找。bisect,是实现 二分 (bisection) 算法 的模块
bisect.bisect_left
bisect.bisect_left(a, x, lo=0, hi=X)
在[lo,hi]中找到第一个>=x的元素的下标,相当于lower_bound
bisect_right()
bisect.bisect_right(a, x, lo=0, hi=X)
在[lo,hi]中找到第一个>x的元素的下标,相当于upper_bound
注意点:
上面两个二分函数分别对应C++的lowerbound和upper_bound,但是也有一些特点
bisect的api的区间都是左闭右闭,但是在传下标的时候可以越界去传,不会报错
例子如下,a的长度只有4,最大下标是3,但是传参的时候hi可以传越界的下标4
a = [0,1,2,3]
print(bisect_left(a,100,1,len(a))) # 4
利用这个特性,有时可以不设置哨兵,因为只需要向后定义一个即可
insort_left()
bisect.insort_left(a, x, lo=0, hi=len(a))
insort_left() 就是在bisect_left()找到插入点的基础上,将元素 x 插入序列 a,从而改变序列 a 同时保持元素顺序。
insort_right()
和insort_left类似