Project2(UnionFind算法)作业讲评.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Project2(UnionFind算法)作业讲评.ppt

Project 2 (Union/Find算法) 作业讲评 吕洁 Project 2 题目 使用Union/Find算法解决下面的问题: 给出一个点集,点用(x,y)坐标形式表示,把点分配到簇(cluster)中去。两个距离不超过d的点定义在一个簇中。 簇是等价关系,换句话说,点A、B和C定义为在一个簇中,如果A与B的距离小于d,且A与C距离小于d,即是B与C距离大于d也是成立的。 为了解决这个问题,计算每一对点之间的距离,当出现两个点在特定距离内时,使用等价处理算法来归并簇。 这个算法的渐进复杂度如何?处理的瓶颈在何处? 作业之最 最滑稽之语: “由于做此题时电脑上没有VC++,所以代码只好写在了Word上,因为无法尝试运行,所以也省略了教材上已经有的很多代码,算法主要参考了习题集,望助教见谅!” 最滑稽之举: FTP上提交了4份作业: “张三补充!.rar” “张三重发补充!.rar” “张三proj2.rar” “张三修正.rar” “张三重发修正.rar” 应该看哪份? “开始以为不要实现的,只写了代码。结果调试果然发现不少错。……” 解题思路 树的存储方法: 链式存储——父指针表示法 多数人采用 数组存储 极少数同学采用 林廷懋、王潇…… 数组存储解题示例(1) struct Point //存储点的信息 { double x,y; }; double d; int n; int* parent; //存储该结点的父亲的下标 //如果为负数,表示该结点为根,绝对值为树的结点数 Point* point; 数组存储解题示例(2) int find(int a) //查找树根 { int b,c,root; b=a; while (parent[b]=0) //查找树根 b=parent[b]; root=b; while (parent[b]=0) //路径压缩 { c=parent[b]; parent[b]=root; b=c; } return root; } void merge(int a,int b) //合并 { int c=find(a),d=find(b),t; if (parent[c]parent[d]) //处理,使得c的结点数比较多 //注意,结点数用负数表示 { t=c;c=d;d=t; } parent[c]+=parent[d]; //维护结点数 parent[d]=c; } 数组存储解题示例(3) int* clusternumber=new int[n]; //这个数组用于标记簇的编号以便输出 k=0; for (i=0;in;++i) if (parent[i]0) clusternumber[i]=++k; else clusternumber[i]=0; coutThere is k cluster(s).endl; for (i=0;in;++i) if (parent[i]0) { coutcluster clusternumber[i] has -parent[i] point(s).endl; for (j=0;jn;++j) if (find(j)==i) coutpoint[j].x point[j].yendl; } 对Union/Find的讨论(1) Union Union by Size: 若树i结点数少于树j结点数,则将j作为i的父结点;否则,将i作为j的父结点。 Union-by-Height: 若树i的高度小于树j的高度,则将j作为i的父结点;否则将i作为j的父结点。 Union-by-Rank: 不必在Path Compression之后去重新计算树的高度 对Union/Find的讨论(2) Find中的路径压缩 Path Compaction 改变从结点x(要查找的结点)到根的路径上所有结点的指针,使这些指针直接指向根结点 Path Splitting 改变从x到根结点路径上每个结点(除了根和其子结点)的parent指针,使其指向各自的祖父结点 Path Halving 改变从x到根结点路径上每隔一个结点(除了根和其子结点)的parent指针,使其指向各自的祖父结点。 解题点评(1) 是否“等价关系”? 题目:“给出一个点集,点用(x,y)坐标形式表示,把点分配到簇(cluster)中去。两个距离不超过d的点定义在一个簇中。簇是等价关系,换句话说,点A、B和C定义为在一个簇中,如果A与B的距离小于d,且A与C距离小于d,即是B与C距离大于d也是成立的。“ “如果判断条件本身

文档评论(0)

381697660 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档