1. 程式人生 > >分治演算法入門

分治演算法入門

https://blog.csdn.net/rainchxy/article/details/78957851可以看這篇部落格

分治的複雜度分析:對於規模為n的問題,將其分成a個子問題,每個問題的規模是n/b。

證明:在遞推式中每次往下分治時,子問題數量都會乘以a,子問題規模都會除以b,那麼當子問題規模到達1時,子問題數量就是a^logb(n)、即n^logb(a)

f(n)是子問題向上合併的代價,每次往下分治時,merge的代價是其問題數量*合併當前規模的問題的代價,當分治到問題規模是1時,向上合併的代價就是a^logb(n)-1 + ... + af(n/b) + f(n),

 

有上述推導式可以得知分治演算法的複雜度只看兩個因子,一是n^logb(a),二是sum{ aj * f(n/bj) },0<=j<=logb(n)-1,用等比數列的級數求和算出最終複雜度即可

對應如下遞迴樹

 

casr1: 當f(n)<O(n^logb(a))時,假設f(n)=O(n^(logb(a)-e)),e>0,

遞迴樹的每層成本從根向下呈幾何級數增長,成本在葉節點一層達到最高,即最後一次遞迴是整個過程中成本最高的一次,故其占主導地位。所以遞迴分治的總成本在漸進趨勢上和葉子層的成本一樣。 此情況下分治代價由樹的葉子節點代價決定

 

case 2:當f(n)=O(n^logb(a))時,假設f(n)=O(n^logb(a))

遞迴樹每層的成本在漸進趨勢上一樣,此情況下分治代價均勻分佈在樹的各層上

 

case 3:f(n)>O(n^logb(a)),

遞迴樹每層成本呈幾何級數遞減,樹根一層的成本占主導地位。因此,總成本就是樹根層的成本。分治代價集中在根的代價上