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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构并查集教学资料电教案课件

通常我们用lowbit(x)表示x对应的2k lowbit(x) = x(-x) C[i] = a[i-lowbit(i)+1] + …+ a[i] C1=A1 C2=A1+A2 C3=A3 C4=A1+A2+A3+A4 C5=A5 C6=A5+A6 C7=A7 C8=A1+A2+A3+A4+A5+A6+A7+A8 ………… C16=A1+A2+A3+A4+A5+A6+A7+A8+A9+A10+A11+A12+A13+A14+A15+A16 设sum(k) = a[1]+a[2]+…+a[k]则a[i] + a[i+1] + … + a[j] = sum(j)-sum(i-1) 根据C的构成规律,可以发现sum(k)可以表示为: sum(k) = C[n1]+C[n2] + …+ C[nm] 其中nm= k ni-1 = ni-lowbit(ni) ni-lowbit(ni) 是什么样子?就是ni的二进制去掉最右边的1 k 的二进制里最多有几个1?log2k (向上取整)个 sum(k)最多log2k(向上取整)项,所以本次求和的复杂度就是log2k 如果a[i]更新了,那么以下的几项都需要更新: C[n1], C[n2], …C[nm] 其中,n1 = i ,ni+1 = ni + lowbit(ni) 同理,总的来说更新一个元素的时间,也是logN的 a[i]更新- C[i]必须更新 C[i]更新-C[i+lowbit(i)]必须更新: C[i+lowbit(i)] = a[ (i+lowbit(i)) –lowbit(i+lowbit(i)) +1] + …. + a[i+lowbit(i)] 证明i+lowbit(i) –lowbit(i+lowbit(i)) +1 = i,就证明C[i+lowbit(i)] 要更新 lowbit(i) 显然比lowbit(i+lowbit(i)) 要小 所以i+lowbit(i) –lowbit(i+lowbit(i)) +1 = i 下面要证明,若C[i]更新,则对任何k, (ik i+lowbit(i)), C[k]都不需要更新(即C[k]不包含a[i]) C[k] = a[k-lowbit(k)+1] + … + a[k] 只要证明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大 树状数组适合单个元素经常修改而且还反复要求部分的区间的和的情况。 上述问题虽然也可以用线段树解决,但是用树状数组来做,编程效率和程序运行效率都更高(时间复杂度相同,但是树状数组常数小) 敌兵布阵用树状数组实现更好 * 并查集(union-find set)是一种用于分离集合操作的抽象数据类型。它所处理的是“集合”之间的关系 设想需要对不相交集合(disjoin set)进行两种操作:(1)检查某元素属于哪个集合 (2) 合并两个集合。 执行N次合并和M(M=N)次查询,并查集可以实现O(1)的平摊复杂度! 1) 用一棵树来代表一个集合,集合里的每个元素都是树的一个节点。 2) 用树根来唯一标示这棵树(这个集合) 3) 那个元素作为根无所谓,只要属于同一集合的根相同 4) 所有的这些集合构成了一个森林 找到根节点之后,将路径上的节点都直接链接到根节点,这样在下次查找时,便可以减少查找次数,这一优化称为路径压缩。 记录更多的信息 比如:两个结点的相对关系 信息的表示:表示并查集的森林的边带上权(偏移量) ??? 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是1XY,表示X和Y是同类。第二种说法是2XY,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 1)当前的话与前面的某些真的话冲突,就是假话; 2)当前的话中X或Y比N大,就是假话; 3)当前的话表示X吃X,就是假话。 你的任务是根据给定的N(1=N=50,000)和K句话(0=K=100,000)输出假话的总数。 合并同类?查找两种动物是否属于同一个集合(表示它们是同类)? 那X吃Y怎么表示? 3类动物

文档评论(0)

135****6041 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档