- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
时间复杂度 在我的论文中以下结论被给出: 生成、维护最小生成森林和顺序树总时间花费为O(Mlog2M + DNa(N)) 询问可以在O(Q + ND)的时间内解决 总的时间复杂度为: O(Mlog2M + DNa(N) + Q) 小结 我们先发现了解题的关键所在: 边数过多(数据规模大) 求解时间复杂度过高 针对第一点,我们引入最小生成森林 针对第二点,我们充分利用了经典算法 在已有的问题模型和算法上,合理的转化,最终得到了本题的解决方案 总结 RMQLCA问题作为经典问题无论在算法学习上还是实际应用中都发挥了巨大的作用 解决问题研究算法时,恰当的引入经典问题和经典算法,无疑会大大加大我们的解题速度和精度! 站在巨人的肩膀上,我们才能看得更高、更远! 谢谢! 敬请批评指正!! 引入最小生成森林的时间花费 时间复杂度分为两个部分: 生成最小生成森林的时间消耗 维护最小生成森林的时间消耗 生成的复杂度由经典的Kruskal算法给出: O(Mlog2M) 以下主要讨论维护的时间消耗 引入最小生成森林的时间花费 考察题目给出的删边操作 若需删除的边非树边,那么不需要进行维护 否则,我们需要枚举另一条边来进行补充,枚举量高达O(M)! 正难则反,若是向图中添加一条新的边呢? 注意到一个重要的性质,原非树边在添加新边后仍然为非树边! 算法只需在原树边与新边中找出新的最小生成森林 引入最小生成森林的时间花费 将删边操作转化为添边操作,从后往前执行所有操作即可 综上,算法只需要在不超过N条边中建立最小生成森林,复杂度为O(Na(N)) 注意到,最小顺序森林的生成与最小生成森林是同步的,所以亦可以在O(Na(N))的时间内完成 完成询问的时间花费 按照添边操作,可以把操作序列分为很多段: 对于连续两个添边操作之间的询问操作,我们可以采取经典算法解决,时间花费为O(N + Q’)。总时间复杂度为: O(ND + Q) 添边操作 询问操作 …… 询问操作 添边操作 询问操作 …… 询问操作 …… Sparse Table算法 一般RMQ的Sparse Table(ST)算法是基于倍增思想设计的O(Nlog2N) – O(1)在线算法 算法记录从每个元素开始的连续的长度为2k的区间中元素的最小值,并以在常数时间内解决询问 Sparse Table算法 对于RMQ(A,i,j),我们可以找到两段极大的长度为2的幂的区间(如图)覆盖[i,j] 由已经计算的结果在O(1)的时间内解决询问 i j A 2k 2k Sparse Table算法 利用倍增思想,在O(Nlog2N)的时间内,我们可以预处理所有长度为2的幂的区间的最小值 我们可以用O(N)的时间处理长度为1的区间 对于长度为2k的区间的最小值,可以由两个长度为2k-1的区间的最小值得到(如图) 2k 2k-1 2k-1 Tarjan算法 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问。它是时间复杂度为O(Na(N) + Q)的离线算法 Tarjan算法 考察树T中所有与结点u有关的询问(u, v) u v p1 p2 对于子树u中的结点v,满足LCA(u, v) = v 对于子树p1而非子树u中的结点v,满足LCA(u, v) = p1 对于子树p2而非子树p1中的结点v,满足LCA(u, v) = p2 v v Tarjan算法 u p1 p2 算法DFS有根树T,定义从根节点到当前正在遍历的结点u的路径为活跃路径P 对于每个已经遍历过的结点x,我们使用并查集将其连接到P上距离其最近的结点F(x) 正在遍历 F(x) F(x) F(x) Tarjan算法 u p1 p2 正在遍历 记录与u有关的询问集合为Q(u) 对于Q(u)中的任意一组询问LCA(u, v),如果v已经遍历过,那么答案即为F(v) 我们只需要维护当前所有以遍历结点的F即可 u p1 p2 正在遍历 记录与u有关的询问集合为Q(u) 第一次遍历结点u时,有F(u) = u; 2)遍历完子树u后,子树u内任意结点w均有F(w) = u;回溯回结点p1时,子树u内任意结点w均有F(w) = p1,使用并查集完成即可; F Tarjan算法 Tarjan算法 算法流程: Tarjan_DFS(u) F(u) ? u; For (u, v) ∈ Q(u) do Answer(u, 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),把
原创力文档


文档评论(0)