所以我建立了一个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相同,我知道有时人们会使用不同的术语。
答案 0 :(得分:0)
build-heap 算法背后的洞察力是你必须筛选所有非叶子节点。在完整的二进制堆中,一半节点是叶节点。你显然无法进一步推动叶子节点,所以你从第一个非叶子节点开始,这个节点是n / 2。
在d-heap中,叶节点的数量与堆的总大小成比例地大得多。例如,在具有三个级别的4堆中,有16个叶节点和5个非叶节点。 build-heap 方法只需要检查五个节点,或1+(n/d)
。您从节点n/d
开始。
请参阅我的博客文章The d-ary heap,了解更多信息。