問題——
給定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。對於這個問題,你怎麼想的呢?以下有四種解法,看看你的解法是不是當中之中的乙個。解法一 窮舉 解題思路 既然是求某乙個...