演算法第2章上機實踐報告
演算法第2章上機實踐報告
一、實踐題目名稱
兩個有序序列的中位數(時間複雜度為logN)
二、問題描述
已知有兩個等長的非降序序列S1, S2, 設計函式求S1與S2並集的中位數。有序序列A0,A1,⋯,AN−1的中位數指A(N−1)/2的值,即第⌊(N+1)/2⌋個數(A0為第1個數)。
三、演算法描述
採用二分法將問題規模減半,並對問題進行遞迴處理,考慮一下特殊情況。
關鍵演算法:
①序列元素個數奇偶的處理:
此演算法可保證偶數序列分割後保持對稱性,而對奇數序列不產生影響,保證遞迴時子問題也是兩個等長的序列。
②遞迴過程:
分別求得兩個序列的中位數,比較兩個序列的中位數。如果兩個數相等,即為所求中位數;如果不相等,則對兩個數中較大的數所在的序列進行剪掉比這個數大的部分的處理,其它數保留,較小的數所在的序列進行剪掉比這個數小的部分的處理,其它數保留。接下來,進行遞迴呼叫。
③當兩個序列都只剩下一個元素時的處理:
比較剩下的兩個數,較小的數即為所求中位數。
④當兩個序列均剩下兩個數而無法再遞迴下去時的處理:
第一個序列求中位數方法不變,第二個序列變為與第一個序列相同的方法求得中位數。
求得中位數後,再進行一次遞迴,剩下的三個數中,把剩一個數的那個數和剩兩個數中的較小的那個數進行比較,比較的兩個數中較小的那個數即為所求中位數。
四、演算法時間及空間複雜度分析
採用二分法,每次都將問題規模減半和特殊情況的比較以及比較所用的時間,所以時間複雜度為O(logN)。因為只開闢了幾個變數的地址和資料,所以空間複雜度為O(1)。
五、心得體會
二分法雖然在時間複雜度上有著明顯的提升,但是需要考慮到所有的特殊情況,邊界條件也是一大難點,一不小心就會造成死迴圈。即使自己打不出這樣的程式碼,不過看懂別人的程式碼也是一種進步!原來不只是完成題目就可以,還可以思考如何找到最優的演算法,降低時間複雜度。
六、分治法的個人體會和思考
分治法的關鍵在於如何分,如何合併子問題,找到遞迴演算法。每一步都是值得思考的。在探索的過程中,可以通過舉一些例子研究出通法和解決一些特殊情況,以達到全面思考問題的目的。