编程语言
首页 > 编程语言> > python bisect是O(n ^ 2)?

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)

并绘制结果:

enter image description here

我猜想/希望insort最大为O(nlog(n)).从文档中可以看出:

“请记住,O(log n)搜索主要是缓慢的O(n)插入步骤.”

我在这里错过了什么?

编辑:我错过了一些非常明显的东西.无论如何,我想使用SortedContainers包中的SortedList以同样的方式更新问题:

enter image description here

非常快的东西!

解决方法:

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