这是出于对python中heapq.py模块的nsmallest和nlargest方法的好奇心。最大和最小; heapq python
我正在阅读文档here。
该文档没有说明它如何在任何迭代器上这样做(nsmalles/nlargest)。
这可能是一个愚蠢的问题,但我可以假设这些方法在内部创建了一堆可迭代的数据结构(可能使用'heapify'方法),然后返回n个最小/最大的元素?
只是想确认我的结论。谢谢!
这是出于对python中heapq.py模块的nsmallest和nlargest方法的好奇心。最大和最小; heapq python
我正在阅读文档here。
该文档没有说明它如何在任何迭代器上这样做(nsmalles/nlargest)。
这可能是一个愚蠢的问题,但我可以假设这些方法在内部创建了一堆可迭代的数据结构(可能使用'heapify'方法),然后返回n个最小/最大的元素?
只是想确认我的结论。谢谢!
用于从N
项目中查找可迭代的最小或最大项目的算法有点棘手。你看,你不会创建一个大小 - N
分钟堆找到最小的项目。
相反,你犯了一个小的,大小 - n
最大堆与第一n
项目,然后反复做就可以了pushpop
操作从序列剩余项目。一旦你完成了,你从堆中弹出这些项并按相反的顺序返回它们。
这个过程需要的时间(注意小n
),当然只有O(n)
的空间。如果n
远小于N
,则它比排序和切片更有效。
的heapq
module包含纯Python实现这个算法,虽然当你导入它,你可能会用C语言编写的代码的速度更快的版本,而不是(你可以阅读the source for that太多,但它并不完全,除非你作为友好知道Python C API)。
ok我明白了......而如果{heapify()}在内部使用,那么空间复杂度将是{O(N)} [大N] [O],如果N很大,那么如果n很小,与{O(n)}相比,这将会占用很多空间......所以我们通过牺牲一些性能来节省很多空间......完美......谢谢! :) – pranav3688
它甚至可能不需要更多时间使用此算法。这是因为'n'通常是一个常量(不依赖于'N')。对于任何固定的'n','O(N log(n))'相当于'O(N)'。 – Blckknght
对于确切的实现,您需要深入研究C代码。然而,你的假设对我来说似乎是有效的 – inspectorG4dget