Algorithm 二进制堆和二项式堆之间的区别是什么?
我需要知道二元堆和二项式堆之间的主要区别,不管它们的结构不同,二元堆只能有两个子堆(树表示),而二项式堆可以有任意数量的子堆 实际上我只是想知道,在组织二叉树结构时,有什么特别之处,第一个子节点上有一个节点,第二个节点上有两个节点,第三个节点上有四个节点,依此类推Algorithm 二进制堆和二项式堆之间的区别是什么?,algorithm,data-structures,priority-queue,binary-heap,binomial-heap,Algorithm,Data Structures,Priority Queue,Binary Heap,Binomial Heap,我需要知道二元堆和二项式堆之间的主要区别,不管它们的结构不同,二元堆只能有两个子堆(树表示),而二项式堆可以有任意数量的子堆 实际上我只是想知道,在组织二叉树结构时,有什么特别之处,第一个子节点上有一个节点,第二个节点上有两个节点,第三个节点上有四个节点,依此类推 如果我们对堆使用普通树,而不限制两个子堆,然后应用联合过程,只使一个堆成为其他堆的左子堆,会怎么样?二进制堆和二项式堆的关键区别在于堆的结构。在二进制堆中,堆是一棵树,它是一棵完整的二叉树。在二项式堆中,堆是一组较小的树(即树木的森林
如果我们对堆使用普通树,而不限制两个子堆,然后应用联合过程,只使一个堆成为其他堆的左子堆,会怎么样?二进制堆和二项式堆的关键区别在于堆的结构。在二进制堆中,堆是一棵树,它是一棵完整的二叉树。在二项式堆中,堆是一组较小的树(即树木的森林),每个树都是一棵二项式树。一个完整的二叉树可以容纳任意数量的元素,但是一个n阶二叉树中的元素数量总是2n。因此,我们只需要一个完整的二叉树来支持一个二叉堆,但我们可能需要多个二叉树来支持一个二叉堆。有趣的是,二项式堆中使用的二项式树的顺序对应于林中元素数的二进制表示中设置的1位 按原样组织二项堆的原因是,n阶二项树中始终正好有2n个节点。这使我们能够假设二叉树中的元素数量,而不必实际检查该树的结构。另一方面,一个高度为h的完整二叉树中的节点数量可能会根据最后一行的填充方式而变化。每个子级必须有一个非常精确定义的结构,这一事实也可以用来证明子级的数量最多为O(logn),其中n是堆中的节点总数,这意味着delete min的开销不会太大 这背后的一个重要细节是,二项式堆不是任何碰巧有k个子树的树。这是一棵被严格定义为
- 阶数为0的二叉树是单个节点,并且
- n阶二叉树是一个节点,其子节点为0、1、2、…、n-1阶二叉树
- 阶数为0的二叉树是单个节点,并且
- n阶二叉树是两棵n-1阶二叉树,其中一棵树是另一棵树的子树
希望这有帮助 二进制堆可以通过将任意两个具有相同秩的完整二叉树连接到根节点上来创建。这是一棵有点自由风格的树——有些叶子可以从右边剪下来 秩N的二叉树不是树的森林。它是一个根节点,与其相连秩为N-1,N-2,…,1,0的二叉树。二项式堆是一棵结构绝对固定的树 (恐怕有人看错了维基。)
添加到上面由templatetypedef提供的伟大答案。下面是一个可视化表格,显示不同操作的不同时间复杂度
╔══════════════╦═══════════════════════╦════════════════════════╗
║ 活动║ 二元的║ 二项式║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ║ ║
║ 插入║ O(后勤)║ O(后勤)║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ 找敏║ O(1)║ O(后勤)║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║