二项堆是一种比较复杂的堆结构,这种数据结构在"算法-c语言实现(第3版)"中有讲解,可惜这本书实在把二项堆说得云山雾罩。
二项堆是二项树的集合。下面先说明二项树再说明二项堆及其各种操作。
二项树
二项树是一种递归定义的树,它的定义如下:
- 二项树B0只有一个节点。
- 二项树Bk由两棵二项树B(K-1)组成,其中一棵树是另一棵树的最左孩子。
如下图所示:
上图的B0,B1,B2 ...
阅读全文 »
斜堆(skew heap)是左倾堆的一个变种,与左倾堆一样,合并的时间复杂度也是O(lgn)。相对于左倾堆来说,斜堆没有零距离这个概念,而是在合并操作的时候,每次交换左右子树。
斜堆的定义
typedef struct skew_heap_s *skew_heap_pt;
typedef struct skew_heap_s {
skew_heap_pt ...
阅读全文 »
左倾堆(leftist tree 或 leftist heap)又称为左式堆,左偏树,左偏堆,最左堆等。左倾堆是优先队列的一种实现方式,当优先队列需要解决“两个优先队列合并”的问题时,二叉堆的效率就比较差了,这时左倾堆等方式可以很好的解决这类问题。左倾堆合并时间复杂度为O(lgn)。左倾堆在统计问题,最值问题 ...
阅读全文 »
D堆是二叉堆的简单推广,跟二叉堆的区别是所有的节点都有d个儿子,代码也跟二叉堆的相似。下图表示一个D=3的最小D堆。
D堆插入操作的时间改进为O(log(d,N)),然面删除操作要花费较大时间,一般需要O(d*log(d,N))。如果D不是2的幂,也不能通过二进制移位来实现乘法和除法,这样也大大增加运行时间。
大部分时候总是使用二叉堆,但D堆也在一些情况下使用 ...
阅读全文 »
堆是一颗完全树,同时满足每个节点均大于或小于它的子节点,这样的数据结构被称为最大堆或者最小堆。
这种结构处于一种半排序状态,它的存取效率从整体上讲介于有序和无序之间。当对象处于动态时,是种非常有优势的数据结构。存取的时间复杂为log(a,n),其中a为完全树的度。
通常二叉堆以数组存储,层为 log(2,n),可以使用以下的代码来定义二叉堆结构。
typedef struct binary_heap_s ...
阅读全文 »