【发布时间】:2014-05-27 03:41:03
【问题描述】:
我正在查看this pycon talk, 34:30,演讲者说可以在O(t + n) 中获取n 元素列表中最大的t 元素。
这怎么可能?我的理解是创建堆会是O(n),但是nlargest本身的复杂度是多少,是O(n + t)还是O(t)(实际算法是什么)?
【问题讨论】:
-
你可能对the source code感兴趣。
-
如果您希望它按排序顺序,显然这不会在线性时间内发生。否则,您可以调用
nlargest和t=n以在线性时间内对列表进行比较排序。如果您只想要 any 顺序中的t最大元素,则可以使用 quickselect 在 O(n) 中完成。不过,heapq.nlargest不使用快速选择;它使用基于堆的算法按排序顺序提供项目。 -
只是一个一般说明:声称需要时间 O(t + n) 本身让我很警惕,因为这只是 O(n)。这在技术上并不错误,但这样表达有点奇怪
标签: python algorithm heap time-complexity