树和二叉树第11讲并查集_第1页
树和二叉树第11讲并查集_第2页
树和二叉树第11讲并查集_第3页
树和二叉树第11讲并查集_第4页
树和二叉树第11讲并查集_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

例如:如果已经得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系就十分复杂。在这种情况下,就需要应用并查集。为了将问题简化,将得到一些亲戚关系的信息,如Marry和Tom是亲戚,Tom和Ben是亲戚,等等。从这些信息中,可以推出Marry和Ben是亲戚。7.9.1什么叫并查集7.9并查集1/15输入:第一局部以N,M开始。N为问题涉及的人的个数〔1≤N≤20000〕。这些人的编号为1,2,3,…,N。下面有M行〔1≤M≤1000000〕,每行有两个数ai、bi,表示ai和bi是亲戚。第二局部以Q开始。以下Q行有Q个询问〔1≤Q≤1000000〕,每行为ci和di,表示询问ci和di是否为亲戚。输出:对于每个询问ci、di,输出一行:假设ci和di为亲戚,那么输出“Yes〞,否那么输出“No〞。解决分类问题2/15输入样例:107 //N=10,M=7245713891256233 //Q=33471089类似于离散数学中的等价类问题:给定一个集合U和一个等价关系R,产生具有等价关系的等价类。3/15采用集合的思路求解输入关系别离集合初始状态{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}〔2,4〕{1},{2,4},{3},{5},{6},{7},{8},{9},{10}〔5,7〕{1},{2,4},{3},{5,7},{6},{8},{9},{10}〔1,3〕{1,3},{2,4},{5,7},{6},{8},{9},{10}〔8,9〕{1,3},{2,4},{5,7},{6},{8,9},{10}〔1,2〕{1,2,3,4},{5,7},{6},{8,9},{10}〔5,6〕{1,2,3,4},{5,6,7},{8,9},{10}〔2,3〕{1,2,3,4},{5,6,7},{8,9},{10}4/15{1,2,3,4},{5,6,7},{8,9},{10}34

3、4在同一个集合中Yes求解:710

7、10不在同一个集合中No89

8、9在同一个集合中Yes结果集合:5/15并查集的数据结构记录了一组别离的动态集合S={S1,S2,…,Sk}。每个动态集合Si〔1≤i≤k〕通过一个“代表〞加以标识,该代表即为所代表的集合中的某个元素。对于集合Si,选取其中哪个元素作为代表是任意的。6/157对于给定的编号为1~n的n个元素,x表示其中的一个元素,设并查集为S,并查集的实现需要支持如下运算:MAKE_SET(S,n):初始化并查集S,即S={S1,S2,…,Sn},每个动态集合Si〔1≤i≤n〕仅仅包含一个编号为i的元素,该元素作为集合Si的“代表〞。FIND_SET(S,x):返回并查集S中x元素所在集合的代表。UNION(S,x,y):在并查集S中将x和y两个元素所在的动态集合〔例如Sx和Sy〕合并为一个新的集合Sx∪Sy。

用有根树来表示集合,树中的每个结点包含集合的一个成员,每棵树表示一个集合。多个集合形成一个森林,以每棵树的树根作为集合的代表,并且根结点的父结点指向其自身,树上的其他结点都用一个父指针表示它的附属关系。

7.9.2并查集的算法实现8/15在并查集中,每个别离集合对应的一棵树,称为别离集合树。整个并查集也就是一棵别离集合森林。4个集合{1,2,3,4}、{5,6,7}、{8,9}、{10},分别以4、7、9和10表示对应集合的编号。4321{1,2,3,4}集合756{5,6,7}集合98{8,9}集合10{10}集合9/15在一棵高度较低的树中查找根结点的编号〔即该集合的代表〕所花的时间较少,如何保证构造的别离集合树较低呢?两棵别离集合树A和B,高度分别为hA和hB,那么假设hA>hB,应将B树作为A树的子树;否那么,将A树作为B树的子树。总之,总是高度较小的别离集合树作为子树。得到的新的别离集合树C的高度hC,以B树作A树的子树为例:hC=MAX{hA,hB+1}。10/15typedefstructnode{intdata; //结点对应人的编号intrank; //结点秩,大致为树的高度intparent; //结点对应双亲下标}UFSTree; //并查集树的结点类型并查集采用顺序方法存储,结点的类型声明如下:11/15〔1〕并查集树的初始化voidMAKE_SET(UFSTreet[],intn)//初始化并查集树{inti;for(i=1;i<=n;i++){ t[i].data=i; //数据为该人的编号 t[i].rank=0; //秩初始化为0 t[i].parent=i; //双亲初始化指向自已}}12/15〔2〕查找一个元素所属的集合intFIND_SET(UFSTreet[],intx)//在x所在子树中查找集合编号{if(x!=t[x].parent) //双亲不是自已 return(FIND_SET(t,t[x].parent));//递归在双亲中找x

else return(x); //双亲是自已,返回x}13/1514/15〔3〕两个元素各自所属的集合的合并voidUNION(UFSTreet[],intx,inty)//将x和y所在的子树合并{x=FIND_SET(t,x); //查找x所在别离集合树的编号y=FIND_SET(t,y); //查找y所在别离集合树的编号if(t[x].rank>t[y].rank) //y结点的秩小于x结点的秩 t[y].parent=x; //将y连到x结点上,x作为y的双亲结点else //y结点的秩大于等于x结点的秩{ t[x].parent=y; //将x连到y结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论