1. 程式人生 > >分治法時間複雜度求解祕籍

分治法時間複雜度求解祕籍

分治法時間複雜度求解祕籍

本文來自快速入門演算法書——《趣學演算法》

        分治法的道理非常簡單,就是把一個大的複雜的問題分為a(a>1)個形式相同的子問題,這些子問題的規模為n/b,如果分解或者合併的複雜度為f(n),那麼總的時間複雜度可以表示為:


     那麼如何求解時間複雜度呢?

  1. 遞推求解法

    我們上面的求解方式都是遞推求解,寫出其遞推式,最後求出結果。

    例如:合併排序演算法的時間複雜度遞推求解:



  2. 遞迴樹求解法

    遞迴樹求解方式其實和遞推求解一樣,只是遞迴樹更清楚直觀的顯示出來,更能夠形象的表達每層分解的結點和每層產生的成本有多少。例如:

    如圖3-67所示。


    3-67 分治遞迴樹

  3. 大師解法

  • 我們用遞迴樹來說明大師解法:

  • 如圖3-68所示。

  1. 3-68大師解法遞迴樹

    時間複雜度=葉子數*T(1)+成本和

    時間複雜度=成本和。

    現在我們只需要觀察每層產生的成本的發展趨勢,是遞減的還是遞增的,還是每層都一樣?每層成本的公比為     

  • 例如:
  • 畫出遞迴樹,觀察每層產生的成本:

成本的公比小於1,時間複雜度按1計算;

成本的公比大於1,時間複雜度按最後1計算;

成本的公比等於

1,時間複雜度按1*樹高計算;


大師解法:

遞迴樹如圖3-69所示。

3-69 大師解法遞迴樹

    首先從遞迴樹中觀察每層產生的成本發展趨勢,每層的成本有時不是那麼有規律,需要仔細驗證才行。比如我們得到第3層是(5/16)2n2,需要驗證第4層是(5/16)3n2,…。經過驗證,我們發現每層成本是一個等比數列,公比為5/16<1,呈遞減趨勢,那麼只需要計算第一項即可。時間複雜度:T(n) =O(n2)