分而治之:最大子数组问题
问题:
给出一个数组,找到一个子数组(连续的),使得该子数组的元素和是最大的。
输入:
给定一个数组X[1…n],对于任意一对数组下标为l,r(l≤r)的非空子数组,其和记为S(l,s).
输出:
求出S(l,s)的最最值,记为Smax .
问题分析
- 将数组X[1…n]分为X[1…n/2]和X[n/2 +1…n]
- 递归求解子问题
S1∶数组X[1…n/2]的最大子数组
S2∶数组X[n/2+1…n]的最大子数组 - 合并子问题,得到Smax
S3∶跨中点的最大子数组
数组X的最太子数组之和Smax =max{S1,sz,s3}
执行效率的瓶颈值在合并方面,也就是S3的求解问题。
S3的求解:
-
记mid = n/2
-
S3可分为左右两部分
Left:以X[mid]为结尾的最大子数组之和
Right:以X[mid+1]为开头的最大子数组之和
S3 = Left + RightLeft的求解:
从X[mid]向前遍历求和,并记录最大值
Right的求解:
从X[mid +1]向后遍历求和,并记录最大值
S3的时间复杂度:
- Left时间复杂度:O(mid)
- Right时间复杂度:O(n - mid)
- S3时间复杂度:O(n)
算法分析图
代码