算法學習--分治法

分治法的思想是:將原問題劃分爲與原問題具有相似結構的小問題,然後遞歸地求解小問題。其解決問題的過程可歸納爲以下三個步驟:

一,分解(Divide),將原問題分解爲一序列子問題;

二,解決(Conquer),遞歸地解子問題,若子問題足夠小了,那麼就可以直接解決子問題;

三,合併(Combine),將子問題的結果合併爲原問題的解。


這裏學習學習使用分治法來求解序列排序問題,相應的排序算法叫做合併排序。根據分治法求解問題的步驟,合併排序法有以下三個步驟:

一,分解,將有n各元素的序列分解爲各有n/2各元素的子序列;

二,解決,用合併排序法對兩個子序列遞歸地排序;

三,合併,將兩個已排好序的子序列合併。


算法時間複雜度分析:

假設把原問題分解爲a個子問題,每個子問題的規模是原問題規模的1/b。將分解問題的時間極爲D(n),將合併問題的解的時間記爲C(n)。如果問題的規模足夠小,比如n<=c,那麼就可以直接求解問題,且所花時間爲那麼求解問題的總時間有以下遞推式:


T(n) = \Theta(1),  n<=c

T(n) = aT(n/b) + D(n) + C(n) , n>c

因爲分解和合並的時間都是\Theta(n)的。所以

T(n) =  aT(n/b) + \Theta(n),   n>c


利用主定理(main theorem)可以解得T(n) = \Theta( n ln n)。主定理後面再八卦了。另外一種求解上述遞歸式的方法,是利用二叉樹,對子問題的分解可以構成一個二叉樹,對這個二叉樹進行分析同樣可以得到前面的結果。


合併算法的改進

當待排序序列元素個數n較少的時候,插入排序有比較快的運算速度。這樣的話,當用合併排序進行排序時,如果子問題比較小了,可以直接使用插入排序進行排序,而無須再對該子問題繼續進行分解。


寫的很是淺顯,實際上是抄書了。不過學習就是這樣一個過程,從不知道到知道一點點,再到知道更多。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章