Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果您有一个大小为14的二项式堆,如何判断哪个节点是根节点?_Algorithm_Sorting_Heap_Root_Max - Fatal编程技术网

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

Algorithm 如果您有一个大小为14的二项式堆,如何判断哪个节点是根节点?,algorithm,sorting,heap,root,max,Algorithm,Sorting,Heap,Root,Max,嗨,伙计们,我刚才对这个图表有个问题。 如何判断哪个节点是根节点,以及如何处理类似的问题 多谢各位 编辑:对不起,当我说heapify时,我的意思是做一个最大堆。 通常对于常规堆,我会从左到右,从第一个不是叶节点的节点开始向下筛选。不过,我不知道我怎么能在这里做到这一点 从概念上讲,根应该是唯一一个没有祖先的节点——在图表中为1。这是一个二项式堆,它没有一个根,而是一组根(因为二项式堆是一组二项式树) 你说的“做一个最大的堆”是什么意思? 最大堆和二项式堆之间的距离就像java和javascri

嗨,伙计们,我刚才对这个图表有个问题。 如何判断哪个节点是根节点,以及如何处理类似的问题

多谢各位

编辑:对不起,当我说heapify时,我的意思是做一个最大堆。 通常对于常规堆,我会从左到右,从第一个不是叶节点的节点开始向下筛选。不过,我不知道我怎么能在这里做到这一点


从概念上讲,根应该是唯一一个没有祖先的节点——在图表中为1。

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

你说的“做一个最大的堆”是什么意思? 最大堆和二项式堆之间的距离就像java和javascript一样接近


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

我认为您试图将二项式堆视为二进制堆,这是行不通的

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

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

IIRC,二项式树(基于二项式堆)的正常实现是,每个父节点都有子节点的链接列表和根的链接列表。这些链表使用显式链接。这就是每个节点支持k个子节点的方式,k没有上限

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

然而,对于显式链接,将两个二叉树合并为一个是O(1)指针篡改操作(将一个项目添加到链接列表的头部),因此两个二叉堆可以非常有效地与O(logn)二叉树合并


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

我不确定您在问什么。一般情况下,二项式堆不是树,而是树的集合。它没有“根节点”。即使它恰好是一棵树,它也应该已经被重分类,并且根节点是最小的关键节点。这都是二项式堆的定义,“最大堆”是最高优先级的项是最大(最大)项的任何堆。这可以是一个二项式堆,就像它可以是一个二进制堆一样简单。最大堆与最小堆独立于堆数据结构。这就是说,从最小堆到最大堆的改变是微不足道的(用代码交换代码),所以不要相信Adam真的在问他在问什么+不过,关于排序数组的一点,请参见1。