【发布时间】:2016-01-06 13:45:04
【问题描述】:
默认 heapq 是最小队列实现,想知道是否有最大队列选项?谢谢。
我尝试使用 _heapify_max 作为最大堆的解决方案,但是如何动态处理 push/pop 元素?似乎 _heapify_max 只能在初始化期间使用。
import heapq
def heapsort(iterable):
h = []
for value in iterable:
heapq.heappush(h, value)
return [heapq.heappop(h) for i in range(len(h))]
if __name__ == "__main__":
print heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
编辑,尝试 _heapify_max 似乎不适用于动态推送/弹出元素。我试过两种方法输出一样,输出都是,[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]。
def heapsort(iterable):
h = []
for value in iterable:
heapq.heappush(h, value)
return [heapq.heappop(h) for i in range(len(h))]
def heapsort2(iterable):
h = []
heapq._heapify_max(h)
for value in iterable:
heapq.heappush(h, value)
return [heapq.heappop(h) for i in range(len(h))]
if __name__ == "__main__":
print heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print heapsort2([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
提前致谢, 林
【问题讨论】:
-
@LukasGraf,我不确定调用函数 heapify_max 是否好,因为我看到前缀“”,这似乎是一个内部函数?
-
@LukasGraf,第一个解决方案不适合我,因为我需要同时处理整数和字符串。 :)
-
是的,这里的情况并不令人满意。尽管如此,question 本身几乎是完全重复的。但是,您可能会发现 this answer 很有帮助。
-
_heapify_max 会将您的输入转换为最大堆。但是,heappop 和 heappush 仍然是基于 min-heap 的。可以在这里查看heapq模块的源码:github.com/python/cpython/blob/master/Lib/heapq.py其实有一个_heappop_max函数可以导入,应该在max heap中使用。没有 _heappush_max 可用。但是你可以很容易地修改 heappush 函数来编写一个。或者在这里查看我的版本:github.com/he-zhe/heapq_max/blob/master/heapq_max/…
标签: python algorithm queue priority-queue