一.ST表简介
ST表利用动态规划预处理数据,采用倍增思想,高效处理区间查询的数据结构。
常用来解决RMQ问题(区间最值)。
二.原理图解
示例数据 | 9 | 3 | 1 | 7 | 5 | 6 | 0 | 8 | 区间长度 |
MAX | 9 | 3 | 1 | 7 | 5 | 6 | 0 | 8 | 1 |
MAX | 9 | 7 | 6 | 8 | 2 |
MAX | 9 | 8 | 4 |
……(区间长度成指数级增长)。 最小值,同理。
三.思路解析
1.首先,定义一个数组dp[10000][20]; dp[i][j] 左端点为i区间长度为2^j 即区间为[i,i+2^j-1]。
for(int i=1;i<=n;i++)cin>>dp[i][0]//初始化数据。
2.动态规划进行预处理
for(int j=1;(1<<j)<=n;j++)// j 代表区间长度(选取区间长度)
for(int i=1;i+(1<<j)-1<=n;i++)//用来遍历每个子区间(i区间起点)
例:区间长度为4 ,遍历 【1,4】,【2,5】,【3,6】……
i+(1<<j)-1<=n防止越界,即2^j要在【1,n】中。
最大值: dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]) 1<<j等价于 2^j (这里是利用位运算)
最小值: dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1])
遍历图解:
————————————— —————————————
i i+(1<<(j-1))-1 i+(1<<(j-1)) i+(1<<j)-1
———————————————————————————
i i+(1<<j)-1
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);//更新合成后的区间最大值,
数据变化参照上面表格。
四.查找子区间最值
给定区间【L,R】查找区间最值。
区间长度K=(R-L+1)所以 j =(int)log2(k)
区间最大值 max( dp [L] [ j ] ,dp [ R- (1<< j)+1 ] [ j ] )
区间最小值 min( dp [L] [ j ] ,dp [ R- (1<< j)+1 ] [ j ] )
用 dp [ R- (1<< j)+1 ] [ j ] 原因区间叠加,不影响最值
————————————————————
———————————— dp [L] [ j ]
—————————— dp [ R- (1<< j)+1 ] [ j ]
1 4 5 7 8 9 0 1 3
1 4 5 7 8 9
8 9 0 1 3 最大值仍为9.