提问者:小点点

优先级队列增加-密钥配置


假设我们使用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构建整个堆。


共2个答案

匿名用户

伪代码用于堆拉取。这意味着节点只能指向根。如果你想减少键,那么你需要实现一个推送操作(你将节点向下推送到堆中)。这非常相似,但是你需要在节点的子节点之间选择最大值。在你的书中查找它,它应该在那里。

因此,这是可能的并且相当有效,但您需要更多代码。可能有我们不知道的外部需求。另请注意堆推送是O(logn),heapify可能会检查整个堆,因此是O(N)。

匿名用户

一般来说,在Max-优先级队列中,我们希望增加元素的优先级,以便首先提取它。

这就是为什么一般最大优先级队列API只有增加键方法/函数而没有减少键。

但是您绝对可以在自己的实现中拥有一个Decrease-Key方法/函数。