acm icpc算法基础下第四周并.pptxVIP

  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文档。上传文档
查看更多
并查集(Disjoint Set)吕洪涛导引问题 在某个城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:我朋友的朋友是我的朋友;我敌人的敌人是我的朋友; 已知关于 n个人的m条信息(即某2个人是朋友或者敌人),假设所有是朋友的人一定属于同一个团伙,请计算该城市最多有多少团伙?如何实现?什么是并查集?英文:Disjoint Set,即“不相交集合”将编号分别为1…N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。常见两种操作:合并两个集合查找某元素属于哪个集合所以,也称为“并查集”什么是并查集? 简单地说,并查集是就维护“哪些人属于同一集合”这一信息的数据结构。实现方法(1)用编号最小的元素标记所在集合;定义一个数组 set[1..n] ,其中set[i] 表示元素i 所在的集合;i123456789101214261622Set(i)不相交集合: {1,3,7}, {2,5,9,10}, {4}, {6,8}方法(1)——效率分析合并操作Merge1(a,b){ i = min(a,b); j = max(a,b); for (k=1; k=N; k++) { if (set[k] == j) set[k] = i; }}查询操作find1(x){ return set[x];}O(1)O(N)有待改进?对于“合并操作”,必须搜索全部元素!采用树结构,对每个点只维护“父节点是谁”的信息。2314i8965107par(i)实现方法(2)每个集合用一棵“有根树”表示定义数组 par[1..n]par[ i ] = i , 则i表示本集合,且是集合对应树的根par[ i ] = j, j!=i, 则 j 是 i 的父节点. 123456789101232134334方法(2)——效率分析merge2(a, b){ if (ab) par [b] = a; else par [a] = b;}find2(x){ r = x; while (par[r] != r) r = par[r]; return r;}O(1)最坏情况O(N)一般情况是O(logN)如何避免最坏情况?避免最坏情况方法:将深度小的树合并到深度大的树实现:假设两棵树的深度分别为h1和h2, 则合并后的树的高度h是:max(h1,h2), if h1!=h2.h1+1, if h1==h2.效果:任意顺序的合并操作以后,包含k个节点的树的最大高度不超过?优化后算法及效率merge3(a,b){ if (height(a) == height(b)) { height(a) = height(a) + 1; par[b] = a; } else if (height(a) height(b)) par [a] = b; else par [b] = a; }find2(x){ r = x; while (par[r] != r) r = par [r]; return r;}最坏情况O(log N)O(1)进一步优化——路径压缩思想:每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快步骤:第一步,找到根结点第二步,修改查找路径上的所有节点,将它们都指向根结点带路径压缩的查找算法非递归版本find3(x){ r = x; while (par[r] != r) //循环结束,则找到根节点 r = par [r]; i = x; while (i != r) //本循环修改查找路径中所有节点 { j = par [i]; par [i] = r; i = j; } return r; } 递归版本find3(x){if(par[x]==x) return x;return par[x]=find3(par[x]); }6649410920111108111128211612201621路径压缩示意图经过路径压缩后,,在一个包含 n 个元素的并查集中,进行 m 次查询或合并操作,最坏情况下所需的时间为 O(mα(n)) ,这里的 α 是 Ackerman 函数的某个反函数,在极大的范围内(比可观察到的宇宙中估计的原子数量 还大很多)都可以认为是不大于 4 的。也就是说,查询和合并操作的复杂度都可以看成是常数级的。?示例—The Suspects(POJ-1611)题目描述:在Not-Spreading-Your-Sickness大学(?NSYSU),?有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序如下:一旦一组中有一个可能的患者,?组内的所有成员就都是可能的患者。然而,他们发现当一个学生被

文档评论(0)

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

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

1亿VIP精品文档

相关文档