本文將通過一些實例的講解來作爲算法入門的一個階梯,更爲主要的是記錄我在學習算法過程中對算法的一些理解,希望能幫助到自己也能幫助到觀看到這篇博客的人,廢話不多說,馬上開始。
最大連續子數組問題:
給定一個數組A[0,…,n-1],求A的連續子數組,使得該子數組的和最大。
例如:
數組:1,-2,3,10,-4,7,2,-5
最大子數組:3,10,-4,7,2
分治法:
- 將數組從中間分開,那麼最大子數組要麼完全在左半邊數組,要麼完全在右半邊數組,要麼跨立在分界點上。
- 完全在左數組、右數組遞歸解決
- 跨立在分界點上:實際上是左數組的最大後綴和右數組的最大前綴的和。因此,從分界點向前掃,向後掃即可。
分治法時間複雜度分析:
- 算法的遞推關係:T(n) = 2*T(n/2)+cn
- 若n = 2^k,則有
T(n)=2⋅T(2n)+c⋅n=2⋅(2⋅T(4n)+c⋅2n)+c⋅n=⋅⋅⋅=2kT(1)+kc⋅n=an+cnlog2n
- 若2k<n<2k+1,則T(2k)<T(n)<T(2k+1)
- 則可得T(n)=O(nlogn)