最大子數列問題之Kadane演算法

2021-10-03 17:30:17 字數 767 閱讀 8388

最大子數列問題的目標是在數列的一維方向找到乙個連續的子數列,使該子數列的和最大。例如,對乙個數列[-2, 1, -3, 4, -1, 2, 1, -5, 4],其中連續子數列中和最大的是[4, -1, 2, 1],其和為6。該問題最初是由ulf grenander教授在2023年提出的,直到2023年才由jay kadane提出了該問題的線性演算法,該演算法雖然長度很短,但其實並不容易理解。

在正式介紹演算法之前讓我們來分析一下這個問題。我們先將問題進行拆分,指定陣列中某個元素nums[i](假設求值最大子數列問題的陣列為nums)作為最大子數列的末尾元素時,能找到的最大子數列的值是多少?我們會發現nums[i]作為末尾元素時,最大子數列問題的值必然是num[i]本身或者是nums[i-1]作為末尾元素時能找到的最大子數列再拼接上nums[i](當以nums[i-1]作為末尾元素時能找到的最大子數列問題的值為負數時,此時以nums[i]作為末尾元素的最大子數列問題的值就是nums[i]本身)。那麼我們是不是只需要從頭到尾遍歷一遍陣列,依次計算出每個位置的元素nums[i]作為末尾元素時能找到的最大子數列問題的值,即可找到全域性的最大子數列的值。

我們來看看**:

public int maxsubarray(int nums) 

return maxsofar;

}

**中,maxendinghere表示以元素nums[i]結尾時最大子數列問題的值,maxsofar表示遍歷到nums[i]時,求得的全域性最大子數列問題的值。

參考:清晰解題: 尋找最大子數列-kadane演算法.

(環形)最大子串行和,Kadane演算法的字首和解釋

在kadane演算法中,問題是求以下標i結尾的最大子串行和,換句話說,我們想找到cur pre fcur pref cur pr ef的最大值,其中cur curcu r是 0,i 0,i 0,i 所有元素的和,pref是 0,j 0,j 0,j 所有元素的和,其中j j i,所以想要cur pre...

最大子向量問題

問題 在乙個有n個 浮點數的向量 x中找出最大子向量,輸出最大子向量的和。該問題在 程式設計珠璣 第八章中進行了詳細說明,下面列出 程式設計珠璣 中5種演算法的比較,並對最好的演算法進行說明。maxsofar 0 maxendinghere 0 for i 0,n 上述 為演算法5的偽 其思想是 在...

最大子陣列問題

顧名思義,最大子陣列問題是求乙個陣列array中 和最大的非空連續子陣列 這樣的連續子陣列我們叫做最大子陣列,它的應用也有 很多,比如說找出時間序列中兩個時間節點使得這兩個時間節點對應的值的落差最大,如下圖 對於這類問題,通過求原始時間序列的一階差分得到序列array,此時求得array的最大子陣列...