最大子列和问题的四种解法

01-最大子列和问题 (20 分)
给定K个整数组成的序列{ N​1​​, N​2​​, …, N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, …, N​j​​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

数据1:与样例等价,测试基本正确性;
数据2:102个随机整数;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;

int MaxSubseqSum1(int List[],int N)
{
 int i,j,k;
 int ThisSum,Maxsum=0;
 
 for(i=0;i<N;i++){
  for(j=i;j<N;j++){
   ThisSum=0;
   for(k=i;k<=j;k++)
    ThisSum+=List[k];
   if(ThisSum>MaxSum)
    MaxSum=ThisSum; 
  }
 }
 
 return MaxSum;
}

时间复杂度为nnn
方法二:


int MaxSubseqSum1(int List[],int N)
{
 int i,j;
 int ThisSum,Maxsum=0;
 
 for(i=0;i<N;i++){
  ThisSum=0;
  for(j=i;j<N;j++){
   Thissum+=List[j];//对于相同的i,不同的j,保留j-1之前的和
   if(ThisSum>MaxSum)
    MaxSum=ThisSum; 
  }
 }
 
 return MaxSum;
}

时间复杂度n*n

方法三:分而治之

int Max(int A,int B,int C)
{
 return A>B?A>C?A:C:B>C?B:C//a>b?(a>c?a:c):(b>c?b:c)
}
int DivideAndConquer(int List[],int left,int right)
{
 int MaxLeftSum,MaxRightSum;
 int MaxLeftBorderSum,MaxRightBorderSum;
 
 int LeftBorderSum,RightBorderSum;
 int center i;
 
 if(left==right){
  if(List[left]>0)
   return List[left]
  else
   return 0;
 }
 center=(left+right)/2;
 MaxLeftSum=DivideAndConquer(List,left,center);
 MaxRightSum=DivideAndConquer(List,center+1,right);
 
 MaxLeftBorderSum=0;LeftBorderSum=0;
 for(i=center+1;i<=right;i++){
  RightBorderSum+=List[i];
  if(RightBorderSum>MaxRightBorderSum)
   MaxRightSum=RightBorderSum;
 }
 
 return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum)
}
int MaxSubseqSum(int List[],int N)
{
 return DivideAndConquer(List,0,N-1);
}

方法四:在线处理

int MaxSubseqSum4(int List[],int N)
{
 int i;
 int ThisSum,MaxSum;
 
 ThisSum=MaxSum=0;
 for(i=0;i<N;i++)
 {
  ThisSum+=List[i];
  if(ThisSum>MaxSum)
   MaxSum=ThisSum;
  else if(ThisSum<0)
   ThisSum=0;
 }
 
 return 0;
}

你可能感兴趣的:(数据结构学习与实验指导)