博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RMQ LAC 入门
阅读量:6906 次
发布时间:2019-06-27

本文共 908 字,大约阅读时间需要 3 分钟。

 

RMQ

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。——百度百科

举个例子:在1 0 4 99 8 5这一串数中求第2个数到第5个数的最小值。

有什么办法?

最简单的莫过于循环一次,时间为O(N).但如果有许多个询问呢?

这时就要用到ST算法了。利用动规预处理出每一段的最值,对于每个询问,只要O(1)的时间便能得出答案。

动规如下:f[i][j]表示从第i个位置开始的2^j个数中的最小值。转移方程如下:

f[i][j]=min(f[i][j-1],f[i+2^(j-1)][j-1])

这样,对于每个查询x,y(x<y)(在第x个位置到第y个位置的最值),答案就是

min(f[x][j],f[y-2^(j)+1][j])(其中j是log2(y-x+1)) 
∵[x,x+2^j]与[y-2^(j)]都是[x,y]的子区间且[x,x+2^j]U[y-2^(j)]=[x,y]。

至此RMQ问题就解决了,时间复杂度为O(nlogn)+O(1)*q(其中q为询问数量)

当然还有其他的方法这里就不讨论了

LCA

最近公共祖先(Least Common Ancestors)LCA简介:对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点。——百度百科

求LCA的其中一种算法便是转换成RMQ,利用ST算法求解。具体做法如下: 将这棵树用深度优先遍历,每次遍历一个点(包括回溯)都添加进数组里面。找到所询问的点第一次在其出现的位置,两个位置所夹的点中深度最小的即为所求。

如图求3与6的LCA。首先利用深度优先遍历得到一个数列:1,2,3,2,4,5,6

找到3第一次出现以及6第一次出现的位置。所夹数列即为3,2,4,5,6。其中深度最小的点就是他们的LCA,也就是2.

 

 

 

 

转载地址:http://thrdl.baihongyu.com/

你可能感兴趣的文章
SOFA 源码分析— 自定义路由寻址
查看>>
Redis Bug 总动员(持续更新)
查看>>
几个选择器的比较和准确的描述
查看>>
Java笔记—重构-完全不用 if-else 可能吗?
查看>>
CSS视口单位:快速入门
查看>>
教程 React16+Redux+Router4+Koa 服务端渲染,惰性加载,热更新
查看>>
关于Xcode更新之后插件失效以及安装失败详解
查看>>
慕课网Flask高级编程实战-3.蓝图、模型与CodeFirst
查看>>
仅2步实现 拜拜 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
查看>>
Android小知识-WebView的Java和JavaScript交互
查看>>
说说在 Vue.js 中如何实现组件间通信(高级篇)
查看>>
Charles使用指南
查看>>
MaxCompute新功能发布
查看>>
canvas系列教程03-柱状图项目1
查看>>
如何快速的开发一个完整的 iOS 直播 app(原理篇)
查看>>
密码学note
查看>>
为何要在componentDidMount里面发送请求?
查看>>
react,redux源码解析
查看>>
background?
查看>>
im市场硝烟再起, 继美团、头条后,去哪儿也推出企业im工具“Startalk(星语)”...
查看>>