Python的bisect模塊


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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM