posts - 97,  comments - 93,  trackbacks - 0
To find a max segment in a array which includes negative and positive no.There r several methods to solve this question.And in the works, ignore the zero position.


  1package com.ibm.nicky.maxsegment;
  2
  3/**
  4 * @author QuQiang
  5 * 
  6 * The program can calculate the max sum segment
  7 * source[i]+source[i+1]+…+source[j]in source array,and return the
  8 * position.Ignore the zero position.
  9 */

 10public class MaxSegment {
 11
 12    /**
 13     * if start = -1 end = -1 is returned, the array should be initialized
 14     */

 15    private static int start = -1;
 16    private static int end = -1;
 17    private static int sum = 0;
 18
 19    private static int[] source = {-1,-2,-1,-10,-3,0,2,6,12,-5,6,-4};
 20
 21    /*
 22     * The main function to test the method.
 23     */

 24/*    public static void main(String[] args) {
 25        System.out.println(MaxSegment.getThrOptimizedMaxSegment()
 26                + ":" + MaxSegment.start + ":" + MaxSegment.end);
 27    }*/

 28
 29    /**
 30     * @return the sum of the max segment but the method is not very nice. the
 31     *         algorithmic complexity is T(n)=O(n^3)
 32     */

 33    public static int getMaxSegment() {
 34        start = -1;end = -1;sum = 0;
 35        for (int i = 0; i < source.length; i++{
 36            for (int j = i + 1; j < source.length; j++{
 37                int temp = 0;
 38                for (int k = i; k < j; k++{
 39                    temp += source[k];
 40                }

 41                if (temp > sum) {
 42                    sum = temp;
 43                    start = i;
 44                    end = j - 1;
 45                }

 46            }

 47        }

 48        return sum;
 49    }

 50
 51    /**
 52     * @return the sum of the max segment && use the previous result
 53     *         sum[i+1]=sum[i]+source[i+1]. algorithmic complexity is (n)=O(n^2)
 54     */

 55    public static int getFirOptimizedMaxSegment() {
 56        start = -1;end = -1;sum = 0;
 57        for (int i = 0; i < source.length; i++{
 58            int temp = 0;
 59            for (int j = i; j < source.length; j++{
 60                temp += source[j];
 61                if (temp > sum) {
 62                    sum = temp;
 63                    start = i;
 64                    end = j;
 65                }

 66            }

 67        }

 68        return sum;
 69    }

 70
 71    /**
 72     * @return the sum of the max segment && use the recursion
 73     *         formula.Division-and-Conquer and Recursion algorithm algorithmic
 74     *         complexity is T(n)=2T(n/2)+O(n),T(n)=O(nlogn).
 75     */

 76    public static int getSecondOptimizedMaxSegment(int leftend, int rightend) {
 77        start = -1;end = -1;sum = 0;
 78        int centerpiont = 0, leftsum = 0, rightsum = 0;// ,tempstart = -1
 79                                                        // ,tempend = -1;
 80        if (leftend == rightend)
 81            sum = source[leftend] > 0 ? source[leftend] : 0;
 82        else {
 83            centerpiont = (leftend + rightend) / 2;
 84            leftsum = getSecondOptimizedMaxSegment(leftend, centerpiont);
 85            rightsum = getSecondOptimizedMaxSegment(centerpiont + 1, rightend);
 86        }

 87        int templeftSum = 0, lefts = 0;
 88        for (int i = centerpiont; i > leftend - 1; i--{
 89            lefts += source[i];
 90            if (lefts > templeftSum) {
 91                templeftSum = lefts;
 92                // tempstart = i;
 93                start = i;
 94            }

 95        }

 96        int temprightSum = 0, rights = 0;
 97        for (int j = centerpiont + 1; j < rightend + 1; j++{
 98            rights += source[j];
 99            if (rights > temprightSum) {
100                temprightSum = rights;
101                // tempend = j;
102                end = j;
103            }

104        }

105        sum = templeftSum + temprightSum;
106        if (sum < leftsum) {
107            start = leftend;
108            end = centerpiont;
109            return sum = leftsum;
110        }
 else if (sum < rightsum) {
111            start = centerpiont + 1;
112            end = rightend;
113            return sum = rightsum;
114        }
 else {
115            // start = tempstart ;
116            // end = tempend;
117            return sum;
118        }

119    }

120
121    /**
122     * @return the sum of the max segment && use the dynamic programming
123     *         (DP).temp[i]=max(temp[i-1]+source[i],source[i]) algorithmic
124     *         complexity is O(n).(Not all are negative)
125     */

126    public static int getThrOptimizedMaxSegment() {
127        start = -1;end = -1;sum = 0;
128        int temp = 0;
129        int flag=-1, count=0;
130        for (int i = 0; i < source.length; i++{
131            if (temp > 0){
132                temp += source[i];
133                flag = i;
134                count++;
135            }

136            else
137                temp = source[i];
138            if (temp > sum){
139                sum = temp ;
140                start = flag-count;
141                end = i;
142            }

143        }

144        return sum;
145    }

146
147    public static int getStart() {
148        return start;
149    }

150
151    public static int getEnd() {
152        return end;
153    }

154}
posted on 2007-07-31 12:45 wqwqwqwqwq 阅读(833) 评论(0)  编辑  收藏 所属分类: Data Structure && Algorithm

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234




常用链接

留言簿(10)

随笔分类(95)

随笔档案(97)

文章档案(10)

相册

J2ME技术网站

java技术相关

mess

搜索

  •  

最新评论

阅读排行榜

校园梦网网络电话,中国最优秀的网络电话