我正在python中尋找一個數據結構(在這個例子中用%劃定),它可以有效地(O(lnn)或更好的...)執行插入一個有序序列:在O(ln n)中插入一個有序序列的值
insert (6, % 3, 4, 9 %) -> % 3, 4, 6, 9 %
對於list
和np.ndarray
這是爲O(n)。 dict
或set
是無序的。
有沒有內建(或不)的方法來做到這一點?
我正在python中尋找一個數據結構(在這個例子中用%劃定),它可以有效地(O(lnn)或更好的...)執行插入一個有序序列:在O(ln n)中插入一個有序序列的值
insert (6, % 3, 4, 9 %) -> % 3, 4, 6, 9 %
對於list
和np.ndarray
這是爲O(n)。 dict
或set
是無序的。
有沒有內建(或不)的方法來做到這一點?
bisect
可以幫助你,至少找那裏的元素應該插入的位置(O(log n)
)時:
import bisect
l = [3, 4, 9]
bisect.insort_left(l , 6)
print(l)
# [3, 4, 6, 9]
從文檔,但:
記住的是, O(log n)搜索主要是緩慢的O(n) 插入步驟。
所以列表確實是一個問題,而不是搜索本身。 Python TimeComplexity's table沒有顯示O(log n)插入的替代方案。
從這個table,它看起來像「二叉搜索樹」具有O(log n)的用於訪問,搜索和插入。還有其他一些適合該法案的結構,但這可能是最知名的。
This answer (Implementing binary search tree) should help you。作爲一個例子:
r = Node(3)
binary_insert(r, Node(9))
binary_insert(r, Node(4))
binary_insert(r, Node(6))
in_order_print(r)
# 3
# 4
# 6
# 9
不幸的是,'insort_left'文件說:請記住,O(日誌n)搜索主要由緩慢的O(n)插入步驟。 –
你看過有序的字典嗎? – Julien
看來它不斷插入訂單,而不是價值順序。 –
你可以用O(log n)索引來交易O(1)索引,以便像[紅黑樹](https://en.wikipedia.org/wiki/)一樣使用二叉搜索樹來獲得O(log n)插入。紅色%E2%80%93black_tree)或O(1)爲鏈接列表中的O(n)索引編制索引,以獲得相對於您擁有的節點的O(1)插入。請問更多的背景? (即你使用這個數據結構是什麼?) – Ryan