分桶法

分桶法与平方分割

给定一个序列,并询问很多个区间,要求我们求该区间的最值,一般采用的都是ST算法,这边提供一个新的方法——分桶法。相比较ST算法,效率可能没有那么高,ST算法的查询效率是O(lg(n)),而分桶法的效率在O(sqrt(n)),n的平方根,但对于一些数据规模不大的题目,这样的效率已经足够。
那么怎么实现?
设序列有n个元素,我们将整个序列分成sqrt(n)桶,每个桶内有sqrt(n)个元素,O(n)遍历,求取每个桶内的最值。

当询问区间(s,t)的最值时,我们算出s在bk[s]号桶内,t在bk[t]号桶内,那么
遍历区间[s,endof( bk(s) )],求取这个区间的最值X1;

遍历区间[startof( bk(s) ),t],求取这个区间的最值X2;

遍历桶[bk(s)+1, bk(t)-1],因为已经事先处理好每个桶内的最值,所以这些桶是不需要进行桶内遍历的。

桶的大小即区间长度为sqrt(n),桶的个数为sqrt(n),所以三次遍历的时间复杂度都是O(sqrt(n))。
那么一次询问的复杂度便是O(sqrt(n))。

相比较ST算法,虽然在效率上有所不及,但编码的复杂度大大降低。
图文俱佳->http://blog.csdn.net/a2459956664/article/details/51274373

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值