结构之美——优先队列三大结构(一)——二项堆

这三篇文章主要讲解二项堆、斐波那契堆、Pairing 堆,这三种结构主要用于优先队列的实现。资料主要参考《算法导论》和或互联网。

 

《算法导论》第19章讲到了二项堆

 

1.二项堆简介                                                                                

 

二项堆是二项堆是由一组二项树组成,在给出二项堆的定义之前,首先我们来定义什么是二项树。

1.1二项树

二项树是一种递归的有序树。定义如下:

1. 二项树B[0]仅仅包含一个节点

2. B[k]是由两棵B[k-1]二项树组成,其中一颗树是另外一颗树的左孩子。

下面(a)是二项树B[k]递归定义,(b)二项树B[0]到B[4],(c)看待二项树的另一种方式:

 二项树的性质:

1. 对于树B[k]该树含有2^k个节点;

2. 树的高度是k;

3. 在深度为i中含有Cik节点,其中i = 0, 1,2 ... , k;

4. 根的度数为k,最大,

推论:n节点的二项树,任意节点的最大度数为log(n)

1.2二项堆

二项堆是由一组满足下面的二项树组成:

1.  H中的每个二项树遵循最小堆性质(类似小顶堆);

2. 对于任意的整数k的话,在H只存在一个度数是k的二项树;

另外定义:

1. 二项堆的度数定义成子女个数;

2. 定义二项堆的根表是二项树的根节点形成的链表;

 

2.数据结构                                                                           

 

了解了什么二项堆的定义和使用场景之后,我们来看看如何存储二项堆?

首先定义二项堆中每个节点的类型:

1. parent:指向父节点

2. sibling:指向右边的兄弟节点

3. child:定义该节点的子节点

4. degree:定义该节点的度数

5. 其他应用场景中需要的数据

struct heap_node
{
struct heap_node*parent;
struct heap_node*ne
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值