我有一個排序列表L和我有一個二進制搜索來確定列表中插入元素的位置,使得結果列表仍然按順序排列。Python:比O(N)更快地插入列表?
但L.insert(索引,對象)需要O(N)時間複雜度。
是否有另一個L的數據結構可以達到同樣的目的,但是可以更快地插入?
我有一個排序列表L和我有一個二進制搜索來確定列表中插入元素的位置,使得結果列表仍然按順序排列。Python:比O(N)更快地插入列表?
但L.insert(索引,對象)需要O(N)時間複雜度。
是否有另一個L的數據結構可以達到同樣的目的,但是可以更快地插入?
查看blist模塊。
https://pypi.python.org/pypi/blist/
它聲稱O(log n)的插入。
用法:
x = #list contents
y = blist(x)
y.insert(index, object) #now works in O(log n)
儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,僅鏈接答案可能會失效。 –
一個喊出來給sortedcontainers.SortedList
。這將自動保留您的列表,並且插入時間很快。
from sortedcontainers import SortedList
mylist = SortedList([1, 2, 4, 5])
mylist.add(3)
mylist
#>>> SortedList([1, 2, 3, 4, 5], load=1000)
SortedList
insertions are amortized O(sqrt n)
, or O(cbrt n)
with different choices of parameters,但鱗比blist
,這是O(log n)
更好,因爲常量要好得多。有a very in-depth look at performance on their website。
或者,您可能想要一個priority queue,在這種情況下,您可以使用the heapq
module獲得可能更快的插入。
'O(log n)'部分[並不嚴格](http://www.grantjenks.com/doc S/sortedcontainers /性能scale.html)。 'sortedcontainers.SortedList'將數據存儲在[列表的平衡列表](http://www.grantjenks.com/docs/sortedcontainers/implementation.html)中,並利用數據局部性實現更快的攤銷時間。嚴格來說,大O插入的複雜性是'O(n^2)',但是由於大的「載入因子」,分攤的插入複雜度爲〜(n ^(1/3))。 – randomir
@randomir謝謝,這實際上是[我意識到](https://www.reddit.com/r/Python/comments/4ge9xs/python_sorted_collections/d2hkra5/),只是不是在我寫這篇文章的時候。我的帖子現在已修復。 – Veedrac
儘管如此,我仍然是一個很好的答案(我不知道「sortedcontainers」,可能是因爲我直到今天才需要它們:))。 – randomir
二叉搜索樹?看起來Python沒有內置的,但可能有一個封裝在一個地方。 –
是啊二進制搜索樹是O(1)插入。 –
啊,我希望你們不要說BST。 :( – user4967499