算法分析——最大连续子序列和的问题
来源:互联网 发布:excel筛选重复数据公式 编辑:程序博客网 时间:2024/06/05 15:06
最大连续子序列求和问题
问题引出:
给定整数A1,A2,A3···AN(可能有负数),求解的最大值。如果所有的整数全是负数,则最大连续子序列的和为零。
举个例子,如果输入{-2,11,-4,13,-5,2},那么答案是20,它代表的连续序列是从第2项至第4项。再举一个例子,输入为{1,-3,4,-2,-1,6},那么答案是7,这个子序列包括最后4项。
·简单的O(N3)算法
·改进的O(N2)算法
·线性算法
设Ai,j是任意一个子序列,它包含的元素从i到j,设Si,j是Ai,j的和。
则有如下结论:
1.设Ai,j是任意Si,j < 0的序列,如果q > j ,那么Ai,q 肯定不是最大连续子序列。(因为如果Si,j < 0,那么最大连续子序列完全可以排除Ai,j 这些元素,取之后的人一个非负元素作为最大连续子序列)
2.对于任意i,设Ai,j 是一个序列,且Si,j < 0 ,那么,对于任意i <= p <= j ,且 p <= q, 那么Ap,q要么不是最大连续子序列的和,要么等于已出现的最大连续子序列。
证明如下:
如果 p = i,则应用结论1 。否则,有Si,q = Si,p-1 + Sp,q 。因为Si,j < 0 ,j是最低的下标,所以Si,p-1 >= 0。因此Sp,q <= Si,q 。当q > j时,有结论1知,Ai,q 不是最大连续子序列,而由Sp,q <= Si,q 得知,Ap,q也不是最大连续子序列。如果q <= j,则Ap,q 的和最多与已出现的子序列Ai,q 的和相等。
据以上两个结论,可以得到优化的线性算法
package com.zgy.datastructures.maxsubsequence;/** * * @author yaguanzhou * @version 1.0 * */public class MaxSubSequence {public static int start = 0;public static int end = 0;public static void main(String[] args) {int[] testArray = { 1, -3, 8, 11, -5, 21, 19, -20 };int max_n3 = maxSubSequenceSum_N3(testArray);System.out.println("最大子序列:" + "从 第" + (start + 1) + "到第" + (end + 1)+ "个元素,子序列的和为:" + max_n3);int max_n2 = maxSubSequenceSum_N2(testArray);System.out.println("最大子序列:" + "从 第" + (start + 1) + "到第" + (end + 1)+ "个元素,子序列的和为:" + max_n2);int max_n1 = maxSubSequenceSum_N1(testArray);System.out.println("最大子序列:" + "从 第" + (start + 1) + "到第" + (end + 1)+ "个元素,子序列的和为:" + max_n1);}/** * 此方法的时间复杂度为N的3次方 * * @param int[] arr * @return maxSum */public static int maxSubSequenceSum_N3(int[] arr) {int maxSum = 0;// 最大子序列的和for (int i = 0; i < arr.length; i++) {// 从数组中的第一个元素开始循环for (int j = i; j < arr.length; j++) {// 从当前元素开始,叠加其后的元素int currentSum = 0;for (int k = i; k <= j; k++) {// 从当前元素开始叠加到其后特定位置上的元素currentSum += arr[k];}if (currentSum > maxSum) {maxSum = currentSum;start = i;end = j;}}}return maxSum;}/** * 此方法的时间复杂度为N的2次方 * * @param int[] arr * @return maxSum */public static int maxSubSequenceSum_N2(int[] arr) {int maxSum = 0;// 最大子序列的和for (int i = 0; i < arr.length; i++) {// 从数组中的第一个元素开始循环int currentSum = 0;for (int j = i; j < arr.length; j++) {// 从当前元素开始,叠加其后的元素currentSum += arr[j];if (currentSum > maxSum) {maxSum = currentSum;start = i;end = j;}}}return maxSum;}/** * 此方法的时间复杂度为O(N) * * @param int[] arr * @return maxSum */public static int maxSubSequenceSum_N1(int[] arr) {int maxSum = 0;// 最大子序列的和int currentSum = 0;for (int i = 0, j = 0; j < arr.length; j++) {// 从数组中的第一个元素开始循环currentSum += arr[j];if (currentSum > maxSum) {maxSum = currentSum;start = i;end = j;} else if (currentSum < 0) {//如果叠加得到和小于0,则舍弃之前的元素,往后继续叠加i = j + 1;currentSum = 0;}}return maxSum;}}
输出:
最大子序列:从 第3到第7个元素,子序列的和为:54最大子序列:从 第3到第7个元素,子序列的和为:54最大子序列:从 第3到第7个元素,子序列的和为:54
1 0
- 算法分析——最大连续子序列和的问题
- 连续子序列最大和问题的分析
- 连续子序列最大和问题的分析
- 最大连续子序列和的问题
- 算法设计与分析——动态规划方法求解序列的连续最大子段和
- 算法设计与分析——动态规划方法求解序列的连续最大子段
- 数据结构与算法分析——最大的子序列和问题
- [数据结构]连续子序列最大和,最大积的问题
- 最大子序列和的算法分析
- 【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现
- 算法题/最大连续子序列和
- 经典算法——连续子数组最大和问题
- 连续子序列最大和的各种算法
- 最大连续子序列和的O(n)算法
- 连续最大子序列和的几种算法
- 轰炸问题、连续子序列的积、n个最大连续子序列和
- 连续子序列最大和问题
- 连续子序列和最大问题
- php的异步非阻塞开发
- php执行流程相关
- 【思想感悟】2015年终总结
- 【iOS】自定义TabBarController
- 使用杂记
- 算法分析——最大连续子序列和的问题
- php小分点
- json解析之gson解析
- [android]_[webView]
- word 的使用(五)
- 从摄像头或视频文件中读取视频流并显示
- hdu1753 大明A+B
- java_patest乙级真题1002. 写出这个数 (20)
- C++多线程操作(火车售票系统线程同步)