我只是想学习二进制堆,并对在二进制堆中执行删除操作有疑问。 我已经读过我们可以从二进制堆中删除一个元素,我们需要对它进行重新封装。
但是在以下链接中,它表示不可用:
http://en.wikibooks.org/wiki/Data_Structures/Tradeoffs
Binary Search AVL Tree Binary Heap (min) Binomial Queue (min)
Find O(log n) O(log n) unavailable unavailable
Delete element O(log n O(log n) unavailable unavailable
我对此感到困惑。
提前感谢所有澄清。
答案 0 :(得分:3)
二进制堆和其他优先级队列结构通常不支持一般的“删除元素”操作;您需要一个额外的数据结构来跟踪堆中每个元素的索引,例如哈希表。如果有,则可以将常规删除操作实现为
答案 1 :(得分:2)
可以进行常规删除,就像DeleteMin / Max一样。 “问题”是你必须检查上升和下降(即:当“最后一个”节点占据空位时,它可能会被过度评估或低估。因为它仍然不能同时存在,显而易见原因,很容易检查是否正确。
剩下的唯一问题是Find。上面的答案表明你可以在O(lg n)中找到元素,但我不知道如何。在我的实现中,我通常构建一个指向元素而不是元素的堆(在上/下移期间更便宜的复制)。我在Element类型中添加了一个“position”变量,它跟踪了Heap中Element元素指针的索引。这样,给定一个元素E,我可以在恒定时间内找到它在堆中的位置。
显然,每次实施都不会这样做。
答案 2 :(得分:0)
我很困惑为什么在你的问题的链接中提到二进制堆的删除操作不可用。二进制堆中的删除很可能,它是二进制堆的其他两个操作的组合。 https://en.wikipedia.org/wiki/Binary_heap
我在考虑您了解 Binary Heap
的所有其他操作从二进制堆中删除密钥需要2行代码/操作。假设您要删除索引x
处的项目。将其值减小到可能的最小整数。那是Integer.MIN_VALUE
。由于它是所有整数的最低值,因此在执行decreaseItem(int index, int newVal)
时它将转到根位置。然后提取根调用extractMin()
方法。
// Complexity: O(lg n)
public void deleteItem(int index) {
// Assign lowest value possible so that it will reach to root
decreaseItem(index, Integer.MIN_VALUE);
// Then extract min will remove that item from heap tree. correct ?
extractMin();
}
完整代码:BinaryHeap_Demo.java