一个大的复杂问题分为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)的数量级是,那么原公式转化为。
递归最终的规模为1,令 ,那么,即树高
叶子数:
成本和:
第1层成本:
最后1层成本:
最后1层成本约等于叶子数 ,因此叶子数*T(1)可以省略,即时间复杂度=成本和。
每层成本的发展趋势:
若,成本递减,成本和按第1层计算,时间复杂度为:
若,成本递增,成本和按最后1层计算,时间复杂度为:
若,每层成本都一样,成本和=第一层成本x树高,时间复杂度为:
形如:的时间复杂度求解秘籍: