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

时间:2017-08-27 11:25:57

标签: python algorithm sorting data-structures time-complexity

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

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

和使用排序

的第二种传统方法
sorted(iterable, key=key, reverse=True)[:K]

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

我记得在我的算法课程中,与排序整个列表然后选择顶部K相比,从列表中获取前K个元素可以按较小的操作顺序完成。 如果我错了,请纠正我

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

3 个答案:

答案 0 :(得分:1)

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

  1. K与可迭代的长度之间的关系
  2. 执行python和cpython代码之间的关系。
  3. 一般来说,你是对的,快速测试显示数字的差异:

    >>> 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)的复杂度来完成
  • 基于堆的解决方案在O(N * logK)
  • 在O(N)中的
  • Median of Median溶液