我需要知道二进制和二进制堆之间的主要区别,不管它们的结构差异,二元堆只能有两个子(树表示),二项式堆可以有任意数量的子。
我实际上只是想知道组织二项式树结构的特别之处在于第一个孩子在一个节点上有第二个有两个第三个有四个等等吗?
如果我们使用一些普通树而没有两个孩子的限制然后应用联合过程并只让一个堆成为其他堆的左子,会怎么样?
答案 0 :(得分:20)
二进制堆和二进制堆之间的关键区别在于堆的结构。在二进制堆中,堆是单个树,这是一个完整的二叉树。在二项式堆中,堆是较小树的集合(即树的林),每个树都是二叉树。可以构建完整的二叉树来容纳任意数量的元素,但是某个n阶的二叉树中的元素数量总是 2 n 。因此,我们只需要一个完整的二叉树来支持二进制堆,但是我们可能需要多个二叉树来支持二项式堆。有趣的是,二项式堆中使用的二叉树的顺序对应于森林中元素数量的二进制表示中设置的1位。
组织二项式堆的原因是,n阶二叉树总是在其中具有正好2个 n 节点。这允许我们对二叉树中的元素数量进行假设,而不必实际检查该树的结构。另一方面,某个高度为h的完整二叉树可能在其中具有可变数量的节点,具体取决于最后一行的填充方式。每个子节点必须具有非常精确定义的结构这一事实也可用于证明子节点数最多为O(log n),其中n是堆中节点的总数,这意味着删除分钟的成本不是太大。
这背后的一个重要细节是二项式堆不任何碰巧有k个孩子的树。这是一棵严格定义为
的树(从技术上讲,此处不需要订单0特殊情况)。你可以在这里看到:
请注意,每个订单中都有完全一棵树,在节点的数量或位置上根本没有灵活性。
但是,一个重要的替代定义如下:
(花点时间看看为什么这些是等价的)。使用第二个定义,它是一个快速的感应证明,表明树中的节点数是2 n 。作为基本情况,0阶的树根据需要具有2个 0 = 1个节点。对于归纳步骤,如果我们有两个n - 1阶的树,它们总共有2个 n-1 + 2 n-1 = 2 n 节点根据需要。因此,n阶二叉树中的节点总数正好是2 n 。
您在最后一段中描述的堆的想法并不总能带来高效的运行时。特别是,如果您的树具有巨大的分支因子而没有其他结构约束,那么理论上您可以构建一个由n个节点组成的堆,这些节点由具有(n-1)个子节点的单个节点组成。在这种情况下,在从堆中删除最小元素之后,您必须查看所有n - 1个子节点以确定哪个是新的最小值,从而给出O(n)的运行时间。树的其他结构约束,如完整的二叉树,二叉树等,保证不会发生这种最坏情况。
希望这有帮助!
答案 1 :(得分:2)
可以通过将相同等级的任何两个子完整二叉树连接到根节点来创建二进制堆。这是一棵有点自由风格的树 - 有些叶子可以从右边切割
等级N的二叉树不树林。它是连接到它的根节点等级为N-1,N-2,...,1,0的二叉树。二项堆是具有绝对固定结构的树。
(恐怕有人以错误的方式阅读过Wiki。) A binomial tree of order k has a root node whose children are roots of binomial trees of orders k−1, k−2, ..., 2, 1, 0 (in this order).
答案 2 :(得分:0)
添加上面由templatetypedef提供的上述答案。这是一个可视化表,显示不同操作的不同时间复杂度
╔══════════════╦═══════════════════════╦════════════════════════╗
║ Operation ║ Binary ║ Binomial ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ║ ║
║ insert ║ O(logN) ║ O(logN) ║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ find Min ║ O(1) ║ O(logN) ║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ║ ║
║ Revmove ║ O(logN) ║ O(logN) ║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ║ ║
║ Decrease Key ║ O(logN) ║ O(logN) ║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ║ ║
║ Union ║ O(N) ║ O(logN) ║
║ ║ ║ ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║ ║ ■ Min element is root ║order k binomial tree Bk║
║ ║ ■ Heap height = logN ║ ■ Number of nodes = 2k.║
║ ║ ║ ■ Height = k. ║
║ ║ ║ ■ Degree of root = k. ║
║ Useful ║ ║ ■ Deleting root yields ║
║ Properties ║ ║ binomial trees ║
║ ║ ║ Bk-1, … , B0. ║
║ ║ ║ (see graph below) ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
╚══════════════╩═══════════════════════╩════════════════════════╝
获得了这张图片
二项式堆