分治法時間複雜度求解祕籍
阿新 • • 發佈:2018-12-20
分治法時間複雜度求解祕籍
本文來自快速入門演算法書——《趣學演算法》
分治法的道理非常簡單,就是把一個大的複雜的問題分為a(a>1)個形式相同的子問題,這些子問題的規模為n/b,如果分解或者合併的複雜度為f(n),那麼總的時間複雜度可以表示為:
那麼如何求解時間複雜度呢?
-
遞推求解法
我們上面的求解方式都是遞推求解,寫出其遞推式,最後求出結果。
例如:合併排序演算法的時間複雜度遞推求解:
-
遞迴樹求解法
遞迴樹求解方式其實和遞推求解一樣,只是遞迴樹更清楚直觀的顯示出來,更能夠形象的表達每層分解的結點和每層產生的成本有多少。例如:
圖3-67 分治遞迴樹
-
大師解法
- 我們用遞迴樹來說明大師解法:
- 如圖3-68所示。
-
圖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)。