使用分治算法 解决最大子序列求和问题(Java语言实现)
算法问题描述
给定一个数组,通过程序得到其中连续索引上值的最大和
算法分析过程
问题描述很简单,对于该问题本身,最容易想到的是暴力法,直接两次循环算出数组的每一个子数组的和,然后返回其中的最大值,这种实现的时间复杂度是O(N2),这对于少量输入来说,是可以接受的。但算法,肯定是时间上越短越好,空间上占用的内存越少越好,所以为了效率的提高,分治算法是一个很好的解决办法。
分治算法的思想是将一个大的问题分解成小的问题,然后得到这些小问题的解法之后,将它们组合成大问题的解法。
对于数组来说,其连续索引的值的最大和会出现在三个地方,数组的左边,数组的右边,和数组的中间部分。乍一看好像这是废话,但这就是我们要分解问题的思路。我们可以将数组分解成两个部分,左半部和右半部,然后递归地去计算两个子数组的连续最大和,所以我们在调用方法的时候需要传入上下两个边界。然后对于中间的部分,我们需要额外在每一次递归中进行计算。通过中间向两侧遍历,记录住得到的最大和。然后对于递归的情形,我们要定义好它的基准情形(base case), 当上边界和下边界相等时,说明程序已经递归到只有一个元素的子数组了,这时如果值大于0就返回,小于0则不选中。(这里我们定义,如果数组中所有的元素都是负数,则连续最大子序列为空,返回0)