【发布时间】:2013-11-27 13:45:50
【问题描述】:
我尝试了"heapq" 并得出结论,我的期望与我在屏幕上看到的不同。我需要有人解释它是如何工作的以及它在哪里有用。
来自Python Module of the Week这本书的2.2排序段下写的
如果您需要在添加和删除值时维护一个排序列表, 查看 heapq。通过使用 heapq 中的函数来添加或删除 列表中的项目,您可以使用维护列表的排序顺序 低开销。
这是我所做的和得到的。
import heapq
heap = []
for i in range(10):
heap.append(i)
heap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
heapq.heapify(heap)
heapq.heappush(heap, 10)
heap
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
heapq.heappop(heap)
0
heap
[1, 3, 2, 7, 4, 5, 6, 10, 8, 9] <<< Why the list does not remain sorted?
heapq.heappushpop(heap, 11)
1
heap
[2, 3, 5, 7, 4, 11, 6, 10, 8, 9] <<< Why is 11 put between 4 and 6?
因此,正如您所见,“堆”列表根本没有排序,事实上,您添加和删除的项目越多,它就会变得越混乱。推送的值处于无法解释的位置。 到底是怎么回事?
【问题讨论】:
-
断章取义,那句话是错误的。堆不维护排序列表;它维护一组值,以便可以在恒定时间内访问最小项,或在 O(lg n) 时间内删除。您可以通过反复从列表中删除最小的项目来检索排序列表。
-
在跟踪报价后,我发现这只是一种误导。堆不维护排序列表,但它确实维护可用于创建排序列表的数据结构。它省略了检索列表必须销毁堆的细节,这是一个至关重要的细节。
-
l4mpi:我阅读了官方的 python 文档,但仍然不明白,你的建议是什么?:) chepner:这是误导,这就是我提出这个问题的原因。任何没有额外知识的人都会期望
heapq在阅读我提到的书中的相关内容后维护一个排序列表。 -
@l4mpi: 没必要这个苛刻;引用显然是错误的,可以理解的是会产生混乱。对于许多初学者来说,算法理论也可能相当枯燥。
标签: python data-structures heap python-module