1. 程式人生 > 其它 >演算法第三章實踐報告

演算法第三章實踐報告

1.1 問題的描述

最大子段和問題的求解:

1.2 演算法的描述

定義一個MaxSum函式,定義並初始化一個sum變數和一個b變數,用一個for迴圈來尋找a[n]中的最大欄位和,判斷條件如果b+a[i]大於a[i]本身,那麼b就等於b+a[i]之後的值,如果不大於那麼就將a[i]直接賦值於b。最後對所得sum跟所得b值作比較選出一個最大值,return sum;在main函式中定義並輸入一個n值,再定義一個一維陣列a[n];用for迴圈屬於陣列,最後輸出sum值得到最大欄位和的結果。

1.3 問題求解

1.3.1 遞迴方程式

1.3.2 填表

1.3.3 演算法的時間複雜度和空間複雜度

從a[1]到a[j]進行的比較很顯然演算法的時間複雜度為O(n),而空間也是填表的一維表所佔用,所以空間複雜度應為O(n);

1.4 心得體會

這次在實驗室跟同伴結對這道題的編碼的時候,在最大欄位和的理解上和對b[j]含義的理解上出了問題,導致遞迴方程式列不出來也不理解,看同學程式碼的時候也有點雲裡霧裡,但是後來想明白之後,才發現原來是挺簡單的一道題,所以之後做題還是要從最基本的入手,尤其是動態規劃最基本的遞迴方式真的特別重要。

1.5 動態規劃演算法的心得和體會

其實動態規劃和分治法非常的類似,基本思想都是把大問題劃分成一個個的小問題,找出這些小問題的解,最終合成大問題的解決方案,但不同於分治法的就是動態規劃會在這過程中記錄一些小問題的解,這樣以後遇到這些小問題就不用在重新進行計算而是找到解直接使用,降低了時間的複雜度;在系統分析問題時,動態規劃常常被使用,這種動態規劃的演算法感覺能較好解決一些複雜的大問題