分治——最大子数组问题

来源:互联网 发布:遭受网络攻击 损失 编辑:程序博客网 时间:2024/06/06 19:08

代码

public class Max {    private static int max ( int [] a, int left, int right ){        //如果只有一个元素        if ( left == right )                        if ( a[left] > 0 )                return a[left];            else return 0;        //以下分解递归        int mid = ( left + right ) / 2;        int leftSum = max( a, left, mid );                   int rightSum = max( a, mid + 1, right );        //求跨越中轴的最大值        int leftMax = 0, leftBorder = 0;        for ( int i = mid; i >= left; i--) {            leftBorder += a[i];            if ( leftBorder > leftMax )                 leftMax = leftBorder;        }        int rightMax = 0, rightBorder = 0;        for ( int i = mid + 1; i <= right; i++) {            rightBorder += a[i];            if ( rightBorder > rightMax )                 rightMax = rightBorder;        }        int crossingSum = leftMax + rightMax;        //返回三者最大值        return max3( crossingSum, leftSum, rightSum );    }     private static int max3( int crossingSum, int leftSum, int rightSum ) {        int max = leftSum > rightSum ? leftSum : rightSum;         max = max > crossingSum ? max : crossingSum;        return max;    }    //测试    public static void main( String [] args) {        int [] a = { 4, -3, 5, -2, -1, 2, 6, -2};        System.out.print( max( a, 0, a.length - 1 ) );    }}

输出结果

11

分治算法简要分析

列出递归式 T(n) = 2T(n/2) + θ(n) ,
可以使用递归树、主方法等算出时间即 θ(n log n),不再赘述。

原创粉丝点击