python数组二分查找算法bisect
摘自官方文档:https://docs.python.org/zh-cn/3.7/library/bisect.html ? 这个模块对有序列表提供了支持,使得他们可以在插入新数据仍然保持有序。对于长列表,如果其包含元素的比较操作十分昂贵的话,这可以是对更常见方法的改进。这个模块叫做? 定义了以下函数:
参见 ?SortedCollection recipe?使用 bisect 构造了一个功能完整的集合类,提供了直接的搜索方法和对用于搜索的 key 方法的支持。所有用于搜索的键都是预先计算的,以避免在搜索时对 key 方法的不必要调用。 搜索有序列表上面的? def index(a,x):
'Locate the leftmost value exactly equal to x'
i = bisect_left(a,x)
if i != len(a) and a[i] == x:
return i
raise ValueError
def find_lt(a,x):
'Find rightmost value less than x'
i = bisect_left(a,x)
if i:
return a[i-1]
raise ValueError
def find_le(a,x):
'Find rightmost value less than or equal to x'
i = bisect_right(a,x)
if i:
return a[i-1]
raise ValueError
def find_gt(a,x):
'Find leftmost value greater than x'
i = bisect_right(a,x)
if i != len(a):
return a[i]
raise ValueError
def find_ge(a,x):
'Find leftmost item greater than or equal to x'
i = bisect_left(a,x)
if i != len(a):
return a[i]
raise ValueError
其他示例函数? >>> def grade(score,breakpoints=[60,70,80,90],grades='FDCBA'):
... i = bisect(breakpoints,score)
... return grades[i]
...
>>> [grade(score) for score in [33,99,77,89,90,100]]
['F','A','C','B','A']
与? 正相反,最好去搜索预先计算好的键列表,来查找相关记录的索引。 >>> data = [('red',5),('blue',1),('yellow',8),('black',0)]
>>> data.sort(key=lambda r: r[1])
>>> keys = [r[1] for r in data] # precomputed list of keys
>>> data[bisect_left(keys,0)]
('black',0)
>>> data[bisect_left(keys,1)]
('blue',1)
>>> data[bisect_left(keys,5)]
('red',5)
>>> data[bisect_left(keys,8)]
('yellow',8)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |