算法导论第21章思考题
脱机最小值(off-line minimum problem)
输入
给定一个操作序列,包括INSERT(x)和EXTRACT-MIN,操作数x∈[1,n]
样例输入
4,8,E,3,E,9,2,E,E
输出
将第i次EXTRACT-MIN的数保存在extract[i]中
在线算法
建立一个优先队列,给定一个操作,马上在优先队列中做出相应改变即可
离线算法(off-line)
算法解释:将样例输入看成S1,E,S2,E,S3,E,S4,E,其中S1={4,8},S2={3},S3={9,2},S4={},为不相交的集合。i从小的开始找,如样例输入中最小的是2,调用FIND-SET(2),属于S3,所以extract[3]=2,随后,调用UNION(S3,S4),把S3合并到S4中。
算法的运行效率:O(n*α(n))
深度确定(depth-determination)
目的
维护一个具有MAKE-TREE、GRAFT、FIND-DEPTH操作的森林F={Ti}
实现
新建一个并查集森林S={Si},每个Si对应于一个Ti,Si中的结点额外保存了一个伪距离d
MAKE-TREE类似于MAKE-SET:node.p = node,node.d = 0
FIND-DEPTH类似于FIND-SET:在递归的过程中重置路径上结点的d,并把结点指向根节点
GRAFT类似于UNION:把a接到b上,a.d = b.d+1
时间效率
毫无疑问,O(m*α(m))
最小公共祖先算法(Lowest Common Ancestor)
不同于思考题,这里贴出一个讲义上的LCA算法:https://web.stanford.edu/class/cs97si/03-data-structures.pdf
算法时间
预处理每个结点:O(lgn),对于每个询问O(lgn)
算法流程
①计算出每个结点x的第2^k个祖先,并保存在Anc[x][k]中:
②对于每个询问(p,q),不妨设p.depth < q.depth。将q向上移动,调整至p.depth = q.depth
③for k = lgn to 0,若p、q的第2^k祖先相同,则尝试更小的k;若不同,则将p、q移至第2^k的祖先处
④重复这一过程,直到p=q
以上是本人的一点思考,如有错误还请指出~
算法导论第21章思考题相关推荐
- 算法导论第21章:并查集
算法分析的一个约定 MAKE-SET的次数为n MAKE-SET.FIND-SET.UNION的总次数为m 不相交数据集合的链表实现 链表表示一个集合,结点表示一个元素.每个结点都有指向头节点的指针, ...
- 位向量(bit vector)(算法导论第十一章11.1-2)
位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...
- 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)
假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...
- 利用链表实现可合并堆(算法导论第三版思考题10-2)
利用链表实现可合并堆(算法导论第三版思考题10-2) a 链表已排序 创建一个空堆: Θ(1) 插入:Θ(n),插入后依然保持排序 最小值:Θ(1),第一位便是 取最小值:Θ(1) 合并:Θ(n),可 ...
- 算法导论第2章(3) 二分查找 binary search
二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...
- 重读《算法导论》第一章
重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...
- 算法导论 第7章 快速排序 —— 练习还没做,记得补锅
今天来学习第七章--快速排序. 作为占据一章的排序,快速排序可谓是重量级选手. 实际排序中最好的选择,因为 (1) 其平均性能非常好,期望实践复杂度为 O(n lgn); (2) 可进行原址排序; ( ...
- 算法导论第十三章 红黑树
写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这 ...
- 《算法导论3rd第一章》算法在计算中的作用
前言 什么是算法?为什么算法值得研究?算法的作用是什么 算法 算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合做为输出.即就是把输入转换成输出的计算步骤的一个序列. ...
最新文章
- Excel:如何使用函数实现多表多条件汇总求和
- java实现相同分数排名_java做成绩排名表,如何实现同分同名次
- 《网络管理员考试案例导学》复习重点
- python字符串二(find();index();count();rfind();rindex();replace();替换;.split();分割;join();合并)
- JS中字串转参数用的false/true
- CSDN如何上传文件
- 记录一下,关于Instagram
- JVM笔记(B站宋红康课件)
- 计算机房设计规范2008,电子计算机房设计规范.doc
- NKOI 3539 移棋子游戏[6月月赛题A]
- 将无线网卡变身为 wifi 热点的 完整批处理文件 或者 让i电脑变成wifi热点
- CSDN 中 MarkDown编辑器自动生成目录
- c语言文件断电保护,.如果计算机突然断电,存放在()的信息会丢失。
- 井冈山大学专属中秋月饼
- 出走的门徒之三——小红书郄小虎:穿越人心的迷雾
- 帮你解读身份证号码的秘密
- 全国计算机等级考试 贴吧,【全国计算机等级考试】
- Python jieba库简介和使用
- SVN:Cannot negotiate authentication mechanism问题
- [FAQ21282]分区表中分区配置的大小与MTxxxx_Android_scatter.txt中不一致