2015-06-05 32 views
9

我有一個排序列表L和我有一個二進制搜索來確定列表中插入元素的位置,使得結果列表仍然按順序排列。Python:比O(N)更快地插入列表?

但L.insert(索引,對象)需要O(N)時間複雜度。

是否有另一個L的數據結構可以達到同樣的目的,但是可以更快地插入?

+0

二叉搜索樹?看起來Python沒有內置的,但可能有一個封裝在一個地方。 –

+0

是啊二進制搜索樹是O(1)插入。 –

+0

啊,我希望你們不要說BST。 :( – user4967499

回答

4

查看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) 
+2

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,僅鏈接答案可能會失效。 –

3

一個喊出來給sortedcontainers.SortedList。這將自動保留您的列表,並且插入時間很快。

from sortedcontainers import SortedList 

mylist = SortedList([1, 2, 4, 5]) 
mylist.add(3) 
mylist 
#>>> SortedList([1, 2, 3, 4, 5], load=1000) 

SortedListinsertions 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獲得可能更快的插入。

+0

'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

+0

@randomir謝謝,這實際上是[我意識到](https://www.reddit.com/r/Python/comments/4ge9xs/python_sorted_collections/d2hkra5/),只是不是在我寫這篇文章的時候。我的帖子現在已修復。 – Veedrac

+0

儘管如此,我仍然是一個很好的答案(我不知道「sortedcontainers」,可能是因爲我直到今天才需要它們:))。 – randomir

相關問題