1. 程式人生 > >演算法第三章實踐

演算法第三章實踐

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分鐘打出來,一開始我們討論要不要先判斷正負,是兩個相加還是三個相加。後來想到應該通過動態規劃去解決問題,將大問題化為子問題,通過第一題的熱身,立馬就想到這段程式碼了。

③    對結對程式設計更加了解了,應該先獨立思考,有想法互相討論,最後一起程式設計。