軟件工程第三次個人作業 - 最大連續子數組和
阿新 • • 發佈:2018-03-28
class http pos 窮舉法 markdown 數組 lin ima odin
最大連續子數組和(最大子段和)
問題: 給定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。
-- 引用自《百度百科》
環境
語言: python 3.6
集成開發環境: PyCharm 2017.3
操作系統: Arch Linux 內核版本 4.15.12
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 unittest
from homework.a.a import enumerate_arrays
from homework.a.a import kadane_solve
class 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()
用題目中提供的測試用例和全為正數,全為負數,單個數進行測試
測試結果
- 在PyCharm中:
如圖所示,測試通過
- 在終端中:
鍵入命令:
python -m tests.test_a
如圖所示,測試通過
軟件工程第三次個人作業 - 最大連續子數組和