Maximum subarray problem

翻译 2017年09月09日 10:23:46

Maximum subarray problem:最大子数组问题,即找出一维数组中的最大和的连续子数组。
比如数组:−2, 1, −3, 4, −1, 2, 1, −5, 4,最大连续子数组是4, −1, 2, 1,和是 6。

问题最初由 Brown University 的 Ulf Grenander 提出,作为 maximum likelihood 最大相似度的数字图片的估算模型。
由 Carnegie Mellon University 的 Jay Kadane 给出了线性的时间复杂度的算法。

Kadane算法

Kadane 算法的思路是把 解决方案 拆分进 互斥 的集合中(disjoint)。
我们发现实际上每个解决方案的最后一个元素 i ,我们只需要检查哪个集合的最后一个元素的索引是1,哪个是2,哪个是3,以此类推,这个过程花费的时间是线性的。

可以用一个归纳问题开始学习Kadane 算法:如果我们知道最大子数组和的最后一个位置在 i(叫Bi),那么最大子数组和的最后一个位置的下一个位置是什么(也就是Bi+1 是什么)?
答案很简单:

  • 要么子数组和的最后一个位置在i+1,包括以最后一个位置在 i 的子数组作为前缀。
  • 要么不包括(也就是Bi+1 = max(Ai+1, Ai+1 + Bi)),而Ai+1 是 i+1位置上的元素。

这样的话,我们可以计算通过遍历数组计算出每个最后位置为i的子数组。我们只跟踪最大和。
可以用下面的代码实现:

int maxSubArray(int[] A)
{
int max_ending_here = A[0];
int max_so_far = A[0];
for(int i = 1; i < A.Length; i++)
{
max_ending_here = Math.Max(A[i], max_ending_here + A[i]);
max_so_far = Math.Max( max_so_far, max_ending_here);
}
return max_so_far;
}

注意:遍历到i的时候,max_ending_here 就是前面提到的Bi,而 max_so_far 就是 max (B0,B1,B2,B3,Bi)。

https://en.wikipedia.org/wiki/Maximum_subarray_problem

相关文章推荐

【算法导论学习-007】最大子数组和问题(Maximum subarray problem)

参考:算法导论P68      这是个经典问题。

Maximum_subarray_problem

leetcode上的题目:Best Time to Buy and Sell Stock 问题很简单,只不过想总结一下其中经典的一些解法。 有不同的O(n)时间复杂度的解法,比如遍历i=[0, n...

Linear-time algorithm for the maximum-subarray problem Java implementation

maximum-subarray problem可以用divide-and-conquer的算法求解,算法复杂度为O(nlgn),另外,还有一种更简单的复杂度为O(n)的方法: ...
  • peachpi
  • peachpi
  • 2011年12月20日 15:26
  • 3281

Starting with Algorithms(Part3)--The maximum-subarray problem

The maximum-subarray problem Giving an array A[1..n] which contains some negative numbers, then fin...

最大子树问题(The maximum-subarray problem)

最大子树问题(The maximum-subarray problem) 这是最大子树问题 Θ(nlgn) 的C语言实现代码...

最大子数组问题 Maximum Subarray

Maximum Subarray: algorithm这个问题我们先看下问题的描述:问题描述Find the contiguous subarray within an array (containi...

【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】

【053-Maximum Subarray(最大子数组和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Find the contiguous subarray wit...

Maximum Subarray-最大连续子数组和

Maximum Subarray

[LeetCode]Maximum Subarray

Write an efficient program to find the sum of contiguous subarray within a one-dimensional array of ...
  • jhbxlx
  • jhbxlx
  • 2014年09月25日 05:38
  • 443

LeetCode Maximum Product Subarray 解题报告

LeetCode 新题又更新了,最大子数组乘积 题目分析:求一个数组,连续子数组的最大乘积。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Maximum subarray problem
举报原因:
原因补充:

(最多只允许输入30个字)