数据结构并查集教学资料ppt电子教案课件.ppt

上传人:文库蛋蛋多 文档编号:2905155 上传时间:2023-03-02 格式:PPT 页数:40 大小:1.42MB
返回 下载 相关 举报
数据结构并查集教学资料ppt电子教案课件.ppt_第1页
第1页 / 共40页
数据结构并查集教学资料ppt电子教案课件.ppt_第2页
第2页 / 共40页
数据结构并查集教学资料ppt电子教案课件.ppt_第3页
第3页 / 共40页
数据结构并查集教学资料ppt电子教案课件.ppt_第4页
第4页 / 共40页
数据结构并查集教学资料ppt电子教案课件.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《数据结构并查集教学资料ppt电子教案课件.ppt》由会员分享,可在线阅读,更多相关《数据结构并查集教学资料ppt电子教案课件.ppt(40页珍藏版)》请在三一办公上搜索。

1、并查集,回顾,并查集(union-find set)是一种用于分离集合操作的抽象数据类型。它所处理的是“集合”之间的关系设想需要对不相交集合(disjoin set)进行两种操作:(1)检查某元素属于哪个集合(2)合并两个集合。执行N次合并和M(M=N)次查询,并查集可以实现O(1)的平摊复杂度!,并查集的实现,1)用一棵树来代表一个集合,集合里的每个元素都是树的一个节点。2)用树根来唯一标示这棵树(这个集合)3)那个元素作为根无所谓,只要属于同一集合的根相同4)所有的这些集合构成了一个森林,路径压缩,找到根节点之后,将路径上的节点都直接链接到根节点,这样在下次查找时,便可以减少查找次数,这一

2、优化称为路径压缩。,并查集的拓展,记录更多的信息比如:两个结点的相对关系信息的表示:表示并查集的森林的边带上权(偏移量),食物链,动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以1N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是1XY,表示X和Y是同类。第二种说法是2XY,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。,1)当前的话与前

3、面的某些真的话冲突,就是假话;2)当前的话中X或Y比N大,就是假话;3)当前的话表示X吃X,就是假话。你的任务是根据给定的N(1=N=50,000)和K句话(0=K=100,000)输出假话的总数。,合并同类?查找两种动物是否属于同一个集合(表示它们是同类)?那X吃Y怎么表示?3类动物3个集合?怎么确定XY是哪一类?,我们用偏移量offset(a,b)表示a和b的关系,offset(a,b)=0表示a和b是同类,offset(a,b)=1表示a吃b,offset(a,b)=2表示b吃a。那么对任意种类东西c,显然offset(a,b)=(offset(a,c)+offset(c,b)%3这个关

4、系式表明,a和b的关系可以通过a和根的关系以及b和根的关系推断出来。,由上述结论得:同一集合内任意元素关系可推出(即关系已知)将确定关系的两个动物,合并为一个集合若两个动物不在同一个集合,那么关系未知,偏移量的更新,路径压缩!offset(a)表示a与其父节点的关系设原faa=p,路径压缩使faa=rootoffset(a,root)=(offset(a,p)+offset(p,root)%3即offset(a)=(offset(a)+offset(p)%3,线段树,部分引用pku_郭炜的ppt,线段树,树:是一棵树,而且是一棵二叉树。线段:树上的每个节点对应于一个区间。同一层的节点所代表的区

5、间,相互不会重叠。同一层节点所代表的区间,加起来是个连续的区间。叶子节点的区间是单位长度,不能再分了。,线段树是一棵二叉树,树中的每一个结点表示了一个区间a,b。a,b通常是整数。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点a,b,其左儿子表示的区间为a,(a+b)/2,右儿子表示的区间为(a+b)/2+1,b(除法去尾取整)。,区间1,9的线段树,线段树的平分构造,实际上是用了二分的方法。若根节点对应的区间是a,b,那么它的深度为log2(b-a+1)+1(向上取整)叶子节点的数目和根节点表示区间的长度相同.,区间分解,分解的规则就是:如果有某个节点代表的区间,完全属于待

6、分解区间,则该节点为“终止”节点,不再继续往下分解所有“终止”节点所代表的区间都不重叠,且加在一起就恰好等于整个待分解区间。,区间1,9的线段树上,区间2,8的分解,区间分解的时候,每层最多2个“终止节点”,所以终止节点总数也是log(n)量级的,X代表终止节点。上述情况不可能发生,线段树的特征,1、线段树的深度不超过log2(n)+1(向上取整,n是根节点对应区间的长度)2、线段树上,任意一个区间被分解后得到的“终止节点”数目都是log(n)量级。线段树上更新叶子节点和进行区间分解时间复杂度都是O(log(n)的这些结论为线段树能在O(log(n)的时间内完成一个区间的建树,插入数据,更新数

7、据、查找、统计等工作,提供了理论依据,敌兵布阵,一个正整数N(N=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1=ai=50)。接下来每行有一条命令,命令有4种形式:(1)Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j,i和j为正整数,i=j,表示询问第i到第j个营地的总人数;每组数据最多有40000条命令,建立,点更新,区间更新,查询,线段树适用于多次查询用线段树解题,关键是要想清楚每个节点要存哪

8、些信息(当然区间起终点,以及左右子节点指针是必须的),以及这些信息如何高效更新,维护,查询。不要一更新就更新到叶子节点,那样更新效率最坏就可能变成O(n)的了。,树状数组,对于序列a,我们设一个数组CCi=ai 2k+1+aik为i在二进制下末尾0的个数2k就是i 保留最右边的1,其余位全变0i从1开始算!C即为a的树状数组对于i,如何求2k?,通常我们用lowbit(x)表示x对应的2k lowbit(x)=x&(-x),Ci=ai-lowbit(i)+1+aiC1=A1C2=A1+A2C3=A3C4=A1+A2+A3+A4C5=A5C6=A5+A6C7=A7C8=A1+A2+A3+A4+A

9、5+A6+A7+A8C16=A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15+A16,图示,设sum(k)=a1+a2+ak则ai+ai+1+aj=sum(j)-sum(i-1)根据C的构成规律,可以发现sum(k)可以表示为:sum(k)=Cn1+Cn2+Cnm其中nm=k ni-1=ni-lowbit(ni),ni-lowbit(ni)是什么样子?就是ni的二进制去掉最右边的1k 的二进制里最多有几个1?log2k(向上取整)个sum(k)最多log2k(向上取整)项,所以本次求和的复杂度就是log2k,如果ai更新了,那么以下的几项都需

10、要更新:Cn1,Cn2,Cnm其中,n1=i,ni+1=ni+lowbit(ni)同理,总的来说更新一个元素的时间,也是logN的,ai更新-Ci必须更新Ci更新-Ci+lowbit(i)必须更新:Ci+lowbit(i)=a(i+lowbit(i)lowbit(i+lowbit(i)+1+.+ai+lowbit(i)证明i+lowbit(i)lowbit(i+lowbit(i)+1=i,就证明Ci+lowbit(i)要更新lowbit(i)显然比lowbit(i+lowbit(i)要小所以i+lowbit(i)lowbit(i+lowbit(i)+1=i,下面要证明,若Ci更新,则对任何k,

11、(ik i+lowbit(i),Ck都不需要更新(即Ck不包含ai)Ck=ak-lowbit(k)+1+ak只要证明k-lowbit(k)+1比i大即可因ik i+lowbit(i),假设i的最右边的1是从右到左从0开始数的第n位,那么i+lowbit(i)就是将i的低n位全变成1后,再加1。那么k一定是从第n位到最高位都和i相同,但是低n位比i大(即k低n位中有1,因i低n位全是0)k-lowbit(k)+1就是k去掉最右边的1,然后再加1,那当然还是比i大,树状数组适合单个元素经常修改而且还反复要求部分的区间的和的情况。上述问题虽然也可以用线段树解决,但是用树状数组来做,编程效率和程序运行效率都更高(时间复杂度相同,但是树状数组常数小),模版,敌兵布阵用树状数组实现更好,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号