最大子陣列問題(Maximum subarray problem)

Britjeans發表於2018-06-09

參考:Wikipedia

最大子陣列問題就是在一個一維的陣列中找到和最大的一個連續的子陣列。給定的陣列一般包括正數負數和0。

這個問題的一些屬性如下:

1. 如果陣列內的所有元素非正,那麼問題的解就是其中最大的一個元素。

2. 如果陣列內所有的元素非負,那麼問題的解就是所有元素之和。

3.  空的集合是無效的。

4. 可以有多個子集能得到最大和。

解決這類問題的方法包含以下幾種:暴力求解,分治策略,動態規劃。


分治策略(Divide and Conquer)

原理:將陣列分成前後兩個部分,A[lo,hi]的任意連續子陣列可以分成以下三種情況

1. 完全位於子陣列A[lo,mi]之間。

2. 完全位於子陣列A[mi+1,mi]之間。

3. 跨越了中點mi。

這樣我們只需要找出兩邊的子陣列,並按照一定規則合併即可。


Kandane's algorithm

原理:令以i位置為末尾的子陣列中的最大和子陣列為B(i),則B(i+1)=max(A(i+1),A(i+1)+B(i)),其中A(i+1)是i+1處的元素。

依據遞推公式我們可以得到以下程式碼。

def max_subarray(A):
    max_ending_here = max_so_far = A[0]
    for x in A[1:]:
        max_ending_here = max(x, max_ending_here + x)
        max_so_far = max(max_so_far, max_ending_here)
    return max_so_far

相關文章