回忆一下左叉堆和斜堆。二者进行插入,删除的平均时间为O(log N)。虽然说已经够为快速,但前人还发明了另外一种不仅能将最坏的操作时间减少至O(logN),同时插入操作的时间为Θ(N)的数据结构:二项队列(binomial queue)。
1、二项队列结构
二项队列不同于之前的优先队列之处在于:二项队列是一棵堆序的树的集合,因此称之为森林(forest)。其中的每一棵树为二项树(binomial tree)。
二项树的表示有两种方式。
第一种:(图片来源见水印)
可以看到,假设B0、B1、B2......为一个规律数列,则可以看到Bn和B(n-1)的关系为Bn由两个相同的B(n-1)二项树构成,其中的两个B(n-1)二项树的根相连接,并将其中的一个根作为新生成的Bn的根。
另外的一种表示方式为根节点存储在数组中时应当表示的形式,不过在介绍这种方式之前,我们先分析二项队列的部分操作。
2、二项队列操作
对于单个二项树来说,我们要在事前明确二项树也满足堆的堆序性质。即根存储的元素为单棵树中最小的元素,因此对于logN棵不同的树,要找到这些树中最小的单元,只用搜索所有的根节点,所消耗的时间为O(log N)。
之后我们介绍的操作为合并,即Merge,应当注意的是,前面我们Merge