POJ 3264 Balanced Lineup ST算法

简介:

ST算法即是sparse table算法,就是稀疏表的意思,就是利用二分法来划分一个表,划分为2的次方段,之后利用这个st表计算查询结果,能够使得预处理时间O(nlgn),而查询时间为O(1) ;


那么有人会有疑问。既然查询时间是O(1)。那么为什么这个算法非常多时候并不比线段树快多少。甚至根本没有快过呢?

由于事实上查询时间为O(log(range)), range为查询区间的大小,由于要找到range二进制的最高位数,能够使用floor(log(range))的数学方法查找这个数。只是也是须要lg(rang)的时间效率。由于range不算太大。故此这点时间效率能够觉得是O(1).只是这就解析了为什么这个算法的查询时间不比线段树快多少。由于线段树的查询时间就是log(range)。

网上非常少人指出指点,一般都是笼统地说查询时间是O(1), 好像也不少人为此感到疑惑,故此解析下。

只是也能够这么说算法本身的查询时间效率是O(1)。而实际运行起来却是 O(logn)。或者说理论上的时间效率是O(1),实际时间效率是O(logn)。

预计这就是为什么非常多大牛的博客或者一些书本上也是写这个算法的查询效率是O(1)了。


说究竟就是一个数学方法计算。

详细能够參考topcoder或者參考这个大牛的吧:http://blog.csdn.net/v_july_v/article/details/18312089


本算法的优势就是代码量会比线段树省点。

掌握了当中的数学原理之后,这个算法还是非常好写的。

只是有线段树的存在,那么这个算法好像也不是不可缺少的。


#include <cstdio>
#include <algorithm>

const int MAX_N = 50001;
const int L = 17;//16;//(int)log(MAX_N) / log(2) + 1;
int N, Q, A, B;
int maxArr[MAX_N][L], minArr[MAX_N][L];

void initRMQ_ST()
{
	for (int j = 1; j < L; j++)
		for (int i = 1; i <= N; i++)
		{
			if (i - 1 + (1<<j) <= N)
			{
				maxArr[i][j]=max(maxArr[i][j-1], maxArr[i+(1<<(j-1))][j-1]);
				minArr[i][j]=min(minArr[i][j-1], minArr[i+(1<<(j-1))][j-1]);
			}
			else break;//能够break掉
		}
}

inline int query(int low, int up)
{
	int range = up - low + 1;
	int r = 0;
	while ((1<<(r+1)) <= range) r++;
	int maxV = max(maxArr[low][r], maxArr[up-(1<<r)+1][r]);
	int minV = min(minArr[low][r], minArr[up-(1<<r)+1][r]);
	return maxV - minV;
}

int main()
{
	while (scanf("%d %d", &N, &Q) != EOF)
	{
		for (int i = 1; i <= N; i++)
		{
			scanf("%d", &maxArr[i][0]);
			minArr[i][0] = maxArr[i][0];
		}
		initRMQ_ST();
		while (Q--)
		{
			scanf("%d %d", &A, &B);
			printf("%d\n", query(A, B));
		}
	}
	return 0;
}









本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5056134.html,如需转载请自行联系原作者

相关文章
|
5月前
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
30 0
[算法刷题题解笔记] POJ 1106 Transmitters [计算几何|叉积|点线关系]
[算法刷题题解笔记] POJ 1106 Transmitters [计算几何|叉积|点线关系]
|
机器学习/深度学习 移动开发 算法
秒懂算法 | 倍增与ST算法
本篇介绍了倍增的概念、例题以及ST算法。
257 0
秒懂算法 | 倍增与ST算法
|
算法 Python
person correlation,spearman correlation and kendall's t的算法(python,算法来自FRM-market risk )
person correlation,spearman correlation and kendall's t的算法(python,算法来自FRM-market risk )
84 0
|
算法
算法学习之路|POJ - 2479最大子串和(简单dp)
给一个数字串,求这个数字串中两个不相交的子串和的最大值。
1295 0
|
算法
算法学习之路|POJ 1068 Parencodings(简单模拟)
有一个括号串(括号成对),给出一串数字数组p,p[i]表示从左往右第i个右括号左边共有p[i]个左括号,求一个数组w,w[i]表示第i个右括号和其所匹配的左括号之间有多少个左括号(包括这个左括号本身)
1079 0
|
存储 算法 数据建模
|
算法 测试技术
数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Descri...
1019 0