它通过不同的堆操作实际意味着什么?

时间:2011-06-28 13:13:17

标签: data-structures heap

有各种堆操作,并且为同一操作提供了各种名称。

我被名字和别名所淹没。

请澄清,以下堆操作之间有什么区别/相似之处/关系:

(1) Heapify
(2) Insert
(3) Delete
(4) Shift-up
(5) Shift-down

例如,一些资源谈论使用降档实现Heapsort;有些人使用Heapify实现了相同的算法。有些甚至使用Delete实现了它。

4 个答案:

答案 0 :(得分:3)

1)Heapify恢复堆状态。例如,如果您更改了树中的节点,则该条件不再有效。如果在树中向上或向下移动节点,则可以恢复条件。

2)在树中插入一个节点

3)删除树中的节点

4)在树中移动节点,只要需要(取决于堆条件:min-heap或max-heap)

5)在树中向下移动一个节点,类似于4)

如果您尝试实现或理解实际代码并且不担心命名,那可能是最好的。

答案 1 :(得分:0)

在维基百科上查看,您可以获得关于堆的各种信息:

http://en.wikipedia.org/wiki/Heap_%28data_structure%29

答案 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)

https://discuss.codecademy.com/t/what-are-some-differences-between-heapify-up-and-heapify-down/375384