分桶法与平方分割
给定一个序列,并询问很多个区间,要求我们求该区间的最值,一般采用的都是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