嗨,伙计们,我刚刚有个关于这个图表的问题。
我如何判断哪个节点是根节点,以及如何修复类似的内容?
谢谢您。
编辑:对不起,当我说heapify的时候,我是说做一个最大的堆。
通常使用常规堆时,我会从左到右,从第一个不是叶节点的节点开始向下筛选。不过,我不知道我怎么能做到这一点。
最佳答案
我想你是想把二项式堆当作二项式堆,这不管用。
ABinary Heap可以存储在一个数组中,而无需显式链接-链接在数组中的位置是隐式的无序数组可以被“heapified”,重新排序以在o(n)时间内生成有效的二进制堆。这是二进制堆的一个关键优势——有一个轻量级的实现可以很好地使用内存。
我从未实现过Binomial Heap,尽管我研究过它们,但那还是一段时间以前的事了不过,我很有信心,二项式堆不是二进制堆,不能这样实现。二项式堆有自己的优势,但它们并没有保留二项式堆的所有优势如果二项式堆是普遍优越的,没有人会关心二项式堆。
iirc,二项式树(二项式堆基于它)的正常实现是,每个父节点都有一个子节点的链接列表和一个根的链接列表。这些链表使用显式链接。这就是如何支持每个节点的k个子节点,而不在k上设置上限。
对于二进制堆,重要的额外操作是合并。如果二项式堆存储在一个具有隐式链接的数组中,那么合并显然首先需要从一个数组向另一个数组复制大量项。因此,高效的合并是不可能的——二项式堆的关键优势将丢失。
然而,对于显式链接,将两个二叉树合并为一个是O(1)指针篡改操作(将一个项添加到链接列表的头部),因此两个二叉堆可以与O(log n)二叉树合并非常有效。
这有点像排序数组和二进制搜索树之间的区别当然,排序数组有优点,但也有局限性。当您所要做的只是修改一两个链接而不在数组中移动项时,有些操作会更有效有时你不需要这些操作,而且更有效的方法是避免链接的需要,只需二进制搜索一个排序数组,这相当于搜索一个具有隐式链接的完全平衡的二进制搜索树。