問題—— 給定
n個整數(有可能是負數)
a1,a2,a3,a4...an
,求最大子串行和。
(子串行必須是連續的);比如,對於輸入,
-2,11
,-4,13,-5
,-2;這個序列,
答案是20,即從a2到
a4。對於這個問題,你怎麼想的呢?下面有四種解法,看看你的解法是不是其中之一。
解法一、窮舉
解題思路——
既然是求某乙個連續的子串行的最大和,那麼我們把所有的子串行的和都加一遍,然後用乙個變數來儲存最大的和值,當遍歷一遍所有子串行,即可得到最大的和。由於這個子串行長度可以是
1,也可以是
n,因此需要三重迴圈。
具體程式——
private static int calone(int list)
if (thissum > maxsum)
} }return maxsum;
}
測試——
為了測試其效能,構建大量資料比較耗費時間,所以這裡我讓它重複計算某乙個陣列
1萬次。
public static void main(string args) ;
long time = system.currenttimemillis();
for (int i = 0; i < 9999; i++)
system.out.println(calone(test));
}
結果是:
1790
明顯,三重迴圈,其執行時間是
o(n^3);
解法二、改進的窮舉
通過觀察,我們發現,其實第三重迴圈是不必要的,因為第二次迴圈已經計算了第三次迴圈的數值,因此可以撤銷。
private static int caltwo(int list)
} }return maxsum;
}
撤銷後的時間復制度是o(
n^2)
,我們來看執行時間。
1790
確實減少了不少時間,但是這還是很差勁的窮舉演算法,需要改進。
解法三、聯機演算法
聯機演算法優缺點——
在任意時刻,演算法對要操作的資料唯讀入(掃瞄)一次,一旦被讀入並處理,它就不需要在被記憶了。而在此處理過程中演算法能對它已經讀入的資料立即給出相應子串行問題的正確答案。具有這種特性的演算法叫做聯機演算法(
on-line algorithm)。
該演算法僅需要常量空間並以線性時間執行,因此聯機演算法幾乎是完美的演算法。
優點:占用空間少,所用時間少
缺點:不宜設計,正確性不易觀察,同時附加保留資訊較少
具體程式——
private static int calthree(int list) else if(thissum <0)
} return maxsum;
}
可以看到,聯機演算法的時間複雜度是
o(n)
,節省了很多時間。執行驗證下。
同樣地計算一組資料
1萬次,結果是——
1790
關於這個問題,還有一種分治策略的演算法,雖然不如聯機演算法,但是比起差勁的窮舉,還是改進不少的。
以上是個人的讀書筆記,書籍為《資料結構與演算法描述》。歡迎**。
求最大子串行和演算法
這是個比較經典的c語言演算法問題。記得,在大二參加c語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...
演算法筆記1 最大子串行和問題的求解
問題 給定n個整數 有可能是負數 a1,a2,a3,a4.an 求最大子串行和。子串行必須是連續的 比方,對於輸入,2,11 4,13,5 2。這個序列,答案是20,即從a2到 a4。對於這個問題,你怎麼想的呢?以下有四種解法,看看你的解法是不是當中之中的乙個。解法一 窮舉 解題思路 既然是求某乙個...
演算法筆記1 最大子串行和問題的求解
問題 給定n個整數 有可能是負數 a1,a2,a3,a4.an 求最大子串行和。子串行必須是連續的 比方,對於輸入,2,11 4,13,5 2。這個序列,答案是20,即從a2到 a4。對於這個問題,你怎麼想的呢?以下有四種解法,看看你的解法是不是當中之中的乙個。解法一 窮舉 解題思路 既然是求某乙個...