2015-10-11 129 views
2

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

我正在阅读文档here

该文档没有说明它如何在任何迭代器上这样做(nsmalles/nlargest)。

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

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

+0

对于确切的实现,您需要深入研究C代码。然而,你的假设对我来说似乎是有效的 – inspectorG4dget

回答

3

用于从N项目中查找可迭代的最小或最大项目的算法有点棘手。你看,你不会创建一个大小 - N分钟堆找到最小的项目。

相反,你犯了一个小的,大小 - n最大堆与第一n项目,然后反复做就可以了pushpop操作从序列剩余项目。一旦你完成了,你从堆中弹出这些项并按相反的顺序返回它们。

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

heapq module包含纯Python实现这个算法,虽然当你导入它,你可能会用C语言编写的代码的速度更快的版本,而不是(你可以阅读the source for that太多,但它并不完全,除非你作为友好知道Python C API)。

+0

ok我明白了......而如果{heapify()}在内部使用,那么空间复杂度将是{O(N)} [大N] [O],如果N很大,那么如果n很小,与{O(n)}相比,这将会占用很多空间......所以我们通过牺牲一些性能来节省很多空间......完美......谢谢! :) – pranav3688

+0

它甚至可能不需要更多时间使用此算法。这是因为'n'通常是一个常量(不依赖于'N')。对于任何固定的'n','O(N log(n))'相当于'O(N)'。 – Blckknght