【问题标题】:python bisect is O(n^2)?python bisect 是 O(n^2)?
【发布时间】:2016-05-02 09:13:25
【问题描述】:

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

标签: python algorithm big-o bisection


【解决方案1】:

bisect 是 O(logN)。但是,插入列表是 O(N)。你这样做 N 次。

来自bisect.insort_left() documentation

请记住,O(log n) 搜索主要受缓慢的 O(n) 插入步骤。

所以插入仍然是 O(N),与此相比,O(logN) 搜索时间(渐近地说)微不足道。所以总体而言,您的定时测试需要 N 次 O(N) == O(N^2) 时间。

【讨论】:

  • 是的,但情节不是一条线,是吗?
  • 我顺便链接了文档中完全相同的评论:)
  • @elelias 您正在重复 O(N) 插入 N 次。这使得整个过程 O(N^2)
  • 啊啊啊,现在我明白你在说什么了。确实,有道理,谢谢。
  • @elelias:我确实想念你引用了同样的评论,所以我现在强调你错过的那部分评论。 :-)
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多