Python的列表(list)類型內部是一個線性表,在線性表中查找元素復雜度為O(N),即調用list.index()的復雜的是O(N)。當數據量較大時,應該使用二分查找優化,二分查找范圍每次縮小一般,復雜度為log(N),數據量越大速度差距越明顯。
bisect模塊就是基於二分實現的,二分查找要求列表是有序的,bisect實現了在一個有序列表中插入元素並保持列表為有序狀態、或返回插入位置但並不進行實際的插入。
bisect一共有6個函數:['bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right'],使用這些函數前要確保操作的列表是有序的。
insort
排序很耗時,因此在得到一個有序序列之后,我們最好能夠保持它的有序。insort(seq, item)把變量item插入到序列seq中,並能保持seq的升序順序
>>> data = [4, 2, 9, 7]
>>> data.sort()
>>> insort(data, 3)
>>> data
[2, 3, 4, 7, 9]
bisect
其目的在於查找該數值將會插入的位置並返回,而不會插入。
>>> bisect(data, 1)
0
>>> data
[2, 3, 4, 7, 9]
bisect_left 和 bisect_right
bisect_left 和 bisect_right 函數,用入處理將會插入重復數值的情況,返回將會插入的位置。
bisect_left(seq, x) x存在時返回x左側的位置;
bisect_right(seq, x) x存在時返回x右側的位置;
>>> bisect_left(data, 4)
2
>>> bisect_right(data, 4)
3
>>> data
[2, 3, 4, 7, 9]
insort_left 和 insort_right
insort_left 和 insort_right 會進行實際的插入。
insort_left(seq, x) x存在時插入在左側插入;
insort_right(seq, x) x存在時在右側插入;
>>> data
[2, 3, 4, 7, 9]
>>> insort_left(data, 4)
>>> data
[2, 3, 4, 4, 7, 9]
>>> data = [2, 3, 4, 7, 9]
>>> insort_right(data, 4)
>>> data
[2, 3, 4, 4, 7, 9]