1、ST创建
若F[i,j]表示[i,i+2j -1]区间的最值,区间长度为2j ,则i和j的取值范围是多少呢?
若数组的长度为n,最大区间长度2k ≤n<2k+1 ,则k=log2 n 向下取整,比如n=8时k=3,n=10时k=3.
在程序中,k=log2(n),也可用通用表达方式k=log(n)/log(2),log()表示以e为底的自然对数。
算法代码:
- void ST_create(){
- for(int i=1;i<=n;i++)
- F[i][0]=a[i];//表示[i,i]区间的最值,区间长度为2^0
- int k=log2(n);
- for(int j=1;j<=k;j++)
- for(int i=1;i<=n-(1<<j)+1;i++)//n-2^j+1
- F[i][j]=max(F[i][j-1],F[i+(1<<(j-1))][j-1]);
- //j用来控制区间大小
- }
|