python - 讨论各种python方法从列表中获取N个最大元素的复杂性

标签 python algorithm sorting data-structures time-complexity

我知道有两种方法。第一个:文档是here

heapq.nlargest(n, iterable, key=None)

和第二种使用排序的传统方法

sorted(iterable, key=key, reverse=True)[:K]

文档中提到这两个是等价的。但是,我只想知道两者的复杂性是否相同,或者第一种方法的实现时间复杂度是否较低。

我记得在我的算法类(class)中,与对整个列表进行排序然后选择前 K 个元素相比,从列表中获取前 K 个元素可以以较少的操作顺序完成。 如果我错了请纠正我

编辑:哪些标准 python 库可以在 O(N) 操作中执行此任务,或者我们可以从 python 获得的最佳复杂度是多少?

最佳答案

我不是一个伟大的数学家,但我想这应该主要取决于两件事:

  1. K 与迭代器长度的关系
  2. 执行的 python 和 cpython 代码量之间的关系。

通常你是对的,快速测试显示了数字上的差异:

>>> timeit(stmt='sorted(i)[-100:]', setup='from random import seed,random;seed(666);i=[random() for _ in range(10000)]', number=1000)
2.086820379132405
>>> timeit(stmt='heapq.nlargest(n, i)', setup='from random import seed,random;import heapq;seed(666);n=100;i=[random() for _ in range(10000)]', number=1000)
0.5397011679597199

关于python - 讨论各种python方法从列表中获取N个最大元素的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45904437/

相关文章:

php - 项目排名,使用 Reddit 排名算法按置信度排序

python - 为什么 max 比 sort 慢?

python - 返回吃异常

用于查找树中相同值节点的最大连通区域大小的算法

regex - 搜索子字符串的节省空间的方法

c# - C#中的优化算法

python - 如何修改numpy数组的排序结果

python - 将数据拟合到 hmm.MultinomialHMM

python - Pdfkit/wkhtmltopdf - OSError : [Errno 8] Exec format error

python - 如何检查使用 exec 创建的函数代码