算法合集之《RMQ与LCA问题》.ppt

上传人:牧羊曲112 文档编号:6329372 上传时间:2023-10-17 格式:PPT 页数:85 大小:555.50KB
返回 下载 相关 举报
算法合集之《RMQ与LCA问题》.ppt_第1页
第1页 / 共85页
算法合集之《RMQ与LCA问题》.ppt_第2页
第2页 / 共85页
算法合集之《RMQ与LCA问题》.ppt_第3页
第3页 / 共85页
算法合集之《RMQ与LCA问题》.ppt_第4页
第4页 / 共85页
算法合集之《RMQ与LCA问题》.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《算法合集之《RMQ与LCA问题》.ppt》由会员分享,可在线阅读,更多相关《算法合集之《RMQ与LCA问题》.ppt(85页珍藏版)》请在三一办公上搜索。

1、RMQ&LCA问题,湖南省长郡中学 郭华阳,全文总揽,问题的提出问题的解决问题的应用,I.问题的提出,问题的提出,LCA:基于有根树最近公共祖先问题LCA(T,u,v):在有根树T中,询问一个距离根最远的结点x,使得x同时为结点u、v的祖先,问题的提出,RMQ:区间最小值询问问题RMQ(A,i,j):对于线性序列A中,询问区间i,j上的最小值特别的,若线性序列A任意两相邻元素相差为1,那么建立在A上的RMQ称为1RMQ,RMQ&LCA在信息学竞赛中,各种竞赛试题中,如上海2003年省选的登山、2002年POI的商务旅行等,都是这类问题的应用及扩展熟练的掌握及解决RMQ&LCA问题,对于研究和竞

2、赛都是十分重要的,II.问题的解决,RMQ&LCA问题的解决,在研究人员的努力下,RMQ&LCA问题已经获得了比较完善的解决方案,这里我们只列出一些常用算法的适用范围以及他们的时空复杂度:,注:N表示问题规模,Q表示询问次数,RMQ&LCA问题的解决,我们以O(f(N)O(g(N)描述一个在线算法,在O(f(N)的时间内完成预处理,在O(g(N)的时间内完成一次询问以O(f(N)+g(N)Q)描述一个离线算法的时间消耗,注:N表示问题规模,Q表示询问次数,RMQ&LCA问题的解决,这些算法各自具有特点,但是针对问题过于狭窄。下文中我们将会看到,RMQ与LCA问题是可以互相转化的,这就大大扩宽了

3、以下算法的应用面,注:N表示问题规模,Q表示询问次数,RMQ向LCA的转化,考察一个长度为N的序列A,按照如下方法将其递归建立为一棵树:设序列中最小值为Ak,建立优先级为Ak的根节点Tk;将A(1k1)递归建树作为Tk的左子树;将A(k+1N)递归建树作为Tk的右子树;不难发现,这棵树是一棵优先级树,A=(7 5 8 1 10),我们以A序列为例建立树T,A=(7 5 8 1 10),1,将最小元素1作为根节点左右分别建树,A=(7 5 8 1 10),1,1,0,右子树只有一个结点,即10,A=(7 5 8 1 10),1,1,0,左子树有三个结点7、5、8,A=(7 5 8 1 10),1

4、,1,0,5,左子树有三个结点7、5、8将最小元素5作为根节点左右分别建树,A=(7 5 8 1 10),1,1,0,5,7,8,元素5的左右子树都只有一个结点,分别是7、8,A=(7 5 8 1 10),1,1,0,5,7,8,这样我们便得到了树T,RMQ向LCA的转化,对于RMQ(A,i,j):设序列中最小值为Ak,若ki,j,那么答案为k;若k j,那么答案为RMQ(A1.k-1,i,j);若k i,那么答案为RMQ(AK+1.N,i,j);不难发现RMQ(A,i,j)=LCA(T,i,j)!这就证明了RMQ问题可以转化为LCA问题,LCA向RMQ的转化,对有根树T进行DFS,将遍历到的

5、结点按照顺序记下,我们将得到一个长度为2N 1的序列,称之为T的欧拉序列F每个结点都在欧拉序列中出现,我们记录结点u在欧拉序列中第一次出现的位置为pos(u),1,2,3,4,5,6,深度0,深度1,深度2,1,1,2,5,2,6,2,1,3,4,1,欧拉序列F:,深度序列B:0 1 2 1 2 1 0 1 0 1 0,Pos(u):1 2 8 10 3 5,LCA向RMQ的转化,根据DFS的性质,对于两结点u、v,从pos(u)遍历到pos(v)的过程中经过LCA(u,v)有且仅有一次,且深度是深度序列Bpos(u)pos(v)中最小的即LCA(T,u,v)=RMQ(B,pos(u),pos

6、(v),并且问题规模仍然是O(N)的,LCA向RMQ的转化,根据DFS的性质,对于两结点u、v,从pos(u)遍历到pos(v)的过程中经过LCA(u,v)有且仅有一次,且深度是深度序列Bpos(u)pos(v)中最小的这就证明了LCA问题可以转化成RMQ问题LCA与RMQ问题可以互相转化,并且可以在O(N)的时间内完成!,RMQ&LCA算法关系图,一般RMQ问题,1RMQ问题,LCA问题,ST算法,Tarjan算法,1RMQ算法,O(N),O(N),III.问题的应用,问题的应用,RMQ&LCA问题在算法研究及信息学竞赛中都发挥着十分重要的作用,它主要是以一种经典算法及解题思想的形式出现本文

7、主要以讨论一道例题:水管局长(2006年冬令营试题),水管局长(原题),SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径,接着通过信息化的控制中心通知路径上的水管进入准备送水状态,等到路径上每一条水管都准备好了,供水公司就可以开始送水了。嘟嘟一次只能处理一项送水任务,等到当前的送水任务完成了,才能处理下一项。在 处理每项送水任务之前,路径上的水管都要进行一系列的准备操作,如清洗、消毒等等。嘟嘟在控制中心一声令下,这些水管的准备操作同时开始,但由于

8、各条管道 的长度、内径不同,进行准备操作需要的时间可能不同。供水公司总是希望嘟嘟能找到这样一条送水路径,路径上的所有管道全都准备就绪所需要的时间尽量短。嘟 嘟希望你能帮助他完成这样的一个选择路径的系统,以满足供水公司的要求。另外,由于MY市的水管年代久远,一些水管会不时出现故障导致不能使用,你的程序必须考虑到这一点。不妨将MY市的水管网络看作一幅简单无向图(即没有自环或重边):水管是图中的边,水管的连接处为图中的结点。,题目模型简述,定义:一条路径的关键边为其中费用最大的边;一条路径的花费为其关键边的花费;两点之间的最短路为所有连接两点的路径中花费最小的一条;给定带权无向图G及在G上的Q个操作

9、形如:拆除无向边(u,v);询问u、v之间的最短路花费;,水管局长,你需要写一个程序完成给出的操作数据范围:结点数 N 1000;边数 M 100000;操作数 Q 100000;删边操作 D 5000;,水管局长,周戈林同学在2006年冬令营中已经讨论过相关的问题,并提出了解决的类普里姆算法类普里姆算法解决一次询问需要O(N2)的时间注意到询问数可能达到105,类普里姆算法不能解决本题,为什么时间复杂度如此之高呢?,水管局长,分析一下本题时间复杂度瓶颈所在:边数过多;完成询问的复杂度过高;我们将在后文逐个把这些问题解决,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解证明

10、:记(P)表示路径P中不在T中的边数若(P)=0,则P在T上;若(P)0,则存在一条边(u,v)P T,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解证明(续):考察这条边(u,v):,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解证明(续):考察这条边(u,v):根据最小生成森林的性质,存在一条只有树边构成的路径P0连接u、v两点,并且P0的花费不大于(u,v)的花费,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解证明(续):考察这条边(u,v):根据最小生成森林的性质,存在一条只有树边构成的路径P0连接u、v两点,并且P0的

11、花费不大于(u,v)的花费将P中(u,v)替换为路径P0,P的总花费不增且(P)减小,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解证明(续):由于(P)0,所以可以在有限次替换后将P变成一条T中的路径这就证明了该引理,引入最小生成森林,引理一:任意询问可以在G的最小生成森林中找到最优解根据引理,我们只需要保存所有树边即可,这样边数下降到O(N)级别,第一个问题被解决。,完成询问,我们来考虑第二个问题注意到最小生成森林中任意两点之间的路径是唯一的。我们可以采用DFS找出该路径中的关键边,时间消耗为O(N)考虑到N=1000、Q=105,这样的时间复杂度仍然不能很好解决本题

12、,深入思考,询问树上两点之间路径上的最大边,这种问题可以使用动态树等工具实现,但是都过于复杂。为了找出一个简单、实用的算法,我们需要仔细的研究最小生成森林的性质Kruskal算法是建立最小生成森林中为我们所熟知的算法,以下我们将模拟一次Kruskal算法的执行,1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,我们使用Kruskal算法生成上图的最小生成森林,将所有边按照权值从小到大加入,1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(1,2)为树边注意到Query(1,2)的关键边为(1,2),1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(

13、1,3)为树边注意到Query(1|2,3)的关键边为(1,3),1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(4,6)为树边注意到Query(4,6)的关键边为(4,6),1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(5,6)为树边注意到Query(4|6,5)的关键边为(5,6),1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(2,3)注意到已存在路径(2,1)(1,3),所以(2,3)非树边,1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,加入边(3,4)为树边注意到Query(1|2|3,4|5|6)的关键边为

14、(3,4),1,2,3,4,5,6,1,5,2,6,7,3,4,1,0,此时,我们已经的到了最小生成森林T更重要的是,我们也已经得到了所有询问的回答!,重要引理的发现,对Kruskal过程仔细思考,我们得出关键:引理二:任意两点u、v间最短路径的关键边,为执行Kruskal算法中第一次将此两点连通的树边!,Kruskal生成顺序森林,如何适当的应用引理二呢?所有的树边和结点需要被有机的结合起来,这里我们使用Kruskal生成顺序森林(简称顺序森林)仍然考虑下图:,Kruskal生成顺序森林,顺序森林的每个叶结点对应原图的一个结点,如下图所示,叶结点Vi对应原图的结点i,Kruskal生成顺序森

15、林,顺序森林的每个叶结点对应原图的一个结点,如下图所示,叶结点Vi对应原图的结点i,V,1,V,2,V,3,V,4,V,5,V,6,Kruskal生成顺序森林,树边Ei被加入时,该边所连接的两个连通块在顺序森林中必然是两棵树,V,1,V,2,V,3,V,4,V,5,V,6,Kruskal生成顺序森林,建立顺序森林结点与Ei相对应,其左右孩子分别为两个连通块对应树的根结点,V,1,V,2,V,3,V,4,V,5,V,6,Kruskal生成顺序森林,我们模拟将所有的树边依次加入:,V,1,V,2,V,3,V,4,V,5,V,6,Kruskal生成顺序森林,添加树边(1,2),将原图结点1、2合并为

16、一个连通块;我们建立顺序森林结点E1,两个儿子为V1、V2,V,1,V,2,V,3,V,4,V,5,V,6,E,1,Kruskal生成顺序森林,添加树边(1,3),将原图结点1、2、3合并为一个连通块;我们建立顺序森林结点E2,两个儿子为E1、V3,V,1,V,2,V,3,V,4,V,5,V,6,E,1,E,2,Kruskal生成顺序森林,类似的添加树边(4,6)时,建立顺序森林结点E3,两儿子为V4、V6,V,1,V,2,V,3,V,4,V,5,V,6,E,1,E,2,E,3,Kruskal生成顺序森林,添加树边(5,6)时,建立顺序森林结点E4,两儿子为V5、E3,V,1,V,2,V,3,

17、V,4,V,5,V,6,E,1,E,2,E,3,E,4,Kruskal生成顺序森林,添加树边(3,4)时,建立顺序森林结点E5,两儿子为E2、E4,V,1,V,2,V,3,V,4,V,5,V,6,E,1,E,2,E,3,E,4,E,5,Kruskal生成顺序森林,我们得到了图G的最小生成顺序森林,V,1,V,2,V,3,V,4,V,5,V,6,E,1,E,2,E,3,E,4,E,5,引入LCA解决问题!,不难发现,Query(Vi,Vj)即为顺序森林中他们的最近公共祖先!根据已有的成果,我们可以在O(N+Q)的时间内完成两次删边操作之间的所有询问可以采用Tarjan算法解决,水管局长,让我们总

18、结以上的算法流程:生成结束时的最小生成森林和顺序森林;从后往前完成操作:对于删边操作,重新生成最小生成森林和顺序森林;对于连续的询问操作,将其作为离线LCA询问在顺序森林上处理;输出答案;,时间复杂度,在我的论文中以下结论被给出:生成、维护最小生成森林和顺序树总时间花费为O(Mlog2M+DNa(N)询问可以在O(Q+ND)的时间内解决总的时间复杂度为:O(Mlog2M+DNa(N)+Q),小结,我们先发现了解题的关键所在:边数过多(数据规模大)求解时间复杂度过高针对第一点,我们引入最小生成森林针对第二点,我们充分利用了经典算法在已有的问题模型和算法上,合理的转化,最终得到了本题的解决方案,总

19、结,RMQ&LCA问题作为经典问题无论在算法学习上还是实际应用中都发挥了巨大的作用解决问题研究算法时,恰当的引入经典问题和经典算法,无疑会大大加大我们的解题速度和精度!站在巨人的肩膀上,我们才能看得更高、更远!,谢谢!,敬请批评指正!,引入最小生成森林的时间花费,时间复杂度分为两个部分:生成最小生成森林的时间消耗维护最小生成森林的时间消耗生成的复杂度由经典的Kruskal算法给出:O(Mlog2M)以下主要讨论维护的时间消耗,引入最小生成森林的时间花费,考察题目给出的删边操作若需删除的边非树边,那么不需要进行维护否则,我们需要枚举另一条边来进行补充,枚举量高达O(M)!正难则反,若是向图中添加

20、一条新的边呢?注意到一个重要的性质,原非树边在添加新边后仍然为非树边!算法只需在原树边与新边中找出新的最小生成森林,引入最小生成森林的时间花费,将删边操作转化为添边操作,从后往前执行所有操作即可综上,算法只需要在不超过N条边中建立最小生成森林,复杂度为O(Na(N)注意到,最小顺序森林的生成与最小生成森林是同步的,所以亦可以在O(Na(N)的时间内完成,完成询问的时间花费,按照添边操作,可以把操作序列分为很多段:对于连续两个添边操作之间的询问操作,我们可以采取经典算法解决,时间花费为O(N+Q)。总时间复杂度为:O(ND+Q),添边操作询问操作询问操作添边操作询问操作询问操作,Sparse T

21、able算法,一般RMQ的Sparse Table(ST)算法是基于倍增思想设计的O(Nlog2N)O(1)在线算法算法记录从每个元素开始的连续的长度为2k的区间中元素的最小值,并以在常数时间内解决询问,Sparse Table算法,对于RMQ(A,i,j),我们可以找到两段极大的长度为2的幂的区间(如图)覆盖i,j由已经计算的结果在O(1)的时间内解决询问,i,j,A,Sparse Table算法,利用倍增思想,在O(Nlog2N)的时间内,我们可以预处理所有长度为2的幂的区间的最小值,我们可以用O(N)的时间处理长度为1的区间对于长度为2k的区间的最小值,可以由两个长度为2k-1的区间的最

22、小值得到(如图),2k,Tarjan算法,解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问。它是时间复杂度为O(Na(N)+Q)的离线算法,Tarjan算法,考察树T中所有与结点u有关的询问(u,v),p1,p2,对于子树u中的结点v,满足LCA(u,v)=v,对于子树p1而非子树u中的结点v,满足LCA(u,v)=p1,对于子树p2而非子树p1中的结点v,满足LCA(u,v)=p2,Tarjan算法,p1,p2,算法DFS有根树T,定义从根节点到当前正在遍历的结点u的路径为活跃路径P,对于每个已经遍历过的结点x,我们使用并查集将其连接到P上距离其最近的结点

23、F(x),正在遍历,F(x),F(x),F(x),Tarjan算法,p1,p2,正在遍历,记录与u有关的询问集合为Q(u),对于Q(u)中的任意一组询问LCA(u,v),如果v已经遍历过,那么答案即为F(v),我们只需要维护当前所有以遍历结点的F即可,p1,p2,记录与u有关的询问集合为Q(u),第一次遍历结点u时,有F(u)=u;,2)遍历完子树u后,子树u内任意结点w均有F(w)=u;回溯回结点p1时,子树u内任意结点w均有F(w)=p1,使用并查集完成即可;,Tarjan算法,Tarjan算法,算法流程:Tarjan_DFS(u)F(u)u;For(u,v)Q(u)do Answer(u

24、,v)F(v)For v son(u)a)Tarjan_DFS(v);b)F(v)u;,注:此处F采用并查集实现,1RMQ算法,算法的核心思想在于分块:,以L=log2N/2块长把B划分为M=N/L段,记录第k块的最小元素为BlockMin(k),把M块的最小值组成序列Blocks,利用分块思想,我们可以把询问分为两个部分询问:,log2N/2,BlockMin(1),BlockMin(M),M=N/L,连续的BlockMin取最小值,即Block-RMQ;两端块中某一部分取最小值,即In-RMQ;,Block-RMQ,log2N/2,Query,In-RMQ,这两个问题都可以O(N)O(1)

25、内实现,In-RMQ,1RMQ算法,Block-RMQ,Block-RMQ采用ST算法来实现,根据前文所讨论的,时间复杂度为O(Mlog2M)O(1)因为Mlog2M 2N/log2N*log2N=O(N),所以Block-RMQ的复杂度不大于O(N)O(1),In-RMQ,B中任意两个相邻数为1,所以本质不同的块至多有2L-1种;对于每一种块上的询问至多只有O(L2)种;所以本质不同的询问数至多有O(2L-1L2)=O(N0.5log22N)O(N)完成In-RMQ只需预处理所有本质不同的询问对应作答即可,时间复杂度为O(N)-O(1),1RMQ算法,因为LCA问题可以转化为生成序列的RMQ问题且问题规模不变,所以LCA问题可以在O(N)-O(1)的时间内解决;因为RMQ问题可以转化为LCA问题且问题规模不变,所以RMQ问题可以在O(N)-O(1)的时间内解决;,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号