1. 程式人生 > >軟件工程第三次個人作業 - 最大連續子數組和

軟件工程第三次個人作業 - 最大連續子數組和

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

技術分享圖片

如圖所示,測試通過

軟件工程第三次個人作業 - 最大連續子數組和