st(sparse table)演算法的基本思想是,預先計算從起點a[i]開始長度為2的j次方(j=0,1...logn)的區間的最小值,然後在查詢時將任何乙個區間a[i..j]劃分為兩個預處理好的可能重疊的區間,取這兩個重疊區間的最小值。
在預處理階段,從起點a[i]開始,任何乙個長度為2^j的區間都可以劃分為兩個長度2^(j-1)的區間,其中第乙個區間的範圍為:i...i+2^(j-1)-1;第二個區間的範圍為:i+2^(j-1)...i+2^j-1。用m[i,j]表示從a[i]開始,長度為2^j的區間(即a[i]...a[i+2^j-1])最小值對應的下標,那麼a[m[i,j]] = min。 利用dp思想,先計算m[i,j-1]的值,然後計算m[i,j]的值。
在查詢階段,任何區間a[i..j]的長度d=j-i+1,令k=floor(logd),那麼該區間可以被兩個長度為2^k的子區間完全覆蓋,這兩個長度為2^k的區間可以有重疊。由於這兩個區間已經在預處理中求得最小值,因此可以取二者的最小值得到a[i..j]的最小值。
st演算法預處理階段的複雜度為o(nlogn),查詢階段的複雜度為o(1)。
實現:?
/**
*
* using st(sparse table) algorithm to solve rmq problem
* time complexity:
*
*
* licensed under gpl (
*
* @author ljs
* 2011-08-02
*
*/
public
class
rmq_st
}
return
m;
}
//st: o(1) for querying
public
int
query(
int
a,
int
m,
int
i,
int
j)
int
k = (
int
)(math.log(j-i+
1
)/math.log(
2
));
//the first interval
int
mina = m[i][k];
int
minb = m[j-(
1
<
if
(a[mina]<=a[minb])
return
mina;
else
return
minb;
}
public
static
void
main(string args) ;
rmq_st st =
new
rmq_st();
int
m = st.preprocess(a);
system.out.format(
"%n***********************%n"
);
int
i=
3
,j=
7
;
int
min = st.query(a,m, i,j);
system.out.format(
"rmq for a[%d..%d]: a[%d]=%d"
, i,j,min,a[min]);
system.out.format(
"%n***********************%n"
);
j=
3
;i=
7
;
min = st.query(a,m, i,j);
system.out.format(
"rmq for a[%d..%d]: a[%d]=%d"
, i,j,min,a[min]);
system.out.format(
"%n***********************%n"
);
for
(
int
x=
0
;x
for
(
int
y=
0
;y
system.out.format(
" "
);
}
for
(
int
y=x;y
int
p = st.query(a,m,x,y);
system.out.format(
" %d/%d"
,a[p],p);
}
system.out.println();
}
}
}
RMQ問題 ST演算法
rmq問題 rmq問題是指求區間最值的問題。rmq演算法 st演算法 時間複雜度 預處理o nlogn 查詢o 1 以求最大值為例,設d i,j 表示 i,i 2 j 1 這個區間內的最大值,那麼在詢問到 a,b 區間的最大值時答案就是max d a,k d b 2 k 1,k 其中k是滿足2 k ...
RMQ問題的ST演算法
st sparse table 演算法的基本思想是,預先計算從起點a i 開始長度為2的j次方 j 0,1.logn 的區間的最小值,然後在查詢時將任何乙個區間a i.j 劃分為兩個預處理好的可能重疊的區間,取這兩個重疊區間的最小值。在預處理階段,從起點a i 開始,任何乙個長度為2 j的區間都可以...
RMQ問題與ST演算法
對於問題 rmq,random maximum query 給你一串固定 不修改的數字,詢問多次某個區間內的最大值或者最小值。用樸素的想法,依次遍歷得到答案,時間複雜度為o n 但是對於多次詢問,如1e6次詢問,這樣的演算法就不是最優的了。所以出現了st演算法。st演算法的原理是動態規劃,通過o l...