我正在运行一个简单的测试,以监控使用bisect
库排序到列表所需的时间
import numpy as np
import bisect
def get_time(N):
myl = []
a = time.time()
for i in np.arange(N):
bisect.insort_left(myl, random.randint(0,1000000) )
b = time.time()
return (b-a)
所以我称之为:
t_dict = {}
for N in [1000,5000,10000,50000,100000,200000,300000,400000,500000]:
t_dict[N] = get_time(N)
并绘制结果:
我会猜到/希望insort
最多O(nlog(n))
。从文档中可以看出:
"请记住,O(log n)搜索由缓慢的O(n)插入步骤控制。"
我在这里缺少什么?
编辑:我错过了一些非常明显的东西。无论如何,我想使用SortedContainers包中的SortedList以同样的方式更新问题:非常快的东西!
答案 0 :(得分:6)
bisect
是O(logN)。但是,插入列表是O(N)。你这样做了N次。
来自bisect.insort_left()
documentation:
请记住,慢速O(n)插入步骤的O(log n)搜索支配。
因此,插入仍为O(N),O(logN)搜索时间(渐近地)与此相比无关紧要。所以整体,你的定时测试花了N倍O(N)== O(N ^ 2)时间。