在 Python3 中初始化堆后是否需要堆化

问题描述

当创建一个堆来动态跟踪最小值时,在初始化一个空堆之后,我真的需要调用 heapq.heapify(heap) 吗?或者更确切地说,hq.heappop()hp.heappush()自动完成这项工作..感谢您的帮助!

import heapq as hp
heap = []
hp.heapify(heap) # is this line redundant?
for val in range(1,100):
    hp.heappush(heap,val)
    print(heap[0])

解决方法

是的,在你的情况下它是多余的。来自官方文档 here

heapq.heappush(heap,item)

将值项推送到堆上,保持堆不变。

heapq.heapify(x)

在线性时间内将列表 x 就地转换为堆。

heapify 方法的描述中可以看出,它用于将现有列表转换为堆结构。

但是,如果您想在添加新元素时保留数据结构的堆属性,那么 heappush 是一种可行的方法。

import heapq as hp
heap = []
for val in range(1,100):
    hp.heappush(heap,val)
    print(heap[0])

但是,如果您想将现有数组/列表转换为堆,请使用 heapify 方法:

import heapq as hp
heap = []
for val in range(1,100):
    heap.append(val)
hp.heapify(heap)
print(heap[0])