有各种堆操作,并且为同一操作提供了各种名称。
我被名字和别名所淹没。
请澄清,以下堆操作之间有什么区别/相似之处/关系:
(1) Heapify
(2) Insert
(3) Delete
(4) Shift-up
(5) Shift-down
例如,一些资源谈论使用降档实现Heapsort;有些人使用Heapify实现了相同的算法。有些甚至使用Delete实现了它。
答案 0 :(得分:3)
1)Heapify恢复堆状态。例如,如果您更改了树中的节点,则该条件不再有效。如果在树中向上或向下移动节点,则可以恢复条件。
2)在树中插入一个节点
3)删除树中的节点
4)在树中移动节点,只要需要(取决于堆条件:min-heap或max-heap)
5)在树中向下移动一个节点,类似于4)
如果您尝试实现或理解实际代码并且不担心命名,那可能是最好的。
答案 1 :(得分:0)
在维基百科上查看,您可以获得关于堆的各种信息:
答案 2 :(得分:0)
要添加@ duedl0r回答的注释,将使用什么向上移位和向下移位来堆积当前结构。所以对于例如。在min heap的情况下,当你插入少于树中某些节点的元素时,数据结构现在不遵循堆条件(在min heap的情况下,parent的值应该小于它的子节点),所以你必须向上和向上移动。
所以在代码方面:
public void insert(int value) {
if (heapSize == data.length)
throw new HeapException("Heap's underlying storage is overflow");
else {
heapSize++;
data[heapSize - 1] = value;
siftUp(heapSize - 1);
}
}
private void siftUp(int nodeIndex) {
int parentIndex, tmp;
if (nodeIndex != 0) {
parentIndex = getParentIndex(nodeIndex);
/*if parent index data is more than child data, swap*/
if (data[parentIndex] > data[nodeIndex]) {
tmp = data[parentIndex];
data[parentIndex] = data[nodeIndex];
data[nodeIndex] = tmp;
siftUp(parentIndex);
}
}
}
data是要重新填充堆的数组,而heapSize是存储新元素的当前位置,它告诉这个堆已经满了。
同样,在删除的情况下,您必须使用shift down来重构堆。
答案 3 :(得分:0)
通过将堆化逻辑分为shiftUp和shiftDown,我们可以在插入元素时减少比较。
insert -> shift up -> only one comparison (with its parent)
remove -> shift down -> two comparison (with its left and right child's)