最大和最小的; heapq python

时间:2015-10-11 19:58:23

标签: python-2.7 heap

这是出于对python中heapq.py模块的最小和最大方法的好奇心。

我正在阅读文档中的here

文档没有说明它是如何做到的(nsmalles / nlargest)在任何迭代上。

这可能是一个愚蠢的问题,但我可以假设这些方法在内部创建可迭代数据结构的堆(可能使用'heapify'方法)然后返回n个最小/最大元素?

只想确认我的结论。谢谢!

1 个答案:

答案 0 :(得分:4)

从具有n项的迭代中查找N最小或最大项的算法有点棘手。你看,你没有创建一个大小 - N min-heap来找到最小的项目。

相反,您使用第一个n项创建一个较小的,大小 - n最大堆,然后使用序列中的其余项对其执行重复pushpop次操作。完成后,从堆中弹出项目并按相反顺序返回。

此过程需要O(N log(n))时间(请注意小n),当然只有O(n)个空格。如果n远小于N,则它比排序和切片更有效。

heapq module包含此算法的纯Python实现,但是当您导入它时,您可能会获得用C编写的更快版本的代码(您也可以阅读the source for that但是除非你知道Python C API,否则它并不友好。