一Link-CutTrees地定义.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Link-CutTrees Link-Cut Trees 是由Sleator 和Tarjan 发明的解决这类动态树问题的一种数据结构[1]. 这个数据结 构可以在均摊O(logn) 的时间内实现上述动态树问题的每个操作. 下面我们先介绍Link-Cut Trees 的概念, 然后介绍它的支持各种操作, 最后对它的复杂度进行分析. 一:Link-CutTrees 的定义 access:访问 [英][ˈækses][美][ˈæksɛs] preferred:优先 [英][prɪfəd][美][prɪfɜ:d] path:路径 [英][pɑ:θ][美][pæθ,pɑθ] auxiliary:辅助 [英][ɔ:gˈzɪliəri][美][ɔɡˈzɪljəri,-ˈzɪləri] 什么是link-cuttrees? link-cut trees是把树分解成多个树链,并且把每条树链都分别储存到一颗splay中。当 我们需要对一颗树上的路径进行操作的时候,利用splay进行分离与合并,把这条树上的路 径储存到同一棵splay中,然后再操作这颗splay就行了。 我英文不太好…下面我们把上述的英文概念换成中文的… Preferred Child:偏好子节点。 Preferred Edge:偏好边。 Preferred Pat :偏好路径。 Auxiliary Tree:辅助树。 Pat Parent:路径父节点。 我们来举个例子说明一下这些概念,上图是一颗以1为根节点的树。1的Preferred Child 为2,2的Preferred Child为4,3、4、5、6没有Preferred Child。 与树链剖分相同的是,link-cut trees也是把一颗树变成了多个线型的链,但是link-cut trees采用了splay tree来储存这些链,方便后面的合并与拆分。 在这颗splay 中,离根节点近的边被储存到splay的左边,离根节点较远的被储存到右边,splay tree是以deep作为关键字排序的。 那么如何储存多条树链呢? 我们称splay 的根节点的父亲为路径父节点,这个节点是这条树链中deep最小的点在原树 的父节点。 右边的这颗树就是link-cuttrees。 如果把右边的link-cuttrees抽象一下变成这样 把一条树链当成一个点,把轻边当成树上的边,我们可以的得到一颗虚树,很明显,这颗虚 树无论宽度还是高度都没有最开始的树大,既使是一颗很大的树也可以压缩成一颗很小的虚 树。当然 如果虚树的结构不再发生改变,在每一个节点都用线型的数据结构进行加速的话 … 就能达到 级的效率(而且相当快),这个是树链剖分的原理,你可以把树链剖分理解成 log 静态 ,不过说起 的原理 我觉得这点不是最主要的 (事实上 link-cuttree link-cuttree … link-cut 总是能在 级的时间内把需要查询的区间构造成主链,这点是最重要的)。 tree log 二:基本操作 一、access (访问) ACCESS 操作是Link-CutTrees 的所有操作的基础. 假设调用了过程ACCESS(v), 那么 从点v 到根结点的路径就成为一条新的Preferred Path. 如果执行了一个点的access操作,那么从根节点到这个点路径上的所有的点就会变为 偏好孩子,所有的边就会变为偏好边,这条路径也就变为一条偏好路径,同时,从根节点到 该节点的这条路径就被储存到了 link-cut trees根节点的splay中。 那我们要怎么做呢?涉及到splay的分离与合并岂不是很麻烦。 假设访问到X节点,我们先把X伸展到它所在的splay的根,然后断开它的右孩子,因为被 访问到的点是没有偏好孩子的。这样X所在的splay就是一条从根的方向延伸过来的一条树 链(当然,它并不完整)然后我们访问X所在的树链的路径父节点,并把它旋转到它所在 splay的根,然后断开它的右孩子,并连接到X所在的树链,然后不断重复这一过程,最终, 我们就会得到一条从根节点延伸到X 的一条树链。 我们模拟一下过程。 比如现在树的模样是这个样子的。 它所对应的link-cuttree是这样的 以access(2)为 先把2旋转到树链2的根,把2的右孩子设为0。 然后处理它的Pat

文档评论(0)

133****0075 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档