网站大量收购独家精品文档,联系QQ:2885784924

1-简单不相交集的合并算法.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简单不相交集的合并算法 本节的假定前提: 1、为算法书写方便起见,设任一集合都是{1,2,…n}的子集; 2、任意两个被合并的集合都是不相交的; 3、集合上的运算只有Union和Find。 Union(I,J,K):把名为I与J的集合进行合并,合并后的集合名为K。 ∵初始总共有n个单元素集,故Union最多可执行n-1次。 Find(a):给出a所在的集合名(算法中大多用数字表示集合名)。 通常Find指令的执行也有O(n)次,故此类问题通常都是 讨论执行O(n)条Union和Find指令所需要的时间。 可以用来表示集合的数据结构很多, 用什么样的算法和结构才能使得完成上述任务的时间最少? Union(I,J,K) 算法中的数组说明 为加快处理速度,每个集合给予一个内部名和一个外部名。 内部名与外部名1-1对应。例如: 外部名 1 2 3 集合 {1,3,5,7} {2,4,8} {6} 内部名 2 3 1 External-Name[S]:内部名为S(数字)的集合所对应的外部名。 Internal-Name[L]:外部名为L(数字)的集合所对应的内部名。 R[i]:给出元素i所属集合的内部名。(Find指令O(1)时间完成) Next[i]:给出与元素i同在一个集合中的下一个元素,内容为0时, 表示无下一元素(即元素i是该集合的最后一个元素)。 List[S]:给出内部名为S的集合中的第一个元素。 Size[S]:给出内部名为S的集合中的元素个数。 A←Internal-Name[I]; /*将集合外部名I,J转为内部名A和B*/ B←Internal-Name[J]; wlg assume Size[A] ? Size[B] /* A为小集合,B为大集合*/ otherwise interchange roles of A and B in {ELEMENT←List[A]; /*找出集合A的第一个元素*/ while ELEMENT ? 0 do /*不断把A中元素的所在集合名改为B,直到全部改完为止*/ {R[ELEMENT]←B; /*改名*/ LAST←ELEMENT; /*记下当前元素*/ ELEMENT←Next[ELEMENT]; /*当前元素更新*/ } /*循环结束时,LAST中记录了原集合A中的最后一个元素*/ Next[LAST]←List[B]; /*置该元素的下一个元素为原B中的第一个元素,*/ /*从而实现A和B的合并*/ List[B]←List[A]; /*置合并后的首元素为原A中首元素*/ Size[B]←Size[A] + Size[B]; /*置集合大小为2集合的规模之和*/ Internal-Name[K]←B; /*建立新集合的内部名与外部名的对应关系*/ External-Name[B]←K } Union算法除6-9行以外,其余均为常数时间。 在最坏情况下,即当A和B的规模均为n/2时, 6-9行要执行n/2次, 以完成其中一个集合的元素所属集改名。 即最坏情况下执行1次Union需要的时间为?(n)。 在最坏情况下,执行n-1次Union需要的时间是否为?(n2)? 对6-9行进行总体分析,即考虑执行n-1次Union需要的总时间。 ∵每次总是小集合中的元素所属集合改名, ∴每执行一次Union被改名元素所在集合的规模至少扩大一倍。 考虑任意一个元素i能够被改名的次数: 初始时i所在集合只有一个元素, 改名一次以后,i所在集合的元素至少有2个, 再改名一次以后,i所在集合的元素至少有4个,… 故当i改名k次后,i所在集合的元素至少有2k个, 而2k ? n是必须满足的,故有k ? Log2n, 即任一元素i最多被改名Log2n次(i=1,2,…,n)。 故n个元素的改名总次数不会超过nLog2n, 即在n-1次Union中,6-9行执行改名的次数不超过?(n logn)。 在最坏情况下,改名总次数是可能达到?(n logn)的: E.g. 设n=2k, 先把单元素集两两合并为双元素集; 再把双元素集两两合并为4元素集;…… 最后把两个n/2元素集合并为一个总的n元素集。 在上述每一轮,需要改名的元素恰好为n/2个, 共执行k=Log2n轮,故改名的总次数为1/2*nLog2n。 说明:若没有内部名, 则每次合并时两个集合中的所有元素均要改名(改为K), 这样,在n-1次Union中改名的次数就会大大超过上述方式。 另外,如果合并时不进行外部命名,即用Union(I,J)的形式, 则不需要另外再建立内部名, 合并时仍然是小集合中

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档