最大子串行和問題求解與分析

2021-09-24 16:31:47 字數 1425 閱讀 8463

最大子串行和問題是要在

其中,最大子串行和的乙個優秀而巧妙的的求解演算法如下。

int max_subsequence_sum(const int a, int n)

return max_sum;

}

整個演算法僅有乙個for迴圈,因此複雜度不難理解為1、最大子串行和必定以非零非負數開頭。假設乙個包含負數的子串行為問題的解,則去掉開頭的負數豈不是得到乙個更大的子串行和,顯然與假設矛盾。如下圖,符合要求的子串行必定從第 2 個元素開始搜尋。

2、若this_sum大於max_sum,則將this_sum賦值給max_sum,表示找到乙個更大的子串行和。演算法的目的就是要找到最大的子串行和,因此第乙個if語句分支是合乎邏輯的。如下圖,子串行和15大於this_sum為3的當前子串行和。

3、若當前this_sum值小於0,則最大子串行和需要從下乙個位置重新開始搜尋。可以結合下圖進行理解。為便於理解,圖中元素值稍作改變。

搜尋到元素 -9 時,this_sum值變為負數,一定要從下乙個位置開始搜尋的原因是,this_sum此時對應的子串行的任何字尾子串行和必定為負數(0 + -7 + -9),因為字首子串行和在之前的搜尋過程中一直保持非負非零(3 + 12 + -2),既然字首子串行和非零非負,那麼字尾子串行和必定為負,才能使得當前this_sum為負。結合結論1可知,最大子串行和必須從下乙個位置開始搜尋,if語句第二個分支成立。

4、若this_sum的值減小但其值依然大於等於0,則不做任何處理。這裡的疑問可能是:為什麼不需要做任何處理?我們通過下圖進行分析。

如圖,此時this_sum是13,而上一次迴圈this_sum值為15,下一步無非是游標向前還是向後的問題。游標向前,說明最大子串行可能以12開頭,這是不可能的,因為12之前的子串行和必定大於0,因此最大子串行不可能以12開頭,游標只能向後滑動。繼續向前搜尋有兩種情況,一是觸發this_sum小於等於0的情況(if語句第2個分支);二是發現更大的乙個最大子串行和(if語句第個分支)。

這是乙個看似簡單但理解其正確性卻比較困難的乙個演算法,需要多加思考和總結該演算法解決問題的方式和方法,在自己設計演算法的時候,能舉一反三加以利用。

最大子串行和問題求解

基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...

求解最大子串行和問題

原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...

最大子串行和問題的求解

問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...