从给定的整数数组构建d-heap

时间:2017-10-28 08:45:26

标签: java heap

所以我建立了一个d堆,这是我的构造函数:

public DHeap(int[] items)
{
    currentSize = items.length;
    array = new int[(currentSize + 2) * 11 / 10];

    int i = 0;
    for(int item : items)
        array[ i++ ] = item;

    buildHeap();
}

所以基本上它接受了一个数组,它需要将它构建成一堆可以这么说。我对buildHeap方法感到困惑。我知道对于二进制堆,buildHeap方法是:

private void buildHeap()
{
    for(int i = currentSize / 2; i >= 0; i--)
        percolateDown(i);
}

但是,我正在制作d堆(d =每个节点都有子节点数)。因此,我对如何设置buildHeap方法感到困惑。它会像这样设置吗?

private void buildHeap()
{
    for(int i = currentSize / d; i >= 0; i--) // d is a global variable
        percolateDown(i);
}

或者它的设置是否与二进制堆完全相同?只是为了澄清percolateDown与heapifyDown相同,我知道有时人们会使用不同的术语。

1 个答案:

答案 0 :(得分:0)

build-heap 算法背后的洞察力是你必须筛选所有非叶子节点。在完整的二进制堆中,一半节点是叶节点。你显然无法进一步推动叶子节点,所以你从第一个非叶子节点开始,这个节点是n / 2。

在d-heap中,叶节点的数量与堆的总大小成比例地大得多。例如,在具有三个级别的4堆中,有16个叶节点和5个非叶节点。 build-heap 方法只需要检查五个节点,或1+(n/d)。您从节点n/d开始。

请参阅我的博客文章The d-ary heap,了解更多信息。