算法第三章實踐
阿新 • • 發佈:2018-11-02
時間復雜度 規劃 比較 兩種 存儲 思考 代碼 功能 兩個
1、 實踐題目:最大子段和
2、 問題描述:給定n個整數(可能為負數)組成的序列a[1]a[2]……a[n],求該序列如a[i]+a[i+1]……a[j]的子段和最大值。當所給的整數均為負數時,定義子段和為0.要求算法時間復雜度為O(n)。
3、 算法描述:最大子段和化為子問題,兩個相鄰的數字在相加,不加兩種情況下哪種方式能得到最大值。將i與i+1位置的數字相加,並與i、i+1兩個數字比較,將最大值保留在i+1。此時設一個變量x,用於存儲最大值,每次相加比較後就與x比較,最大值賦予x。即x=max(a[i],a[i+1],a[i]+a[i+1]),最後輸出x。
4、 算法時間和空間復雜度分析:
時間:T(n)=O(n)+O(n)=O(n)
空間:分配了n個數組和變量i,則為O(n)
5、 心得體會:
① 程序改進:我這種代碼會改變原來數組中的值,要是加多一個功能可能就比較麻煩繼續計算。可以設多一個數組用來存放運算結果,這樣就不用改變數組中的值。
② 我懂得了應該先想算法思想,再去套進題目中。這道題我們只花了15分鐘打出來,一開始我們討論要不要先判斷正負,是兩個相加還是三個相加。後來想到應該通過動態規劃去解決問題,將大問題化為子問題,通過第一題的熱身,立馬就想到這段代碼了。
③ 對結對編程更加了解了,應該先獨立思考,有想法互相討論,最後一起編程。
算法第三章實踐