python bisect是O(n ^ 2)?
作者:互联网
我正在运行一个简单的测试来监视使用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以同样的方式更新问题:
非常快的东西!
解决方法:
bisect是O(logN).但是,插入列表是O(N).你做了N次.
从bisect.insort_left()
documentation:
Keep in mind that the O(log n) search is dominated by the slow O(n) insertion step.
因此插入仍为O(N),O(logN)搜索时间(渐近地)与此相比无关紧要.总的来说,你的定时测试花了N倍O(N)== O(N ^ 2)时间.
标签:python,algorithm,big-o,bisection 来源: https://codeday.me/bug/20190824/1704895.html