我需要知道二叉堆和二项堆的主要区别,而不管它们结构上的差异,即二叉堆只能有两个孩子(树形表示),而二项堆可以有任意数量的孩子。
我实际上只是想知道,在将二项树结构组织成第一个孩子具有一个节点、第二个孩子具有两个节点、第三个孩子具有四个节点等等形式方面,有什么特殊之处?
如果我们使用一些没有限制两个孩子的普通树来进行堆,然后应用联合过程并将一个堆作为其他堆的左孩子,会发生什么?
我需要知道二叉堆和二项堆的主要区别,而不管它们结构上的差异,即二叉堆只能有两个孩子(树形表示),而二项堆可以有任意数量的孩子。
我实际上只是想知道,在将二项树结构组织成第一个孩子具有一个节点、第二个孩子具有两个节点、第三个孩子具有四个节点等等形式方面,有什么特殊之处?
如果我们使用一些没有限制两个孩子的普通树来进行堆,然后应用联合过程并将一个堆作为其他堆的左孩子,会发生什么?
请注意,每个阶数的二项树都只有一个,节点数量和位置没有任何灵活性。
但是,还有一个重要的另类定义:
(花几分钟时间理解一下这两种定义为何等价)。使用这个第二个定义,可以很快地归纳证明出树中的节点数量是2n。作为基础情况,阶数为0的树有20 = 1个节点。对于归纳步骤,如果我们有两棵阶数为 n - 1 的树,则它们共有2n-1 + 2n-1 = 2n个节点。因此,阶数为n的二项树中节点的总数就是精确的2n。
你在最后一段描述的堆的想法并不总是能够获得高效的运行时间。特别地,如果你有分支因子巨大且没有其他结构约束的树,则在理论上可以建立一个由单个节点和(n - 1)个子节点组成的n个节点的堆。在这种情况下,在从堆中删除最小元素后,您必须查看所有n-1个子节点以确定哪一个是新的最小值,导致运行时间为O(n)。像完全二叉树、二项树等树的其他结构约束保证了这种最坏情况不会发生。
希望这有所帮助!
在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) ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
║ ║ ║ ║
╚══════════════╩═══════════════════════╩════════════════════════╝
我从普林斯顿大学的讲义幻灯片中获得了这张图片。
二项堆:
2k
,而是2^k
,对吗? - undefined通过将相同秩的任意两个子满二叉树连接到根节点上,可以创建一个二叉堆。它是一棵具有自由风格的树 - 一些叶子可以从右侧剪切。
秩为N的二项树不是一片森林。它是一个根节点,与之相连的是秩为N-1、N-2、...、1、0的二项树。二项堆是一棵具有绝对固定结构的树。
(恐怕有人以错误的方式阅读了维基百科。)
秩为k的二项树具有一个根节点,其子节点是秩为k-1、k-2、...、2、1、0的二项树的根节点(按此顺序)。