標籤:port unittest ada def 演算法 git __name__ logs 時間複雜度
最大連續子數組和(最大子段和)
問題: 給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。
-- 引用自《百度百科》
環境
1.窮舉法
Coding
def enumerate_arrays(numbers): max_sum = numbers[0] num_len = len(numbers) for i in range(num_len): tmp_sum = numbers[i] max_sum = max(tmp_sum, max_sum) for j in range(i + 1, num_len): tmp_sum += numbers[j] max_sum = max(tmp_sum, max_sum) return max(0, max_sum)
枚舉所有連續子數組,分別求和,找出最大的和,時間複雜度為\(O(n^2)\)
2.Kadane演算法
Coding
def kadane_solve(numbers): max_sum = numbers[0] tmp_sum = 0 for i in numbers: if tmp_sum < 0: tmp_sum = i else: tmp_sum += i max_sum = max(tmp_sum, max_sum) return max(0, max_sum)
如果累加值為負數,用新讀入的值覆蓋累加值,否則繼續累加,時間複雜度為\(O(n)\)
測試案例
Coding
import unittestfrom homework.a.a import enumerate_arraysfrom homework.a.a import kadane_solveclass TestA(unittest.TestCase): def testEnumerate(self): num1 = [-2, 11, -4, 13, -5, -2] num2 = [1, 2, 3] num3 = [-1, -2] num4 = [1] self.assertEqual(enumerate_arrays(num1), 20) self.assertEqual(enumerate_arrays(num2), 6) self.assertEqual(enumerate_arrays(num3), 0) self.assertEqual(enumerate_arrays(num4), 1) def testKadane(self): num1 = [-2, 11, -4, 13, -5, -2] num2 = [1, 2, 3] num3 = [-1, -2] num4 = [1] self.assertEqual(kadane_solve(num1), 20) self.assertEqual(kadane_solve(num2), 6) self.assertEqual(kadane_solve(num3), 0) self.assertEqual(kadane_solve(num4), 1)if __name__ == ‘__main__‘: unittest.main()
用題目中提供的測試案例和全為正數,全為負數,單個數進行測試
測試結果
,測試通過
鍵入命令:
python -m tests.test_a
,測試通過
軟體工程第三次個人作業 - 最大連續子數組和