Binomial Heaps二项堆
二项堆(Binomial Heap)是一种类似于二叉堆(Binary Heap)的堆结构。与二叉堆相比,其优势是可以快速合并两个堆,因此它属于可合并堆(Mergeable Heap)。斐波那契堆也是可合并堆。一个二项堆由一组二项树所构成,这里的二项树(Binomial Trees)不同于二叉树(Binary Trees)。二叉树是“左孩子,右孩子”的表示方法,而二项树是“左孩子,右兄弟”的表示方法.
二项树与二叉树最大的不同是,二项树是一棵分支数无限制的有根树(Rooted trees with unbounded branching, 下图图示),而二叉树最多有两个分叉。
二项堆(Binomial Heap)是一种类似于二叉堆(Binary Heap)的堆结构。与二叉堆相比,其优势是可以快速合并两个堆,因此它属于可合并堆(Mergeable Heap)。斐波那契堆也是可合并堆。一个二项堆由一组二项树所构成,这里的二项树(Binomial Trees)不同于二叉树(Binary Trees)。二叉树是“左孩子,右孩子”的表示方法,而二项树是“左孩子,右兄弟”的表示方法.
二项树与二叉树最大的不同是,二项树是一棵分支数无限制的有根树(Rooted trees with unbounded branching, 下图图示),而二叉树最多有两个分叉。
二、分支树无限制的有根数
对于多叉树,也许你会想,结点的分支增多,直接用child1, child2…, childk来取代left和right域不就得了。但是如果树中结点的子女数是无限制的,那么就不行了。因为我们不知道事先要开多大的域,通常情况下,为了防止最坏情况,会开一个很大的界,这种情况下如果多数结点只有少数子女,则会浪费大量内存空间。而左图这种“左孩子,有兄弟”的方法可以完美解决这个问题。它的每个结点包含域p[x](顶端),left-child[x](指向结点x的最左孩子), right-child[x](指向x紧右边的兄弟)。也就是说,一个结点的所有孩子形成一个链表,这样中间就可以任意加入结点了,在加入结点到树中时,动态开辟空间,这样就不会浪费任何空间了。
三、二项树
而二项树则是一种特殊的多分支有序树。结构如右图,(右图a)二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。二项树的性质有:
1)共有2k个结点。
2)树的高度为k。
3)在深度i处恰有Cik个结点。
4)根的度数(子女的个数)为k,它大于任何其他结点的度数;如果根的子女从左到右的编号设为k-1, k-2, …, 0,子女i是子树Bi的根。
右图中图(b)表示二项树B0至B4中示出了各结点的深度。图(c)是以另外一种方式来看二项树Bk。PS : 在一棵包含n个结点的二项树中,任意结点的最大度数为lgn.
四、二项堆
前边已经说过一个二项堆由一组二项树所构成,这里的二项树需要满足下列条件:
1)H中的每个二项树遵循最小堆的性质:结点的关键字大于等于其父结点的关键字。
2)对于任意非负整数k,在H中至多有一棵二项树的根具有度数k。
对于性质2,任意高度最多有一棵二项树,这样就可以用二项树的集合唯一地表示任意大小的二项堆,比如13个结点的二项堆H,13的二进制表示为(1101),故H包含了最小堆有序二项树B3, B2和B0, 他们分别有8, 4, 2, 1个结点,即共有13个结点。如下图(另外:二项堆中各二项树的根被组织成一个链表,称之为根表)