python bisect是O(n ^ 2)?

时间:2016-05-02 09:13:26

标签: python algorithm big-o bisection

我正在运行一个简单的测试,以监控使用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

非常快的东西!

1 个答案:

答案 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)时间。