问题描述
我不明白如何正确使用 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]
当你从一个空列表开始时,那么你可以直接对列表进行heappush
、heappop
、heappushpop
等操作。
示例:
>>> 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