算法导论期末复习(二项堆)

@算法导论

算法导论期末复习(二项堆)

1、二项树

定义:

二项树是一种递归定义的有序树,它只包含一个子节点,二叉树 B n B_n Bn的是由两棵
B n − 1 B_{n-1} Bn1树构成的。其中一棵树的根是另一棵树根的左子树。

性质:

对于二项树 B k B_k Bk有以下的性质:
①:共有2^k个节点。
②:树的高度为k。
③:在深度 i 处。恰好有 C k i C_k^i Cki个节点。
④:根的度数为 k,他大于任何其他节点的度数,并且根的子女,从左到右编号为
k-1,k-2,…,0,子女 i 是子树 B i B_i Bi的根。

推论:

一棵包含n个节点的二项树中,任意节点的最大度数为 l g n lgn lgn。//性质①④可直接推的。

2、二项堆

定义:

二项堆是由满足以下性质的二项树组成的:
①:满足最小堆有序,二项堆中的每一个节点的关键字都大于或者等于其父节点的关键字。
②:对于非负整数 k ,堆中最多只有一棵二项树的根节点度数为 k 。

如下图所示为一个二项堆的实例:
二项堆

二项堆表示:

每个节点包含了指向其父节点的指针p[x],包含了指向其最左边孩子节点的指针child[x],包含了指向其右兄弟节点的指针sibling[x] ,并且每个节点都有包含其子女个数的域degree[x]。对于堆中的每个二项树的根节点,组成了一个链表,称为根表,且按照各根的度数递增的方式排序。

如下图为二项堆的具体表示实例:
二项堆表示实例

3、二项堆的操作

寻找最小关键字:

由上面的二项堆定义可知,堆中的最小关键字一定在二项树的根节点中,所以直接遍历二项堆的根表,便可以得到二项堆的最小值,故时间复杂度应该为 l g n lgn lgn

合并两个二项堆:

对于合并两个二项堆,就是不断合并两个二项堆中,度数相同的子树的并且将根节点插入到根表的过程。
我们首先确定合并两个 B k − 1 B_{k-1} Bk1成为 B k B_k Bk树的伪代码实现过程(Y为子):
1 BINOMIAL-LINK(Y,Z)
2 P[Y] = Z
3 SIBLING[Y] = CHILD[Z]
4 CHILD[Z] =Y
5 DEGREE[Z] = DEGREE[Z] +1

再来分析整个合并二项堆的伪代码,其中BINOMIAL-HEAP-MERGE函数是将二项堆 H1 和 二项堆 H2 的根表合并成按度数单调递增的链表,具体伪代码如下图(合并过程有四种情况):
算法
在上图中的第16行的if 是和第18行的else配对的。代码中所提到的四种情形如下图所示:

在这里插入图片描述
代码中的四种情形,应该从第三种和第四种开始分析,较为容易理解。

插入一个结点

对于二项堆的插入过程,应该是先建立一个只含有一个该节点的二项堆H‘,再使用合并操作,将H和H’合并,即可将节点插入。

抽取具有最小关键字的结点

当我们从堆中抽取删除了最小关键字结点 x 后,如果 x 为 一棵 B k B_k Bk树的根,那么 x 的各子女从左往右分别为Bk-1,Bk-2,…,B0。我们要做的是将这些 X 的子女结点,逆转形成一个包含 k-1 个根节点的堆H’,再将 H 和 H’ 一起合并新堆。此时我们可以得到时间复杂度应为 l g n lgn lgn

减少关键字的值

因为是减小关键字的值,而结点的子女结点都是大于父结点,只需要将减少关键字值的结点与其父节点相比较,如果结点大于父节点,不做任何操作,如果小于父节点,就交换两个结点的值,并且递归的执行这个过程。

删除一个关键字

将这个关键字标记为负无穷,执行减少关键字值的操作,再执行抽取具有最小关键字的结点的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序猿可能都知道 数据结构算法 = 程序 ,慧眼识金的人懂得下下载这本算法导论的想必也知道它的经典,这是本清晰度还不错的pdf版本,外面好多资源,但都有内容不全的问题,这本是难得的全书,不用费力下载part 1234...了,分享给大家 《算法导论》((美国)Cormen)[PDF] 第二版,2006年出版的 目录: 第一部分 基础知识 引言 第1章 算法在计算中的作用 1.1 算法 1.2 作为一种技术的算法 第2章 算法入门 2.1 插入排序 2.2 算法分析 2.3 算法设计 2.3.1 分治法 2.3.2 分治法分析 第3章 函数的增长 3.1 渐近记号 3.2 标准记号和常用函数 第4章 传归式 4.1 代换法 4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率分析和随机算法 5.1 雇用问题 5.2 指示器随机变量 5.3 随机算法 5.4 概率分析和指示器随机变量的进一步使用 5.4.1 生日悖论 5.4.2 球与盒子 5.4.3 序列 …… 第二部分 排序和统计学 引言 第6章 排序 第7章 快速排序 第8章 线性时间排序 第9章 中位数和顺序统计学 第三部分 数据结构 第10章 基本数据结构 第11章 散列表 第12章 二叉查找树 第13章 红黑树 第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第15章 动态规划 第16章 贪心算法 第17章 平摊分析 第五部分 高级数据结构 概述 第18章 B树 第19章 二项 第20章 斐波那契 第21章 用于不相交集合的数据结构 第六部分 图算法 引言 第22章 图的基本算法 第23章 最小生成树 第24章 单源最短路径 第25章 每对项点间的最短路径 第26章 最大流 第七部分 算法研究问题选编 引言 第27章 排序网络 第28章 矩阵运算 第29章 线性规划 第30章 多项式与快速傅里叶变换 第31章 有关数论的算法 第32章 字符串匹配 第33章 计算几何学 第34章 NP完全性 第35章 近似算法 第八部分 附录:数学基础知识 引言 A 求和 B 集合等离散数学结构 C 计数和概率 参考文献 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值