bisect 陣列二分查詢演算法

2021-10-24 08:53:11 字數 1052 閱讀 9228

bisect.bisect_left(a, x, lo=0, hi=len(a))

如果 x 已經在 a 裡存在,那麼插入點會在已存在元素之前(也就是左邊);如果 a 是列表(list)的話,返回值是可以被放在 list.insert() 的第乙個引數的

返回的插入點 (索引)i 可以將陣列 a 分成兩部分。左側是 all(val < x for val in a[lo:i]) ,右側是 all(val >= x for val in a[i:hi])

bisect.bisect_right(a, x, lo=0, hi=len(a))

bisect.bisect(a, x, lo=0, hi=len(a))

類似於 bisect_left(),但是返回的插入點是 a 中已存在元素 x 的右側。

返回的插入點 i 可以將陣列 a 分成兩部分。左側是 all(val <= x for val in a[lo:i]),右側是 all(val > x for val in a[i:hi])

bisect.insort_left(a, x, lo=0, hi=len(a))

將 x 插入到乙個有序序列 a 裡,並維持其有序。

如果 a 有序的話,這相當於 a.insert(bisect.bisect_left(a, x, lo, hi), x)。

要注意搜尋是 o(log n) 的,插入是 o(n) 的。

示例

import bisect

lst =[3

,4,2

,3,1

,5]lst.sort(

)# 查詢 3 插入位置的索引,並返回其索引值

print

(bisect.bisect_left(lst,3)

)print

(bisect.bisect(lst,3)

)# 將 3 插入

bisect.insort_left(lst,3)

lst# 輸出24

[1,2

,3,3

,3,4

,5]

參考菜鳥教程

bisect 陣列二分查詢演算法

這個模組對有序列表提供了支援,使得他們可以在插入新資料仍然保持有序。對於長列表,如果其包含元素的比較操作十分昂貴的話,這可以是對更常見方法的改進。這個模組叫做 bisect 因為其使用了基本的二分 bisection 演算法。源 也可以作為很棒的演算法示例 邊界判斷也做好啦!定義了以下函式 bise...

python陣列二分查詢演算法bisect

摘自官方文件 定義了以下函式 bisect.bisect left bisect.bisect right bisect.bisect bisect.insort left 要注意搜尋是 o log n 的,插入卻是 o n 的。bisect.insort right bisect.insort 參...

二分查詢 bisect

bisect模組提供的函式有 查詢在有序列表 a 中插入 x 的index。lo 和 hi 用於指定列表的區間,預設是使用整個列表。如果 x 已經存在,在其左邊插入。返回值為 index。這2個函式和 bisect left 類似,但如果 x 已經存在,在其右邊插入。在有序列表 a 中插入 x。和 ...