我知道两种方法。第一个:文档是here
heapq.nlargest(n, iterable, key=None)
和使用排序
的第二种传统方法sorted(iterable, key=key, reverse=True)[:K]
文档提到这两者是等价的。但是,我只是想知道两者的复杂性是否相同,或者第一种方法是否以较低的时间复杂度实现。
我记得在我的算法课程中,与排序整个列表然后选择顶部K相比,从列表中获取前K个元素可以按较小的操作顺序完成。 如果我错了,请纠正我
编辑:哪些标准python库可以在O(N)操作中执行此任务,或者我们可以从python获得最佳复杂性?
答案 0 :(得分:1)
我不是一个伟大的数学家,但我想它应该主要取决于两件事:
一般来说,你是对的,快速测试显示数字的差异:
>>> 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
答案 1 :(得分:1)
有更快的算法QuickSelect不执行完全排序 - 只进行分区,平均复杂度约为<div>
<span>Category</span>
<ul>
<li>
<span>Test</span>
<input type="checkbox">
</li>
<li>
<span>Test 2</span>
<input type="checkbox">
</li>
<li>
<span>Test 3</span>
<input type="checkbox">
</li>
<li>
<span>Test 4</span>
<input type="checkbox">
</li>
<li>
<span>Test 5</span>
<input type="checkbox">
</li>
<li>
<span>Test 6</span>
<input type="checkbox">
</li>
</ul>
</div>
。
感谢@Violet Red评论:numpy.partition
堆方法的复杂性为O(N)
,排序方法为O(NlogK)
。
C ++ STL包含方法O(NlogN)
,它可以比完全排序更快地执行。
答案 2 :(得分:0)
找到前K个元素,可以使用
小于O(N * logN)的复杂度来完成