什么是 bisect?
bisect 是 Python 标准库中的一个模块,用于在已排序的列表中快速查找插入位置或插入元素。
它基于二分查找算法,时间复杂度为 O(log n),比线性搜索(O(n))更高效。
常用函数
bisect.bisect_left(a, x):返回插入点,使所有左侧元素 < xbisect.bisect_right(a, x)或bisect.bisect(a, x):返回插入点,使所有右侧元素 > xbisect.insort_left(a, x):在合适位置插入 x,保持列表有序(左侧优先)bisect.insort_right(a, x)或bisect.insort(a, x):在合适位置插入 x,保持列表有序(右侧优先)
示例:查找插入位置
import bisect
data = [10, 20, 30, 40, 50]
pos = bisect.bisect_left(data, 35)
print("插入位置:", pos) # 输出: 3
示例:自动插入并保持有序
import bisect
scores = [85, 90, 95]
bisect.insort(scores, 92)
print(scores) # 输出: [85, 90, 92, 95]
交互演示
输入一个数字,点击按钮将其插入到有序列表中:
当前列表: [60, 70, 80, 90]
适用场景
- 维护排行榜(如游戏分数)
- 实时数据流中的有序插入
- 需要频繁查找插入点的算法实现
- 替代手动实现二分查找,减少错误
注意事项
⚠️ bisect 模块要求列表必须是已排序的,否则结果不可预测。
⚠️ insort 函数虽然方便,但插入操作本身仍是 O(n),因为列表需要移动元素。