连续子序列最大和

来源:互联网 发布:mysql 返回错误信息 编辑:程序博客网 时间:2024/04/16 18:08

 丢没了快,从头开始看,数据结构与问题求解。

这个问题在书上用来说明算法概念,照搬过来了。

package org.aimbin.lib.algorithm.conception;/** 连续子序列最大和问题 */public class MaxSubSequenceSum {public enum POLICY{CUBIC,SQUARE,LINEAR}/**求连续子序列最大和 */public static Result maxSubSeqSum(int[] array, POLICY policy){switch (policy) {case LINEAR:return maxSubSeqSumLinear(array);case SQUARE:return maxSubSeqSumSquare(array);case CUBIC:return maxSubSeqSumCubic(array);default: break;}return null;}/** 平方算法 */public static Result maxSubSeqSumSquare(int[] array){int maxSum = 0;int seqStart = 0;int seqEnd = 0;for(int i = 0; i < array.length; i++){int curSum = 0;for(int j = i; j < array.length; j++){curSum += array[j];if(curSum > maxSum){maxSum = curSum;seqStart = i;seqEnd = j;}}}return new MaxSubSequenceSum.Result(maxSum, seqStart, seqEnd);}/**立方算法,。观察发现可以通过记录上一次累加值,减少累加次数来减少一层循环。  */public static Result maxSubSeqSumCubic(int[] array){int maxSum = 0;int seqStart = 0;int seqEnd = 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;seqStart = i;seqEnd = j;}}}return new MaxSubSequenceSum.Result(maxSum, seqStart, seqEnd);}/**线性算法 */public static Result maxSubSeqSumLinear(int[] array){/** * 定理:设A(i,j)是满足S(i,j)<0的任意子序列,如果q>j,那么A(i,q)不是 * 最大连续子序列。 * 定理:对于任意i,设A(i,j)是满足S(i,j)<0的第一个序列,那么,对于任何 * i <= p <= j和p <= q,A(p,q)或不是一个最大的连续子序列,或等于一个已经 * 出现过的最大连续子序列。 *///空串下总是一种可能。int maxSum = 0;int thisSum = 0;int seqStart = 0;int seqEnd = 0;for(int i = 0, j = 0; j < array.length; j++){thisSum += array[j];if(thisSum > maxSum){maxSum = thisSum;seqStart = i;seqEnd = j;}else if(thisSum < 0){i = j+1;thisSum = 0;}}return new MaxSubSequenceSum.Result(maxSum, seqStart, seqEnd);}/** * @param args */public static void main(String[] args) {int[] a1 = new int[]{-2,11,-4,13,-5,2};int[] a2 = new int[]{1,-3,4,-2,-1,6};int[] a3 = new int[]{-1,-3,-4,-2,-1,-1};System.out.println(maxSubSeqSum(a1,POLICY.CUBIC) + ", "+ maxSubSeqSum(a1,POLICY.SQUARE) + ", "+ maxSubSeqSum(a1,POLICY.LINEAR));System.out.println(maxSubSeqSum(a2,POLICY.CUBIC) + ", "+ maxSubSeqSum(a2,POLICY.SQUARE) + ", "+ maxSubSeqSum(a2,POLICY.LINEAR));System.out.println(maxSubSeqSum(a3,POLICY.CUBIC) + ", " + maxSubSeqSum(a3,POLICY.SQUARE) + ", "+ maxSubSeqSum(a3,POLICY.LINEAR));}/**用于记录结果。*/public static class Result{int maxSum;int seqStart;int seqEnd;public Result(){}public Result(int maxSum, int seqStart, int seqEnd) {this.maxSum = maxSum;this.seqStart = seqStart;this.seqEnd = seqEnd;}public int getMaxSum() {return maxSum;}public void setMaxSum(int maxSum) {this.maxSum = maxSum;}public int getSeqStart() {return seqStart;}public void setSeqStart(int seqStart) {this.seqStart = seqStart;}public int getSeqEnd() {return seqEnd;}public void setSeqEnd(int seqEnd) {this.seqEnd = seqEnd;}@Overridepublic String toString() {return "Result {maxSum:" + maxSum + ", seqStart:" + seqStart+ ", seqEnd:" + seqEnd + "}";}}}


 

 

原创粉丝点击