求最大子段和的分治算法

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

假期在家研究算法,请问最大子段的分治算法如何实现?这里是我写的代码,但是不知道哪里出问题了  
  请大家帮我看看。。谢谢了  
  int   max_sum(int   a[],   int   left,   int   right)  
  {        
   
  if   (left==right)  
  {  
        if   (a[left]>0)    
              return   a[left];  
        else   return   0;  
  }  
      else  
      {  
          center=(left+right)/2;  
          leftsum=max_sum(a,left,center);  
          rightsum=max_sum(a,center+1,right);  
      }  
      s1=0;lefts=0;  
      for(int   i=center;i>=left;i--)  
      {  
          lefts+=a[i];                             //这里求左右两子段时,可能出现问题。怀疑是自己的思路  
      }                                                                     //本身就是有问题的。  
      if(lefts>s1)  
      s1=lefts;  
      s2=rights=0;  
      for(   int   j=center+1;j<=right;j++)  
      {  
      rights+=a[j];  
      }  
      if(rights>s2)  
      s2=rights;  
      s=s2+s1;  
      if(s1==leftsum   &&   s2==rightsum)  
      return   s;  
      else  
      {  
      if(leftsum<rightsum)  
  return   rightsum;  
      else  
  return   leftsum;  
      }  
   
  }

· 网友精彩回答:

发表者:jixingzhong

顶一下  
   
   
   
  要上班了,没有时间看代码了......................

发表者:qunkangli

分治算法复杂度o(nlogn),有o(n)的算法:  
  int   maxsubseqencesum(   int   a[],   int   n   )  
  {  
  int   thissum,   maxsum,   j   ;  
  thissum   =   maxsum   =   0   ;  
  for(   j   =   0   ;   j   <   n;   ++j   )   {  
  thissum   +=   a[j]   ;  
  if(   thissum   >   maxsum   )  
  maxsum   =   thissum   ;  
  else   if(   thissum   <   0   )  
  thissum   =   0   ;  
  }  
  return   maxsum   ;  
  }  
   
   
  下面是分治+递归的实现:  
  int   maxsubsum(   int   a[],   int   left,   int   right   )  
  {  
  int   maxleftsum,   maxrightsum   ;  
  int   maxleftbordersum,   maxrightbordersum   ;  
  int   leftbordersum,   rightbordersum   ;  
  int   center,   i   ;  
   
  if(   left   ==   right   )  
  if(   a[left]   >   0   )   return   a[left]   ;  
  else   return   0   ;  
   
  center   =   (left+right)/2   ;  
  maxleftsum   =   maxsubsum(   a,   left,   center   )   ;  
  maxrightsum   =   maxsubsum(   a,   center+1,   right   )   ;  
   
  maxleftbordersum   =   0   ;   leftbordersum   =   0   ;  
  for(   i   =   center;   i   >=   left;   --i   )   {  
  leftbordersum   +=   a[i]   ;  
  if(   leftbordersum   >   maxleftbordersum   )  
  maxleftbordersum     =   leftbordersum   ;  
  }  
  maxrightbordersum   =   0   ;   rightbordersum   =   0   ;  
  for(   i   =   center   +   1   ;   i   <=   right   ;   ++i   )   {  
  rightbordersum   +=   a[i]   ;  
  if(   rightbordersum   >   maxrightbordersum   )  
  maxrightbordersum   =   rightbordersum;  
  }  
  return   max3(   maxleftsum,   maxrightsum,   maxleftbordersum+maxrightbordersum   )   ;  
  }  
 

.
处理 SSI 文件时出错
© 2006-2008 All Rights Reserved