二项堆的C语言实现

Date 2016-10-01(星期六) 16:41 By Ming In 算法 Tags 算法,

二项堆是一种比较复杂的堆结构,这种数据结构在"算法-c语言实现(第3版)"中有讲解,可惜这本书实在把二项堆说得云山雾罩。

二项堆是二项树的集合。下面先说明二项树再说明二项堆及其各种操作。

二项树

二项树是一种递归定义的树,它的定义如下:

  1. 二项树B0只有一个节点。
  2. 二项树Bk由两棵二项树B(K-1)组成,其中一棵树是另一棵树的最左孩子。

如下图所示:

图一

上图的B0,B1,B2 ...

阅读全文 »


斜堆的C语言实现

Date 2016-09-25(星期日) 21:16 By Ming In 算法 Tags 算法,

斜堆(skew heap)是左倾堆的一个变种,与左倾堆一样,合并的时间复杂度也是O(lgn)。相对于左倾堆来说,斜堆没有零距离这个概念,而是在合并操作的时候,每次交换左右子树。

斜堆的定义

typedef struct skew_heap_s *skew_heap_pt;

typedef struct skew_heap_s {  
    skew_heap_pt ...

阅读全文 »


左倾堆的C语言实现

Date 2016-09-24(星期六) 13:47 By Ming In 算法 Tags 算法,

左倾堆(leftist tree 或 leftist heap)又称为左式堆,左偏树,左偏堆,最左堆等。左倾堆是优先队列的一种实现方式,当优先队列需要解决“两个优先队列合并”的问题时,二叉堆的效率就比较差了,这时左倾堆等方式可以很好的解决这类问题。左倾堆合并时间复杂度为O(lgn)。左倾堆在统计问题,最值问题 ...

阅读全文 »


D堆的C语言实现

Date 2016-09-23(星期五) 19:13 By Ming In 算法 Tags 算法,

D堆是二叉堆的简单推广,跟二叉堆的区别是所有的节点都有d个儿子,代码也跟二叉堆的相似。下图表示一个D=3的最小D堆。

图

D堆插入操作的时间改进为O(log(d,N)),然面删除操作要花费较大时间,一般需要O(d*log(d,N))。如果D不是2的幂,也不能通过二进制移位来实现乘法和除法,这样也大大增加运行时间。 大部分时候总是使用二叉堆,但D堆也在一些情况下使用 ...

阅读全文 »


二叉堆的C语言实现

Date 2016-07-04(星期一) 23:13 By Ming In 算法 Tags 算法,

堆是一颗完全树,同时满足每个节点均大于或小于它的子节点,这样的数据结构被称为最大堆或者最小堆。 这种结构处于一种半排序状态,它的存取效率从整体上讲介于有序和无序之间。当对象处于动态时,是种非常有优势的数据结构。存取的时间复杂为log(a,n),其中a为完全树的度。

通常二叉堆以数组存储,层为 log(2,n),可以使用以下的代码来定义二叉堆结构。

typedef struct binary_heap_s ...

阅读全文 »