問題如下,在這串連續數列中 : -7、8、2、9、3、-4、-8、7、9、-5,請找出最大的子序列之和、以及最小的子序列之和,求最大子序列和 ~ MaxSubSum,是用途很廣的敘述統計工具,例如應用於求解 MDD、描述價格資料期間內最大的累積上漲點數...等
Kadane's 提供的算法邏輯如下 :
1. 該元素如果是負值,就不是子序列起點;
2. 同理,子序和為負值亦不列入集合內
僅需兩個判斷條件,即可建構程式碼求解
Excel VBA程式碼提供如下
Public Function MaxSubArraySum(ByVal InputData As Range, ByVal Output As Variant) As Variant
'Output=1 求解最大子序列和
'Output=-1 求解最小子序列和
Dim ArrDataX() As Variant
Dim DataCount As Variant
Dim ii As Variant
Dim thisSum As Variant
Dim MaxSum As Variant
ArrDataX = InputData '抓取Excel 欄位的數據,存入VBA控制的陣列
DataCount = InputData.Count '記錄抓取的資料筆數
thisSum = 0
MaxSum = 0
For ii = 1 To DataCount
thisSum = thisSum + (Output) * ArrDataX(ii, 1)
If thisSum > MaxSum Then MaxSum = thisSum
If thisSum < 0 Then thisSum = 0
Next 'For ii = 1 To DataCount
MaxSubArraySum = (Output) * MaxSum '求解最大子序列和
End Function