首页 > 编程语言 > 详细

RMQ Tarjan的Sparse-Table算法

时间:2020-03-21 13:36:59      阅读:53      评论:0      收藏:0      [点我收藏+]

参考博客:https://www.cnblogs.com/wenzhixin/p/9714760.html

预处理时间复杂度是O(nlogn),代码如下:

 1 void init(const vector<int>& A) {
 2     int n = A.size();
 3     for(int i = 0; i < n; i++) {
 4         d[i][0] = A[i];//以i开头,长度为1的最小值是A[i] 
 5     }
 6     
 7     for(int j = 1; (1 << j) <= n; j++) {//再区间范围内枚举次方 
 8         for(int i = 0; i + (1 << j) - 1 < n; i++) {//枚举每一个开头,直到没有长度为2的j的区间 
 9             d[i][j] = min(d[i][j - 1], d[i + (1 << j) - 1][j - 1]);
10         }
11     }
12 }

查询是常数复杂度,这是RMQ的一大优点,相对于线段树的O(logn)复杂度有很大改进。查询的时候先给出最大的k s.t. 2^k<=R-L+1。代码如下:

1 int query(int L, int R) {
2      int k = 0;
3      while((1 << (k + 1)) <= R - L + 1) k++;//若2的k+1次方<= R - L + 1,则k还可以加1 
4     return min(d[L][k], d[R - (1 << k) + 1][k]);
5  } 

 

RMQ Tarjan的Sparse-Table算法

原文:https://www.cnblogs.com/randy-lo/p/12538642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!