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 閱讀(849) 評(píng)論(0)  編輯  收藏 所屬分類: Data Structure && Algorithm
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234




          常用鏈接

          留言簿(10)

          隨筆分類(95)

          隨筆檔案(97)

          文章檔案(10)

          相冊(cè)

          J2ME技術(shù)網(wǎng)站

          java技術(shù)相關(guān)

          mess

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          校園夢(mèng)網(wǎng)網(wǎng)絡(luò)電話,中國(guó)最優(yōu)秀的網(wǎng)絡(luò)電話
          主站蜘蛛池模板: 贵溪市| 裕民县| 连山| 通州区| 丰县| 闸北区| 民丰县| 仪陇县| 如东县| 宣城市| 吉木萨尔县| 平安县| 汉寿县| 台东县| 万年县| 英超| 资溪县| 孟连| 芦溪县| 蓝山县| 镇远县| 白银市| 方正县| 涟水县| 文登市| 兴业县| 泽库县| 中西区| 工布江达县| 勃利县| 淄博市| 肇源县| 林西县| 清涧县| 简阳市| 定南县| 成安县| 贵定县| 天长市| 湘西| 新丰县|