您的位置:首页 > 其它

最大子序问题求解算法 笔记

2010-04-21 22:20 471 查看
对于最大子序问题求解的四种算法的总结摘录笔记如下:

 

暴力法(使用三个循环,复杂度为O(n3))

public class MaxSum{
public static void main(String[] args){
int[] array={-3,4,6,-9,5,-12,3,5};
int maxSum=0;
for(int i=0;i<array.length;i++){
for(int j=i;j<array.length;j++){
int thisSum=0;
for(int k=i;k<j;k++)
thisSum+=array[k];

if(thisSum>maxSum)
maxSum=thisSum;
}
}
System.out.println("the maxSum of :"+maxSum);
}
}


 

设法在第一个算法中折除一个循环

public class MaxSum{
public static void main(String[] args){
int[] array={-3,4,6,-9,5,-12,3,5};
int maxSum=0;
for(int i=0;i<array.length;i++){
int thisSum=0;
for(int j=i;j<array.length;j++){

thisSum+=array[j];

if(thisSum>maxSum)
maxSum=thisSum;
}
}
System.out.println("the maxSum of :"+maxSum);
}
}


 

采用分治法,再次将复杂度降为O(nlogn)

 

private static int maxSumRec(int[] a,int left,int right){
if(left==right)   //base case
if(a[left]>0)
return a[left];
else
return 0;

int center=(left+right)/2;
int maxLeftSum=maxSumRec(a,left,center);
int maxRightSum=maxSumRec(a,center+1,right);

int maxLeftBorderSum=0,leftBorderSum=0;
for(int i=center;i>=left;i--){
leftBorderSum+=a[i];
if(leftBorderSum>maxLeftBorderSum)
maxLeftBorderSum=leftBorderSum;

}

int maxRightBorderSum=0,rightBorderSum=0;
for(int i=center+1;i<=right;i++){
rightBorderSum+=a[i];
if(rightBorderSum>maxRightBorderSum)
maxRightBorderSum=rightBorderSum;

}

return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);
}
public static int maxSubSum3(int[] a){
return maxSumRec(a,0,a.length-1);
}


 

算法4,复杂度O(n)

public class MaxSum{
public static void main(String[] args){
int[] array={-3,4,6,-9,5,-12,3,5};
int maxSum=0,thisSum=0;
for(int i=0;i<array.length;i++){

thisSum+=array[i];

if(thisSum>maxSum)
maxSum=thisSum;
else if(thisSum<0)
thisSum=0;
}
System.out.println("the maxSum of :"+maxSum);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 string class
相关文章推荐