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

国家集训队2005论文集 黄刚.ppt

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

数据结构的联合 长沙市雅礼中学 黄刚 问题1 顽皮的猴子 问题描述: 有N(1=N=30000)只顽皮的猴子挂在树上。每只猴子都有两只手,编号为1的猴子的尾巴挂在树枝上,其他的猴子的尾巴都被别的猴子的某只手抓着。每一时刻,都有且只有一只猴子的某只手松开,从而可能会有一些猴子掉落至地面。输入一开始猴子们的情况和每一时刻松开手的情况,输出每只猴子落地的时间。 问题1 顽皮的猴子 分析: 我们把猴子抽象成点,猴子的手抽象成边,题目就转化成一个连通图不断去边,求每个点离开编号为1的点所在的连通分量的时间。 问题1 顽皮的猴子 分析: 把删边的顺序倒过来,问题转化为从一个无边的图不断添边,求每个点进入编号为1的点所在的连通分量的时间。我们自然的想到用并查集维护。 问题1 顽皮的猴子 一个问题: 上面的算法中,当并查集中某个集合加入编号为1的点所在的集合时,需要把这个集合中的所有元素的时间记录一下。但是并查集并不支持“枚举集合元素”的功能,怎么办? 问题1 顽皮的猴子 一个问题: 给每个并查集分配一个链表,记录这个集合中所有的元素。这样,能够方便的枚举集合中的元素。而在并查集合并的时候,链表也能够很快的合并。问题解决。 数据结构的并联 问题1中,在并查集不支持枚举元素操作的时候,引入一个新的数据结构链表来辅助,是数据结构的一种联合方式:并联,这种联合成功的解决了问题。 定义: 我们将用多个数据结构共同对同一数据集合统计的方法叫做数据结构的并联。 数据结构的并联 为了方便起见,先把一个数据结构支持的操作分为两类: 询问操作:顾名思义,就是获取该数据结构记录的某些信息的操作,而并没有改动数据结构里的元素及其相互关系。 维护操作:跟询问操作相反,改动数据结构中元素或元素的相互关系的操作,称为维护操作。 数据结构的并联 并联的优点: 并联而成的新数据结构,支持组成它的数据结构的所有操作。 并联的缺点: 维护操作的时间复杂度存在瓶颈,是所有组成它的数据结构的维护操作复杂度的和。 问题2 DynamicRankings 问题描述: 给定一个长度为N(1=N=50000)的正整数序列A(1=A[i]=MaxLongint),模拟以下操作: 1、改值操作C(i,j):将A[i]的值改为j 2、询问操作Q(i,j,k):程序输出A[i],A[i+1],…,A[j]这j-i+1个数中第k大的数。 问题2 DynamicRankings 例如: N=6 A=[3,1,6,5,2,4] 问题2 DynamicRankings 分析: 单纯的算法必定会超时,我们需要设计一个对整数序列进行统计的高效数据结构,并且支持改值和查找指定区间中第k大的数。 问题过于复杂,先考虑简单一点的情况。 问题2 DynamicRankings 简化情况1: 每次询问Q(i,j),要求程序输出A[i],A[i]+1,…,A[j]这j-i+1个数中最大的数。 解决方式: 只需用一颗线段树维护A序列,改值,询问操作都是O(LogN)的时间复杂度,完全满足题意。 问题2 DynamicRankings 简化情况2: 每次询问Q(k),要求程序输出A[1],A[2],…,A[N]这N个数中,第k大的数。 解决方式: 用一颗平衡二叉树维护A序列即可,同样的,改值,询问操作也只需要O(LogN)的时间。 问题2 DynamicRankings 问题的嵌套: 现在,两个很简单的问题“嵌套”在了一起,成了一个棘手的问题,使得原先的方法都失效了。 既然问题能够“嵌套”,那我们原先解决问题的数据结构是不是也能够“嵌套”呢? 问题2 DynamicRankings 数据结构的嵌套: 考虑一颗这样的线段树:它维护整个A序列,而它的每个节点V,设表示的区间为[i,j],拥有一颗平衡二叉树,维护A[i],A[i+1],…,A[j]。 为下文方便起见,暂时称之为“嵌套树”。 问题2 DynamicRankings N=4的一颗嵌套树: 容易证明空间复杂度 是O(NLogN)。 问题2 DynamicRankings 改值操作C(i,j): 在线段树中将包含A[i]的节点找出来,再在相应的平衡树中更新。 例如N=4, A=[1,4,2,3] 改值C(3,1) 时间复杂度O(Log2N)。 问题2 DynamicRankings 询问操作Q(i,j,k): 如果按照线段树求区间最大值的方法:将[i,j]分解为若干个嵌套树中的区间并,分别求出每个子区间中第k大的数,再合并,这样是行不通的! 我们无法根据几个区间的第k大的数求出这些区间并的第k大的数。 问题2 DynamicRankings 另辟蹊径: 将问题逆转过来,设询问Q’(i,

文档评论(0)

ldj215322 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档