分解:将原问题划分红形式相同的子问题,规模能够不等,对半或2/3对1/3的划分。算法
解决:对于子问题的解决,很明显,采用的是递归求解的方式,若是子问题足够小了,就中止递归,直接求解。函数
合并:将子问题的解合并成原问题的解。blog
这里引出了一个如何求解子问题的问题,显然是采用递归调用栈的方式。所以,递归式与分治法是紧密相连的,使用递归式能够很天然地刻画分治法的运行时间。因此,若是你要问我分治与递归的关系,我会这样回答:分治依托于递归,分治是一种思想,而递归是一种手段,递归式能够刻画分治算法的时间复杂度。递归
解递归式:数学
这里有三种方法:代入法、递归树法和主方法。(下面这一部分结合有些网友的总结和个人总结得来)方法
代入法:im
定义:先猜想某个界的存在,再用数学概括法去证实该猜想的正确性。
缺点:只能用于解的形式很容易猜的情形。
总结:这种方法须要经验的积累,能够经过转换为先前见过的相似递归式来求解。d3
递归树法:经验
原由:代换法有时很可贵到一个正确的好的猜想值。
用途:画出一个递归树是一种获得好猜想的直接方法。
分析(重点):在递归树中,每个结点都表明递归函数调用集合中一个子问题的代价。将递归树中每一层内的代价相加获得一个每层代价的集合,再将每层的代价相加获得递归式全部层次的总代价。
总结:递归树最适合用来产生好的猜想,而后用代换法加以验证。
递归树的方法很是直观,总的代价就是把全部层次的代价相加起来获得。可是分析这个总代价的规模却不是件很容易的事情,有时须要用到不少数学的知识。总结
主方法:
主方法是最好用的方法,书本上以”菜谱“来描述这种方法的好用之处,它能够瞬间估计一个递推式的算法复杂度。可是咱们知道,这后面确定是严格的数学证实在支撑着,对于咱们用户来讲,咱们只用知道怎么用就好了。
优势:针对形如T(n) = af(n/b) + f(n)的递归式
缺点:并不能解全部上述形式的递归式,有一些特殊状况,见下文分析。
分析:三种状况,以下图,着重看圈线的部分:
直觉:看 f(n) 和 nlogba 的关系,谁大取谁,相等则两个相乘,但要注意看是否相差因子 nε。对于3),还要看是否知足条件 af(n/b) <= cf(n) .
就像上面所说的,该方法不能用于全部的形如上式的递归式,f(n)和nlogba的关系必须是多项式意义上的小于大于,即渐近关系(渐近小于、渐近大于),什么是渐近,就是二者相差一个因子nε。因此,在状况1和状况2之间有必定的间隙,一样状况2和请看3之间也有必定的间隙;对于状况3,还要看是否知足正则条件。
例子:
代入法:(凭直觉、经验)
1)、习题4.3-1:T(n) = T(n-1) + n
2)、习题4.3-2:T(n) = T(n/2) + 1
递归树法:
1)、对递归式T(n) = 3T(n/2) +n,利用递归树肯定一个好的渐近上界,用代入法进行验证。
2)、对递归式T(n) = T(n/2) + n2,利用递归树肯定一个好的渐近上界,用代入法进行验证。
主方法:
1)、对于下列递归式,使用主方法求出渐近紧确界。
a、T(n) = 2T(n/4) + 1
b、T(n) = 2T(n/4) + n1/2
c、T(n) = 2T(n/4) + n
d、T(n) = 2T(n/4) + n2