在O(ln n)中按有序序列插入值

时间:2017-03-19 09:28:23

标签: python performance data-structures

我在python中寻找一个数据结构(在这个例子中由%分隔),它可以有效地(O(ln n)或更好...)以有序的顺序执行插入:

insert ( 6, % 3, 4, 9 %) ->  % 3, 4, 6, 9 %

对于listnp.ndarray,它是O(n)。 <{1}}或dict是无序的。

有内置(或没有)方法吗?

2 个答案:

答案 0 :(得分:4)

列表?

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)。还有其他结构也适合这个法案,但这可能是最知名的。

answer (Implementing binary search tree)应该可以帮到你。举个例子:

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

答案 1 :(得分:3)

有多种数据结构可以做你想要的,但我不认为有任何内置版本。您可以使用skip list或自我平衡二进制搜索ree(例如red-black树,AVL tree)。有侧包装包含这些结构。例如,bintrees具有avl和红黑树的实现。