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

本文深入解析二项堆数据结构,包括二项树定义、性质及其在二项堆中的应用。探讨了二项堆的表示方式,关键操作如寻找最小关键字、合并、插入、删除等的实现及时间复杂度分析。

@算法导论

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

1、二项树

定义:

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

性质:

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

推论:

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

2、二项堆

定义:

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

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

二项堆表示:

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

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

3、二项堆的操作

寻找最小关键字:

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

合并两个二项堆:

对于合并两个二项堆,就是不断合并两个二项堆中,度数相同的子树的并且将根节点插入到根表的过程。
我们首先确定合并两个Bk−1B_{k-1}Bk1成为BkB_kBk树的伪代码实现过程(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 为 一棵BkB_kBk树的根,那么 x 的各子女从左往右分别为Bk-1,Bk-2,…,B0。我们要做的是将这些 X 的子女结点,逆转形成一个包含 k-1 个根节点的堆H’,再将 H 和 H’ 一起合并新堆。此时我们可以得到时间复杂度应为lgnlgnlgn

减少关键字的值

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

删除一个关键字

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

程序猿可能都知道 数据结构算法 = 程序 ,慧眼识金的人懂得下下载这本算法导论的想必也知道它的经典,这是本清晰度还不错的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 计数和概率 参考文献 索引
算法导论是计算机科学中非常重要的一门课程,它涵盖了计算机算法的设计、分析与应用。期末复习是为了加深对所学知识的理解和掌握,为考试做好充分准备。 使用Python语言进行算法导论复习是一种很好的选择。Python是一种强大且易于上手的编程语言,具有简洁的语法和丰富的库支持。下面是几个复习的重点: 1. 熟悉Python的基本语法和数据结构:掌握Python的基本数据类型如列表、字典和集合,并了解它们的操作与性能。 2. 掌握常见排序算法复习插入排序、归并排序、快速排序等常见的排序算法,并能够灵活应用它们解决实际问题。 3. 熟悉图算法:学习图的表示方法,以及广度优先搜索(BFS)和深度优先搜索(DFS)等基本的图算法。 4. 熟练应用动态规划算法:了解动态规划的基本思想,复习使用动态规划解决背包问题、最长公共子序列等典型问题。 5. 学习贪心算法:了解贪心算法的概念和特点,熟悉使用贪心算法解决活动选择、哈夫曼编码等问题。 6. 熟练掌握分治算法复习分治算法的基本思想和应用,熟悉使用分治算法解决最大子数组和矩阵乘法等问题。 7. 复习基本的算法分析方法:熟悉时间复杂度和空间复杂度的概念,掌握算法的渐进分析方法。 在复习过程中,可以通过参考教材、课堂笔记和习题集等资料进行练习和巩固所学知识。此外,可以参考一些算法导论的相关网上资源和在线教育平台上的课程进行深入学习。最重要的是,要坚持刷题,多进行实际编码练习,巩固所学算法的理解和应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值