最大子段和问题的四种算法(暴力法、优化后的暴力法、分治算法、动态规划算法)
2017-11-20 00:27
676 查看
import java.util.Random; import java.util.Scanner; public class maxSum { public static void main(String[] args){ Scanner scan = new Scanner(System.in); Random rd = new Random(); System.out.println("请输入数据规模n(10的倍数):"); int n = scan.nextInt(); int[] a = new int ; for(int i=0; i<n; i++){ a[i] = rd.nextInt(20)-10; }//初始化数组,生成-10~10的随机数 /* * test暴力法 */ long startMili1 = System.currentTimeMillis(); maxSum ms1 = new maxSum(); System.out.println("最大子序列和:" + ms1.maxSum(a)); long endMili1 = System.currentTimeMillis(); System.out.println("暴力法总耗时:"+ (endMili1 - startMili1)); /* * test优化后的暴力法 */ long startMili2 = System.currentTimeMillis(); maxSum ms2 = new maxSum(); System.out.println("最大子序列和:" + ms2.maxSumBF(a)); long endMili2 = System.currentTimeMillis(); System.out.println("总耗时:"+ (endMili2 - startMili2)); /* * test分治算法 */ long startMili3 = System.currentTimeMillis(); maxSum ms3 = new maxSum(); System.out.println("最大子序列和:" + ms3.maxSumFZ(a)); long endMili3 = System.currentTimeMillis(); System.out.println("总耗时:"+ (endMili3 - startMili3)); /* * test动态规划算法 */ long startMili4 = System.currentTimeMillis(); maxSum ms4 = new maxSum(); System.out.println("最大子序列和:" + ms4.MaxSumDynamic(a)); long endMili4 = System.currentTimeMillis(); System.out.println("总耗时:"+ (endMili3 - startMili3)); } //暴力法(O(n^3)) public static int maxSum(int a[]){ int n = a.length - 1; int sum = 0; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ int thissum = 0; for(int k=i; k<=j; k++){ thissum += a[k]; } if(thissum>sum){ sum = thissum; } } } return sum; } //优化后的暴力法 (O(n^2)) public int maxSumBF(int a[]){ int n = a.length - 1; int sum = 0; for(int i=1; i<=n; i++){ int thissum = 0; for(int j=i; j<=n; j++){ thissum += a[j]; if(thissum>sum){ sum = thissum; } } } return sum; } //分治算法(n log(n)) private static int maxSubSum(int a[], int left, int right){ int sum = 0; if(left == right){ sum = a[left]>0?a[left]:0; }else{ int center = (left + right)/2; int leftsum = maxSubSum(a,left,center); int rightsum = maxSubSum(a,center+1,right); int s1 = 0; int lefts = 0; for(int i=center; i>=left; i--){ lefts += a[i]; if(lefts>s1){ s1 = lefts; } } int s2 = 0; int rights = 0; for(int i=center+1; i<=right; i++){ rights += a[i]; if(rights>s2){ s2 = rights; } } sum = s1 + s2; if(sum<leftsum){ sum = leftsum; } if(sum<rightsum){ sum = rightsum; } } return sum; } public static int maxSumFZ(int a[]){ return maxSubSum(a,1,a.length-1); } //动态规划算法(O(n)) public static int MaxSumDynamic(int a[]){ int n = a.length-1; int sum = 0,b = 0; for(int i=1; i<=n; i++){ if(b>0){ b += a[i]; }else{ b = a[i]; } if(b>sum){ sum = b; } } return sum; } }
相关文章推荐
- 从最大子段和问题看算法的优化问题
- 从最大子段和问题看算法的优化问题
- 从最大子段和问题看算法的优化问题
- 从最大子段和问题看算法的优化问题
- 最大子段和问题的分治算法和动态规划算法
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 动态规划算法--蛮力算法求最大子段和
- 【算法】最大子段和问题
- 动态规划算法--蛮力算法求最大子段和
- 【算法设计与分析】最大子段和问题
- C++解决最大子列和问题,算法时间复杂度优化
- 动态规划算法--蛮力算法求最大子段和
- 最大子矩阵问题;枚举行的组合,然后利用一维最大子段和的DP算法;
- 算法分析与设计-10- 最大子段和的动态规划算法
- HDU1024 最大M子段和问题 (单调队列优化)
- 三种算法求最大子段和问题——Java实现
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 算法设计与分析不定期更新的日常之最大子段和四种方法
- 【算法设计】最大子段和问题解析(对应算法第三题)
- 最大子段和问题(暴力 分治 动规)