优先级队列增加密钥操作

时间:2016-03-14 12:12:24

标签: algorithm priority-queue

假设我们使用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算法书,我不能减少密钥,如果我使用最大堆,但是什么阻止我这样做?我知道if条件不会让我减少密钥。

但是我们假设我想减少最大堆中的某个值,在执行了我应用heapify操作之后,即使我使用max-sheaps,我也可以减少一个键。这保证了max-heap的属性

这个假设有什么问题?

EDIT  heapify函数类似于从给定数组构建堆函数。但是我们不是从ZERO构建整个堆,而是可以从某个节点堆积它。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

通常在Max-Priority队列中,我们希望增加元素的优先级,以便首先提取该元素。

这就是为什么通常Max-Priority队列API只有Increase-Key方法/函数而不是Decrease-Key。

但是你肯定可以在自己的实现中使用Decrease-Key方法/函数。