子列被定义为原连续的一段数字,找出具有列中li最大和的一段连续子列,返回它们的和。
一般通常的做法是穷举所有子列和,从中找出最大值。
int MaxSubsequence(int List[],int N) /*List[]整数数组,N为数组长度*/
{
int i,j;
int ThisSum,MaxSum=0;
for(i=0;i<N;i++) /*i是子列左端位置*/
{
ThisSum=0;
for(j=0;j<N;j++) /*j是子列右端位置*/
{
ThisSum+=List[j];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
时间复杂度O(N平方).
改进一下这个算法。利用在线处理可以使复杂度降为O(N)。
在线的意思是指每输入一个数据就进行即时处理,得到结果是对于当前已经读入的所有数据都成立的解,即在任何一个地方中止输入,算法都能正确给出当前的解。利用在线处理最大子列和的核心思想是:如果整数序列{a1,a2,a3......an}的最大和子列是{ai,ai+1...aj},那么必定有它们的累加和大于等于0.因此,一旦发现当前子列和为负,则可以重新开始考察一个新的子列。
int MaxSubsequence(int List[],int N) /*List[]整数数组,N为数组长度*/
{
int i;
int ThisSum=MaxSum=0;
for(i=0;i<N;i++)
{
ThisSum+=List[i]; /*向右累加*/
if(ThisSum>MaxSum)
MaxSum=thisSu; /*发现更大和则更新当前结果*/
else if(ThisSum<0) /*如果当前子列和为负*/
ThisSum=0; /*则不可能使后面的部分和增大,抛弃之*/
}
return MaxSum;
}
时间复杂度O(N),Greate!!!!
来自《数据结构》浙江大学 陈越