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

《DynamicConnectivity》研究报告.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  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文档。上传文档
查看更多
《DynamicConnectivity》研究报告

《Dynamic Connectivity》研究报告 安徽 周源 摘要及问题的提出 2005年信息学冬令营的考试中有一题dface,是一道主要关于图的连通性维护的试题,然而由于在那一题中的图由一些特殊性,因此可以提出一些比较简单的non-trivial的算法。不过是否对于任意图,都有一个高效的算法或数据结构可以动态维护其连通性呢?我对此非常感兴趣,查阅了不少资料,终于找到了这个新近才被提出来的算法: 要求设计一种数据结构,可以维护一个N个点的无向图,支持插入、删除、以及查询某两个点是否在一个连通分量中这3种操作。 每次更新维护需要花费O(log2N)的时间,而查询操作则需要花费O(logN)的时间。 算法描述 基本数据结构:欧拉回路树(Euler Tour Tree) 欧拉回路树可以维护一个N个点的森林,支持插入(保证插入边后不会出现环)、删除、以及查询某些点是否在同一颗树中。 这个数据结构的各种操作,可以在O(logN)的时间内完成(加入一些优化后,询问时间复杂度可以降为O(),不过这并没有太多的实际意义)。 一个ET-Tree,一般可以用标准平衡二叉树(standard balanced binary tree)来实现:对于森林中的每一棵树,用一个二叉树来存储这棵树的欧拉回路(将每一条无向边重复成两条有向边,就一定存在一个欧拉回路)。 将森林中两棵树合并,就是将这两棵树对应的欧拉回路——即两个环相接。考虑到是环而不是链,最多是用两次平衡树的连接操作(concatenation)就可以实现了。 同样,删去树中的某条边,就是将一棵树分裂为两棵,即分裂对应的欧拉回路环。使用最多两次平衡树的分裂操作(split)即可。 询问两个点是否在同一连通分量中,等价于询问和这两个点连接的边(任取一条)是否在同一颗平衡树中,判断它们的平衡树根是否相同即可。 综上所述,每一条必要的操作,都可以在O(logN)时间内完成。 交换边(Replacement Edge) 当我们期望设计功能更强大的数据结构来维护任意图而不是树的时候,情况就会变得复杂起来。我们可以设想这样一种方法:利用欧拉回路树以及其它的一些技巧维护一个“当前图的生成树林”。 在这个方法中,加入一条边是很容易的:只需要判断待加入边是否连接这两颗不同的树,如果不是则可以什么也不做,否则将这两棵树合并起来即可。使用欧拉回路树,可以在O(logN)的时间内做到。 在维护森林时,删去一条边,则边两端的点一定不会连通;而在维护任意图的时候,情况复杂多了:如果需要删除的边,不在我们正在维护的生成树林中,则仅仅从集合中删去这条边就可以了;而如果这正是生成树林中的一条边,若将它从树中删去,则这棵树会分裂成为两部分。然而先前插入的某条不在树上的边却又可能将这两部分连接起来。因此,算法的中间就在于,如何寻找这样一条交换边。 自然的想法是检测所有的非树边(下文中的非树边,non-tree edges即表示先前插入的,却不是生成树林上的边),然而这样的耗费太大了。 算法轮廓 我们的算法将正在维护的图中边的集合分为O(logN)层(level):第0层,第1层,第2层,…,第logN层。每一条边都属于且仅属于某一层。 设Ei表示第i层中,边的集合。那么对于每一层,我们维护一个生成树林Fi,Fi是第i以及更高层的一个生成树林:。且Fi Fi-1(i0)。因此F0就是整个图的生成树林。 所以可以说,Fi就是F0中第i层边的集合。同样可以看出,我们的生成树林中第i层的边将第(i+1)或以上层的边形成的连通分量连接起来。 这样一来,可以看出,如果删除了某一条第i层的树上的边,则其对应的交换边所在的层数一定不会高于i。 我们的动态算法,即维护这样一个图G的生成树林F。F中的边将被称为树上边(tree-edges)。同样,如上文所述,将每一条边e与某一层l(e)≤L=log2N关联,即e属于第l(e)层。且对于每一层i,如上文定义Fi:F = F0 F1 F2 … FL。并需要保证下列性质成立: 对于每一层而言,Fi是该层以及该层以上所有边的一颗尽量大的生成树,即如果存在边(u, v)是非树边,那么u, v一定在Fl(u, v)中被连接。 Fi中最大的连通分量的节点个数,不得超过[],即最大的非空层为logN。 在算法的初始时刻,所有的边都位于第0层,这样满足上述的所有条件。那么我们可以较为细致的描述算法如何实现各种操作: Insert(e):将新加入的边放入第0层:E0,如果这条边连接了F0的两个不同的连通分量,则将这条边加入F0。 Delete(e):如果e是一条非树边,则仅仅在El(e)中将其删去即可。否则若e是一条树上边,那么将其删去,并寻找一条交换边来重新连接被分开的两部分。由于交换边所在的层数一定不大于l(e)

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档