`
cm14k
  • 浏览: 31404 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

最大子段和(三)

阅读更多

最大子段和问题

解法三:

算法分析:


对于序列a,设j代表当前序列的终点,i代表当前序列的起点

分析:如果a[i]是负的,那么它不可能是最大子段的起点,因为任何包含a[i]为起点的子段都可以通过
         用a[i+1]为起点而得到改进。类似的,任何负的子段都不可能是最优子段的前缀(原理相同).
         如果在循环中检测到a[i]到a[j]的子段是负的,那么可以推进i.

结论:不仅能把i推进到i+1,而且可以一直推进到j+1.
原因:令p为i+1和j之间的任一下标。开始于下标p的任意子段都不大于从下标i开始并包含从a[i]到a[p-1]的子段,

        因为a[i]到a[p-1]这个子段不是负的(j是使得从下标i开始,其值成为负值序列的第一个下标)

 

算法实现:

public class MaxSum 
{
	public static int maxSubSum(int[] a)
	{
		int maxSum = 0;
		int thisSum = 0;

		for (int j = 0; j < a.length; j++)
		{
			thisSum += a[j];
			if (thisSum > maxSum)
			{
				maxSum = thisSum;
			}
			else if (thisSum < 0)
			{
				thisSum = 0;
			}
		}

		return maxSum;
	}
	public static void main(String[] args) 
	{
		int[] a = {-2, 11, -4, 13, -5, -2};
		System.out.println(MaxSum.maxSubSum(ar));
	}
}

算法的优点:

1)运行时间最短;

2)而且只对数据进行一次扫描,一旦a[i]被读入并被处理,它就不在需要被记忆;

3)在任何时刻,算法都能对已读入的数据给出该问题的正确答案;

分享到:
评论

相关推荐

    python求最大子段和(动态规划法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    最大子段和/三种方法/c++

    在提供的压缩包中,"最大子段和..cpp"很可能是C++实现这三个方法的源代码,而"最大子段和.doc"可能包含对该问题的详细报告,包括算法描述、性能分析以及可能的测试用例和随机输入数据的结果比较。通过阅读和分析这些...

    最大子段和

    最大子段和问题是一个经典的计算机科学问题,它涉及到在给定的一序列整数中找到一个连续子序列,使得这个子序列的和最大。这个问题在数组处理、数据分析和算法设计等领域有广泛的应用。本文将深入探讨三种不同的解决...

    最大子段和问题 蛮力法 分治法 动态规划法

    最大子段和问题是一个经典的计算机科学中的算法问题,它的目标是找到一个整数数组中连续子数组的最大和。这个问题在很多实际应用中都有所体现,比如在数据分析、股票投资策略等领域。下面我们将深入探讨解决这一问题...

    算法设计实验报告-求最大子段和问题

    算法设计实验报告,包括:蛮力法、分治法和减治法求最大子段和问题各自的基本思想、时间复杂度分析,C++实现代码,三种算法运行时间的比较,运行截图,实验心得。

    最大子段和的分治法源程序和PPT

    最大子段和问题是一个经典的计算机科学问题,它在数组或序列中寻找连续子序列的和,使得这个和最大。在给定的标题“最大子段和的分治法源程序和PPT”中,我们可以了解到这是一个关于如何使用分治算法解决最大子段和...

    python求最大子段和(分冶递归法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    最大子段和-分治法

    - 返回这三个值中的最大值作为当前数组的最大子段和。 #### 代码解析 下面是给定的部分代码示例,用于解决最大子段和问题。 ```c #include #include // 函数声明 int max_sum(int a[], int left, int right); ...

    最大子段和及其升级版

    #### 4.2 三维最大子段和实例分析 以题目HOJ2555“Eating Watermelon”为例,我们可以将其转化为三维数组的问题。具体来说,定义`rec[x][y][z]`表示当水平切片为`z`时,位于坐标`(x, y)`处的最大子段和。这里的状态...

    最大子段和问题的三种算法

    最大子段和问题是一个经典的计算机科学问题,主要目标是找到一个整数数组中连续子序列的最大和。这个问题在算法设计和分析中具有重要的地位,因为它可以作为其他更复杂问题的基础。接下来,我们将深入探讨如何使用蛮...

    vc++算法实现最大子段和

    ### vc++算法实现最大子段和 在计算机科学与编程领域中,求解最大子段和问题是一项常见的任务。该问题通常涉及一个整数数组,目的是找到数组中的一个连续子数组,使得该子数组的元素之和达到最大值。本篇文章将通过...

    最大子段和问题、算法实现

    最大子段和问题是一个经典的计算机科学问题,主要探讨在给定的一序列整数中找到具有最大和的连续子序列。这个问题在数据结构和算法领域有着广泛的应用,例如在股票交易策略、赌博策略优化以及数组中查找有利片段等...

    最大子段和简介.pdf

    ### 最大子段和简介 #### 一、概念解析 最大子段和(Maximum Subarray Sum)是指在一个给定的数组中寻找一个连续的子数组(子段),使得该子数组的所有元素之和达到最大值。这是一个经典的计算机科学问题,在算法...

    蛮力法分治法动态规划法求最大子段和

    因此,我们需要递归地计算左半部和右半部的最大子段和,同时计算跨越中间点的最大子段和,最后返回这三个值中的最大者。这种方法的时间复杂度为O(nlogn),比蛮力法更高效,尤其在处理大规模数据时优势明显。 ### 三...

    最大子段和原理&java代码题解.pdf

    对于最大子段和问题,分治法的核心思想是将数组分为左右两部分,递归地求解左右两部分的最大子段和,同时还需要考虑跨越中间位置的最大子段和。 1. 将数组从中间位置分成两部分。 2. 递归地求解左半部分和右半部分...

    最大子段和问题实验报告.pdf

    在最大子段和问题中,序列被划分为两半,分别求解两半的最大子段和,再比较三个情况(左右两半独立的最大子段和,以及跨越中间元素的最大子段和)中的最大值。分治法的时间复杂度优于蛮力法,可以达到O(n log n)。 ...

    分治算法 最大子段和 MATLAB代码

    %divide——将数组分成两段 %conquer——每段分别求最大字段和 %combine——最大子段和无非三种情况:左端、右端、横跨中间 %每段分别求最大子段和的时候采用递归调用

Global site tag (gtag.js) - Google Analytics