分治算法入门
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)),
递归树每层成本呈几何级数递减,树根一层的成本占主导地位。因此,总成本就是树根层的成本。分治代价集中在根的代价上
特别说明:
f(n)f(n)代表的是分治中的划分和合并的成本。由于f(n)f(n)的渐进增长趋势>Θ(nlogba)>Θ(nlogba),
所以该分治的划分和合并的成本高于子问题的解决成本。而如果在这种情况要获得解,划分和合并的成本应该逐级下降
否则,划分和合并成本随着划分的推进将呈现发散趋势,这样总成本有可能不会收敛。那么这种分治就显得没有意义了
而如果划分与合并成本逐级下降,则意味着函数ff满足af(n/b)<=cf(n), c<1af(n/b)<=cf(n), c<1。
因此,解为T(n)=Θ(f(n))
---------------------
作者:TaoSama
来源:CSDN
原文:https://blog.csdn.net/lwt36/article/details/50625573
版权声明:本文为博主原创文章,转载请附上博文链接!