RMQ算法

本文介绍了一种高效查询区间最大最小值的算法。通过预处理建立二维数组F,存储不同长度区间的最大最小值,实现O(log n)的时间复杂度查询任意区间最值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        对于这个算法,是求区间里面的最大最小值,一般思想在区间for循环一遍找,但是访问区间次数多的话,且区间长度太长,这样时间复杂度都会太长,我认为就是做了一个预处理使得访问时间大大减短。

       怎么才能够得到区间的最值?  所以,如预处理区间的最大值,最小值也是类似的。用一个F二维数组F[ i ][ j ] 表示区间以  i  为起点长度为2^j次方 长度的区间的最大值。 这样处理了加入需要求  (a,b) 区间的最大值,因为F数组存最大值的区间长度为1 2 4 8 16 区间长度为2的n次方;比如你所求区间长度为7 你可以找前4个长度的区间与后4个长度的区间求最大值这样就可以得到你想要的区间的最大值。

      那么如何得到 F这个数组?

void RMQ(int num) //预处理->O(nlogn)
{
	for(int j = 1; j < 20; ++j)//区间长度为2,4,8,16……先找区间长度为2 下一个区间长度为4就可以以长度为2的开始,这样就得到状态转移方程
		for(int i = 1; i <= num; ++i)   //i 表示区间的开始
			if(i + (1 << j) - 1 <= num)
			{
				F[i][j] = max(F[i][j - 1], F[i + (1 << (j - 1))][j - 1]);
				F[i][j] = min(F[i][j - 1], F[i + (1 << (j - 1))][j - 1]);
			}
}

这样便得到F数组  比如求   [a,b] 这个区间的最大值,起点是a,长度是b-a+1,因为2^n等于长度 k=(int)log2(b-a+1)这代表的区间长度k的值一定小于区间长度但是一定大于等于区间长度的一半,  所以

MAX区间(a,b) 等于     Max(F[ a ][ k ] , F[ b-2^k+1 ][ k ]);

       与此类似的最小值与上述方法一样,就不再多说了。

   希望一起共同学习,共同进步。相信努力就一定会有收获




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值