python陣列二分查詢演算法bisect

2022-06-11 16:24:14 字數 2064 閱讀 3266

摘自官方文件:

定義了以下函式:

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 也被稱為折半查詢,是在乙個有序陣列中查詢特定元素位置的查詢演算法。二分查詢要求查詢序列必須採用順序儲存,且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成...