分治——最大子数组问题
2017-07-12 21:33
232 查看
代码
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),不再赘述。
相关文章推荐
- 最大子数组问题的分治求解算法
- 分治策略——最大子数组问题
- 第四章 分治策略——最大子数组问题
- 第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)
- 分治策略之最大子数组问题
- 分治策略算法之最大字数组和问题
- 【算法学习】最大子数组问题的分治法求解
- 算法导论之分治策略:最大子数组问题
- 第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)
- 【算法设计-分治】最大子数组问题
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 分治策略之最大子数组问题
- 第四章 4.1最大子数组问题(分治)
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 第4章:分治策略 ——最大字数组问题
- [置顶] 算法导论学习:分治策略之最大子数组问题
- 分治策略之最大子数组问题
- 算法导论:分治策略__最大子数组问题
- 分治策略 | 最大子数组问题
- 算法导论C语言实现: 分治策略 -- 最大子数组问题