这是出于对python中heapq.py模块的最小和最大方法的好奇心。
我正在阅读文档中的here。
文档没有说明它是如何做到的(nsmalles / nlargest)在任何迭代上。
这可能是一个愚蠢的问题,但我可以假设这些方法在内部创建可迭代数据结构的堆(可能使用'heapify'方法)然后返回n个最小/最大元素?
只想确认我的结论。谢谢!
答案 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,否则它并不友好。