微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 heapq 模块

如何解决如何使用 heapq 模块

我不明白如何正确使用 heapq 模块。

我意识到,如果不将我的列表转换为堆(不使用 heapify),我仍然可以使用其他需要堆作为输入的函数(heappop、heappush ..)。那么我什么时候需要使用 heapify?

我应该创建一个空列表,使用 heapify 将其转换为堆,然后使用它吗?我试过这个。我遇到了类型错误

my_list = heapq.heapify([0])
heapq.heappush(my_list,-8)    
TypeError: heap argument must be a list
        heapq.heappush(my_list,-8)

在下面的示例中,如果我不将列表转换为堆,我可以使用 heappush 将 -8 推送到我的列表中。但是,当我想查看堆的 min 元素时,它给了我 0。在 heapq 文档中,它说我可以使用索引 0 到达 min 元素。

my_list = [0]
heapq.heappush(my_list,-8)
print(my_list,my_list[0])

output: [0,-8] 0

我试图在循环中使用它,所以我希望能够执行快速推送和弹出操作,而无需在每次迭代中将列表转换为堆,这需要 O(N)

解决方法

当您不是从空列表开始并且希望将列表转换为堆就地时,您应该使用 heapify

>>> queue = [1,9,2,4]
>>> heapify(queue)
>>> queue
[1,4,9]

当你从一个空列表开始时,那么你可以直接对列表进行heappushheappopheappushpop等操作。
示例:

>>> queue = []
>>> heappush(queue,3)
>>> heappush(queue,1)
>>> heappush(queue,4)
>>> heappop(queue)
1
>>> heappop(queue)
3
>>> heappop(queue)
4

你得到一个错误,因为你使用了 heapify 的返回值,它是 None ,因为它就位。

>>> res = heapify([1,4])
>>> res is None
True

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。