如果您有一个大小为14的二项式堆,那么如何判断哪个节点是根节点?

时间:2012-12-09 04:54:59

标签: algorithm sorting heap root max

enter image description here

大家好,我刚才对这个图表有疑问。 如何判断哪个节点是根节点?我将如何堆积这样的东西?

谢谢。

  

编辑:对不起,当我说堆化时,我的意思是创建一个最大堆。               通常使用常规堆,我会从左到右,从第一个不是叶节点的节点开始向下筛选。我不知道如何在这里做到这一点。

3 个答案:

答案 0 :(得分:2)

这是一个二项式堆,它没有一个根而是一组根(因为二项式堆是一组二叉树)。

“制作最大堆”是什么意思? 最大堆和二项式堆就像java和javascript一样彼此接近。

如果提取最少n次,则可以获得一个最大堆的排序数组。复杂度为O(n * log(n))。

答案 1 :(得分:1)

从概念上讲,根应该是唯一没有祖先的节点 - 在图表的情况下为1。

答案 2 :(得分:1)

我认为您正在尝试将二项式堆视为二进制堆,但这不起作用。

Binary Heap可以存储在没有显式链接的数组中 - 链接隐含在数组中的位置。无序数组可以“堆积”,重新排序以在O(n)时间内生成有效的二进制堆。这是二进制堆的一个关键优势 - 有一个轻量级的实现,可以很好地使用内存。

我从来没有实现Binomial Heap,虽然我已经研究过了,但是不久之前。不过,我非常有信心,二进制堆不是二进制堆,也不能以这种方式实现。二项式堆有其自身的优点,但它们不能保留二进制堆的所有优点。如果二项式堆普遍优越,那么没有人会关心二进制堆。

IIRC,二叉树的常规实现(二叉堆的基础)是你有一个子节点的链接列表,每个父节点和一个根链表。这些链接列表使用显式链接。这就是你如何支持每个节点的k个子节点,k没有上限。

二进制堆的重要额外操作是合并。如果二项式堆存储在具有隐式链接的数组中,则合并显然需要大量复制 - 将项目从一个数组复制到另一个数组中以便开始。因此,高效合并是不可能的 - 二项堆的关键优势将会丢失。

然而,使用显式链接,将两个二叉树组合成一个是O(1)指针 - 摆弄操作(将项添加到链表的头部),因此两个二项式堆可以与O合并(log n )二叉树非常有效地合并。

这有点像排序数组和二叉搜索树之间的区别。当然,排序后的阵列具有优势,但也有局限性。当您只需修改一个或两个链接而不在数组中移动项目时,某些操作会更有效。有时你不需要那些操作,并且更有效的是避免需要链接而只是二元搜索排序的数组,这相当于用隐式链接搜索完美平衡的二叉搜索树。