假设我们使用Max-heaps,这是增加键操作的伪代码
if key < a[i]
then return an error, because key is less than the current key
else
a[i] = key
while i > 1 and a[parent(i)] < a[i]
swap a[i] with a[parent(i)]
i <- parent(i)
根据cormen算法书,如果我使用最大堆,我不能减少键,但是是什么阻止了我这样做呢?我知道如果条件不会让我减少键。
但是假设我想减少max-heap中的某个值,这样做后我应用heapify操作,即使我使用max-heap,我也可以减少一个键。这保证了max-heap的属性
这个假设有什么问题?
EDIT heapify函数类似于从给定数组构建堆函数。但是我们可以从某个节点对其进行堆化,而不是从ZERO构建整个堆。
伪代码用于堆拉取。这意味着节点只能指向根。如果你想减少键,那么你需要实现一个推送操作(你将节点向下推送到堆中)。这非常相似,但是你需要在节点的子节点之间选择最大值。在你的书中查找它,它应该在那里。
因此,这是可能的并且相当有效,但您需要更多代码。可能有我们不知道的外部需求。另请注意堆推送是O(logn),heapify可能会检查整个堆,因此是O(N)。
一般来说,在Max-优先级队列中,我们希望增加元素的优先级,以便首先提取它。
这就是为什么一般最大优先级队列API只有增加键方法/函数而没有减少键。
但是您绝对可以在自己的实现中拥有一个Decrease-Key方法/函数。