算法导论公开课第二课里给出了三种方法,求解T(n) = aT(n/b) + f(n)
第一种代入法:观察a和b的数量关系,猜测最后的结果。例如T(n) = 4T(n/2),那么T(n)最后很可能是Θ(n^2)的复杂度。设出T(n)的形式,然后利用数学归纳法证明之。适用于较简单的递归式。
第二种递归树法:分别写出每一层的时间复杂度再求和。这种方法适合递归树比较有规律的情况,譬如归并算法或二分查找,递归树的每一层之和呈某种简单的数列,这样很方便就可以求和。
第三种是更加形式化的主方法【预计算:叶节点数目为n^log(b,a)。因为树的高度是log(b,n),每层的节点数目为a^层数,所以叶节点的数目即第log(b,n)层的数目为a^(log(b,n)),即n^(b,a),lg表示以2为底】
根据f(n)的不同分三种情况:
case1: f(n) = O(n^(log(b,a)-ε)),即f(n)比叶节点数目要多项式小于,最终的复杂度T(n)=Θ(n^log(b,a));
case2: f(n)=Θ(n^log(b,a)*lg^k(n)),通俗地理解就是,f(n)比叶节点数目差不多,但不会多项式大于。(因为因子是n的对数)。最终复杂度T(n)=Θ(n^log(b,a)*lg^(k+1)(n))。这里的k+1的意义在于,对每一层分解之后的f(n)进行叠加,树的高度是log(b,n),与lg(n)只差一个常数因子。所以就用lg(n)表示,在复杂度中lg(n)的幂次中体现出;
case3: f(n) = Ω(n^(log(b,a)+ε)),即f(n)比叶节点数目要多项式大于,最终的复杂度T(n)=Θ(f(n))。