- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
不相交集合课程设计报告源码
《数据结构》课程设计
PAGE
PAGE 16
中南民族大学计算机科学学院 专业 计算机科学与技术 学号: 姓名 :
不相交集合
一 目的
通过课程设计,培养综合运用数据结构及有关编程语言的基本知识去解决一些实际问题的实际本领,并且加深对本门课程知识的理解。
在做课程设计的过程中,可以培养以下的能力:查阅资料:了解了课程设计的题目之及其要求,就需要通过自己去搜集资料来明白自己应该从何入手,所以需要从大量的资料中来寻找灵感;方案的选择:树立既考虑技术上的先进性和可能性,又考虑代码的实用性,通过合理的选择,写出来一种符合要求并且可以扩展功能的算法;实际应用能力:面对现实中的一些问题,通过对其进行分析,然后转化成计算机可以识别并且进行处理的数据,建立与计算机相一致的思维。
课程设计就是对自己学习的巩固和自己能力的提高,是自己的编程能力得到进一步的锻炼,为以后的毕业设计及以后的工作奠定了坚实的基础。
二 需求分析
1、现实问题
题目: 亲戚(Relations)
或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手就是计算机。
为了将问题简化,你将得到一些亲戚关系的信息,如同Marry和Tom是亲戚,Tom和B en是亲戚,等等。从这些信息中,你可以推出Marry和Ben是亲戚。请写一个程序,对于我们的关心的亲戚关系的提问,以最快的速度给出答案。
像这类的题目有很多,还有例如食物链、军舰的指挥官、路的连接等,对于这一类的问题,大都可以归结为集合的一些运算,判断两个元素是否属于一个集合,及合并两个不相交的集合。
2、不相交集合算法
不相交集合又称并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多。一般采取树形结???来存储并查集,在合并操作时可以利用树的节点树或者利用一个rank数组来存储集合的深度下界--启发式函数,在查找操作时进行路径压缩使后续的查找操作加速。这样优化实现的并查集,空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)),这里Alpha是Ackerman函数的某个反函数,在很大的范围内这个函数的值可以看成是不大于4的,所以并查集的操作可以看作是线性的。
它支持以下三种操作:
-Union (Root1, Root2) //合并操作;把子集合Root2和子集合Root1合并.要求:Root1和 Root2互不相交,否则不执行操作.
-Find (x) //搜索操作;搜索单元素x所在的集合,并返回该集合的名字--根节点标示.
-make_Set(s) //构造函数。将并查集中s个元素初始化为s个只有一个单元素的子集合.
-对于并查集来说,每个集合用一棵上树树表示。
10
5
9
8
6
2
7
1
4
3
图1 上树集合A{1,2 ,3,5,7 } 图2 上树集合B{4,6,8,9,10}
通过建立如图1和图2的上树,进而实现不相交集合。在本次课程设计中,用数字为代表建立不相交集合,进而实现:
查询两个元素是否属于同一个不相交集合。
合并两个不相交集合。
在程序中,采用的是数组parent[],通过输入涉及的元素个数n以及元素与元素之间关系的个数m,来进行初始化,数组中的元素值就是其根。然后根据m进行关系的输入,最后建立不相交集合。根据根来区别不同的集合,并且进行合并。
三 概要设计
不相交集合程序流程图
开始
函数
对所有元素进行集合的选择
初始化
找根节点
Main()函数
合并两个不相交集合
创建不相交集合
查询两个元素是否在同一个集合
打印相应根的集合元素
Switch()函数
终止
图3 不相交集合程序流程图
四 详细设计
1、main()函数
main()中采用switch()函数,因为其很适合有不
您可能关注的文档
最近下载
- 中船科技(600072)公司2023年财务分析研究报告.doc
- 中国书法简介英语版-chinese-calligraphy(完整版).ppt
- 2025年供电营业规则考试题库.pdf
- 六个寻找剧作家的人_经典戏剧剧本.pdf
- 丙烯酸乙酯安全技术说明书(MSDS).pdf VIP
- 2024年供应链管理师(一级)资格考试复习题库(含答案).docx
- 精品解析:2025届广东省珠海市等三地高三上学期一模物理试题(解析版).docx VIP
- 财政知识普及课件.pptx VIP
- 2025届广东省珠海市等三地高三年级上册一模物理试题(含答案解析).pdf VIP
- 新22J09 附属建筑-标准图集.docx VIP
文档评论(0)