最大子数组的两种解法
本文将用两种方法来求解此问题,一种是暴力求解法,一种是分治算法。
以一个简单的例题说明
有下表数组,求解其最大子数组:
数值 | 2 | -1 | -3 | 4 | 3 | 4 | -6 | 7 |
---|---|---|---|---|---|---|---|---|
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
可以看出,该数组的最大子数组为4~8,值为12
说明:(1,5)表示子数组1~5,值为5
下面以计算机思维求解
暴力求解
- max
={(1,1) (1,2) (2,2)}
=(1,1) 值为2 - max
={(1,1) (1,3) (3,3)}
=(1,1) 值为2 - max
={(1,1)(1,4)(4,4)}
=(4,4) 值为4 - max
={(4,4)(4,5)(5,5)}
=(4,5) 值为7 - max
={(4,5)(4,6)(6,6)}
=(4,6) 值为9 - max
={(4,6)(4,7)(7,7)}
=(4,6) 值为11 - max
={(4,6)(4,8)(8,8)}
=(4,8) 值为12
即最大子数组为4~8,数值为12
分治算法求解
平分成4分
数值 | 2 | -1 | -3 | 4 | 3 | 4 | -6 | 7 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||||||||
比较 | max{(1,1)(1,2)(2,2)} | max{(3,3)(3,4)(4,4)} | max{(5,5)(5,6)(6,6)} | max{(7,7)(7,8)(8,8)} | |||||||||||||
结果 | (1,1) | (4,4) | (5,6) | (8,8) | |||||||||||||
比较 | max{(1,1)(4,4)(1,4)} | max{(5,6)(8,8)(5,8)} | |||||||||||||||
结果 | (4,4) | (5,8) | |||||||||||||||
比较 | max{(4,4)(5,8)(4,8)} | ||||||||||||||||
结果 | (4,8) |
则最大子数组为4~8,值为12.