分治法-Master定理

一个大的复杂问题分为a个形式相同的子问题,这些子问题的规模为n/b,且分解或者合并的复杂度为f(n),那么总的时间复杂度可以表示为:

 例如合并排序算法的时间复杂度递推求解如下:

 ps:后面的O(n)表示一次分解和合并所用的时间。

 递推最终的规模为1,令n=2^x,则x=logn,那么有:

1、递归树求解法

 递归树更能够形象地表达每层分解的结点和每层产生的成本。例如:T(n)=2T(n/2)+O(n),如下图所示:

时间复杂度=叶子数*T(1)+成本和=2^xT(1)+xO(n)

因为n=2^x,则x=logn,那么时间复杂度=2^xT(1)+xO(n)=n+lognO(n)=O(nlogn)

2、大师解法

T(n)=aT(n/b)+f(n)

分治递归树如下:

 如果f(n)的数量级是O(n^d),那么原公式转化为T(n)=aT(n/b)+O(n^d)

递归最终的规模为1,令 ,那么,即树高

叶子数:

成本和:

第1层成本:

最后1层成本:

最后1层成本约等于叶子数 ,因此叶子数*T(1)可以省略,即时间复杂度=成本和。

每层成本的发展趋势:

a/b^{d}<1,成本递减,成本和按第1层计算,时间复杂度为:T(n)=O(n^{d})

a/b^{d}>1,成本递增,成本和按最后1层计算,时间复杂度为:T(n)=O(n^{log_ba})

a/b^{d}=1,每层成本都一样,成本和=第一层成本x树高,时间复杂度为:T(n)=O(n^{d}log_bn)

形如:T(n)=aT(n/b)+O(n^d)的时间复杂度求解秘籍:

猜你喜欢

转载自blog.csdn.net/qq_27437197/article/details/86017705