天天看点

最大子序列的四种算法

最大子序列的四种算法

package Chapter1;

最大子序列的四种算法
最大子序列的四种算法

public class MaxSubSum {

最大子序列的四种算法

    /**

最大子序列的四种算法

     * Cubic maximun contiguous susequence sum algorithm.

最大子序列的四种算法

     */

最大子序列的四种算法

    public static int MaxSubSum1(int[] a) {

最大子序列的四种算法

        int maxSum = 0;

最大子序列的四种算法

        for (int i = 0; i < a.length; i++) {

最大子序列的四种算法

            for (int j = i; j < a.length; j++) {

最大子序列的四种算法

                int thisSum = 0;

最大子序列的四种算法
最大子序列的四种算法

                for (int k = i; k <= j; k++)

最大子序列的四种算法

                    thisSum += a[k];

最大子序列的四种算法
最大子序列的四种算法

                if (thisSum > maxSum)

最大子序列的四种算法

                    maxSum = thisSum;

最大子序列的四种算法

            }

最大子序列的四种算法

        }

最大子序列的四种算法
最大子序列的四种算法

        return maxSum;

最大子序列的四种算法

    }

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

     * Quadratic maximum contiguous subsequence sum algorithm.

最大子序列的四种算法
最大子序列的四种算法

    public static int maxSubSum2(int[] a) {

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

            int thisSum = 0;

最大子序列的四种算法
最大子序列的四种算法

                thisSum += a[j];

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

     * Resursive maximum contiguous subsequence sum algorithm. Finds maximum sum

最大子序列的四种算法

     * in subarray spanning a[left

最大子序列的四种算法

right]. Does not attempt to maintain actual

最大子序列的四种算法

     * est sequence.

最大子序列的四种算法
最大子序列的四种算法

    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++) {

最大子序列的四种算法
最大子序列的四种算法

            if (rightBorderSum > maxRightBorderSum)

最大子序列的四种算法

                maxRightBorderSum = rightBorderSum;

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

        return max3(maxLeftSum, maxRightSum, maxLeftBorderSum

最大子序列的四种算法

                + maxRightBorderSum);

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

     * Return the max of the three number.

最大子序列的四种算法

     * 

最大子序列的四种算法

     * @param a

最大子序列的四种算法

     *            the first number.

最大子序列的四种算法

     * @param b

最大子序列的四种算法

     *            the second number.

最大子序列的四种算法

     * @param c

最大子序列的四种算法

     *            the thrid number.

最大子序列的四种算法

     * @return the max of the three number.

最大子序列的四种算法
最大子序列的四种算法

    private static int max3(int a, int b, int c) {

最大子序列的四种算法

        if (a > b) {

最大子序列的四种算法

            if (a > c)

最大子序列的四种算法

                return a;

最大子序列的四种算法
最大子序列的四种算法

                return c;

最大子序列的四种算法

        } else {

最大子序列的四种算法

            if (b > c)

最大子序列的四种算法

                return b;

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

     * Driver for divide-and-conquer maximum contiguous subsequence sum

最大子序列的四种算法

     * algorithm

最大子序列的四种算法
最大子序列的四种算法

    public static int maxSubSum3(int[] a) {

最大子序列的四种算法

        return maxSumRec(a, 0, a.length - 1);

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

     * Linear-time maximum contiguous subsequence sum algorithm.

最大子序列的四种算法
最大子序列的四种算法

    public static int maxSubSum4(int[] a) {

最大子序列的四种算法

        int maxSum = 0, thisSum = 0;

最大子序列的四种算法
最大子序列的四种算法

        for (int j = 0; j < a.length; j++) {

最大子序列的四种算法

            thisSum += a[j];

最大子序列的四种算法

            if (thisSum > maxSum)

最大子序列的四种算法

                maxSum = thisSum;

最大子序列的四种算法

            else if (thisSum < 0)

最大子序列的四种算法

                thisSum = 0;

最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法
最大子序列的四种算法

}

最大子序列的四种算法

时间复杂度分别是:O(N3),O(N2),O(NlogN),O(N).

本文转自冬冬博客园博客,原文链接:http://www.cnblogs.com/yuandong/archive/2006/08/17/479690.html,如需转载请自行联系原作者

继续阅读