bisect:在有序列表里找插入点与重复区间
寻找一个值的位置时,列表可能含有重复项。二分查找不仅能判断成员,还能找到相同值区间的左右边界。
问题从哪里出现
寻找一个值的位置时,列表可能含有重复项。二分查找不仅能判断成员,还能找到相同值区间的左右边界。
理解核心机制
bisect_left 返回相同值之前的插入点,bisect_right 返回相同值之后的插入点。两者差值就是有序列表中该值的出现次数。前提是列表始终遵守同一排序规则。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from bisect import bisect_left, bisect_right, insort
values = [1, 3, 3, 5]
left = bisect_left(values, 3)
right = bisect_right(values, 3)
assert values[left:right] == [3, 3]
insort(values, 4)
assert values == [1, 3, 3, 4, 5]
print(left, right, values)适用边界与常见误区
查找位置是对数复杂度,但在普通列表中插入仍需要移动元素,通常是线性成本。频繁更新的大数据集可能需要其他结构。
继续练习
测试不存在的值以及小于最小值、大于最大值的情况,再用区间边界实现闭区间计数。