摘自官方文件:
定義了以下函式:
bisect.
bisect_left
)
bisect.
bisect_right
)
bisect.
bisect
)
bisect.
insort_left
)
。要注意搜尋是 o(log n) 的,插入卻是 o(n) 的。
bisect.
insort_right
)
bisect.
insort
)
參見sortedcollection recipe
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, 70, 89, 90, 100]]
['f', 'a', 'c', 'c', 'b', 'a', '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)
陣列 二分查詢演算法
二分查詢演算法 二分查詢演算法也稱為折半查詢法,它的思想是每次都與序列的中間元素比較。二分查詢的乙個前提條件是陣列是有序的,假設陣列array為遞增序列,finddata為要查詢的數,n為陣列長度,首先將n個元素分成個數大致相同的兩半,取array n 2 與將要查詢的值finddata進行比較,如...
演算法 二分查詢 (陣列)
我們把符合下列屬性的陣列 a 稱作山脈 a.length 3 存在 0 i a.length 1 使得a 0 a 1 a i 1 a i a i 1 a a.length 1 給定乙個確定為山脈的陣列,返回任何滿足 a 0 a 1 a i 1 a i a i 1 a a.length 1 的 i 的...
Python演算法 二分查詢
二分查詢 binary search 也被稱為折半查詢,是在乙個有序陣列中查詢特定元素位置的查詢演算法。二分查詢要求查詢序列必須採用順序儲存,且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成...