假设我们使用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构建整个堆,而是可以从某个节点堆积它。
答案 0 :(得分:2)
伪代码用于堆拉。这意味着节点只能转向根。如果要减少密钥,则需要实现推送操作(将节点向下推入堆中)。它非常相似,但您需要在节点的子节点之间选择最大值。在你的书中查找它应该在那里。
因此,它可能并且相当有效但您需要更多代码。可能存在我们不知道的外部要求。另请注意,堆推送是O(logn),heapify可能会检查整个堆,所以O(N)。
答案 1 :(得分:0)
通常在Max-Priority队列中,我们希望增加元素的优先级,以便首先提取该元素。
这就是为什么通常Max-Priority队列API只有Increase-Key方法/函数而不是Decrease-Key。
但是你肯定可以在自己的实现中使用Decrease-Key方法/函数。