定义
将原来的问题划分成相同性质、规模更小的一些个子问题。
如:归并排序,将一个数组拆分成两个、四个、直到最后只剩一个元素,然后反过来合并。
递归方程
分治问题最重要的就是递归方程,能看出来基本划分方式以及时间复杂度。
如归并排序的递归方程为T(n)=2T(n/2)+O(n)
其中T(n)是原问题的时间,T(n/2)是一半问题的时间,所以要乘2,O(n)是归并两个子序列需要的时间,为O(n),那么如果采用的是快排,那么这里就应该是O(1)了。
快排中有和归并排序的比较,分析了为什么同样是nlong但是快排更胜一筹。
递归方程的求解
三种方法:猜、递归树、主方法
第一个不多说,就是凭借着自己的经验,大约猜一个(可能是一个范围),然后需要证明。肯定是快,但有时候确实不好猜。
递归树
之前看递归方程的时候,基本公式:T(n)=aT(n/b)+O(……)
我们用次可以得到一个树,如:
满a叉树,每一个结点都是原来规模的n/4,一直到叶子结点的T(1),至于每一个非叶子节点的数值为一次划分的代价(这里面是O(n2),所以为平方项)
将每一层的结点相加,可以看到是一个等比数列,树高为logbn(这里面为log4n)
而叶子节点那层,应该为3log4n,是利用换底公式才得到最终的结果的。
很明显,最后等比数列求和的结果也就是余项O(n^2)的一个倍数,对整体的时间复杂度没有影响
而nlog43我们可以从中得到一个公式,nlogba,那么可以通过直接比较这两项的增长速度即可得到结论。