分治算法——分而治之
分治算法的基本思想
将问题划分(devide)成多个子问题
递归的解决(conquer)每个子问题
将子问题的解合并(combine)为原问题的解
分治算法的使用条件
分治算法能解决的问题一般具有如下特征:
①问题的规模缩小到一定程度就可以很容易的解决
②问题可以分解为若干规模较小的相同问题
③利用分解出的子问题的解可以合并为原问题的解
④原问题分解出的各个子问题相互独立,子问题之间没有公共子问题
ps:如果子问题之间不相互独立,动态规划算法可以通过避免重复多余的计算很好的发挥优势(详见Dynamic programming)
分治算法的基本步骤
ps:平衡(balancing)子问题思想:使子问题规模大致相等,实践经验表明这样的划分几乎总是比子问题规模不等的划分更好
归并排序
用伪代码说明一下分治算法的思想:
复杂度分析
对于最好,最坏,平均情况的复杂度一样:
T(n) = 2T(n / 2) + cn
由Master Method:
T(n) = O(nlg n)
快速排序
在每一趟快速排序中,将比枢纽量小的数放在左边, 大的数放在右边,以枢纽为轴划分为两个子问题,递归解决。伪代码如下:
书上的代码如下(《算法导论》):
图解:
复杂度分析
Best Case:O(nlg n)
正好二分的情况下:
T(n) = 2T(n / 2) + cn
由Master Method:
T(n) = O(nlg n)
Worst Case:O(n2)
对于快速排序,数列有序(顺序或逆序)是最坏的情况,因为每一趟排序只能使一个数有序:
T(n) = T(n - 1) + O(n)
T(n) = O(n2)
Average Case:O(nlg n)