什么是分治算法?
顾名思义,分治算法就是分而治之,也就是将原问题划分成n个规模较小的,并且结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。
分治算法是一种处理问题的思想,递归是一种编程技巧。
分治算法的递归操作
1.分解
2.解决
3.合并
举个例子,归并排序
分治算法的条件
1.原问题与分解成的小问题具有相同的模式
2.原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别
3.具有分解终止条件
4.可以将子问题合并成原问题,而这个合并操作的复杂度不能太高,否则就起不到见效算法总体复杂度的效果了
分治算法实际的举例
一组无需数组中的逆序度的计算?
利用归并排序中merge的环节。
二维平面上有n个点,如何快速计算出两个距离最近点对?
将二维平面分成三个部分,左中右。然后对于左和右分别求最小的距离d1,d2,则左和右的最小值是d = min(d1,d2)。
根据这个条件,我们可以对得到中区域的大小是一个横坐标为(m-d,m+d),纵坐标是(y+d)的矩形框。
在这个矩阵框中,我们可以得到常数项的比较个数,即不超过8个的点。
基于以上的结论,我们可以将P1,P2中的点按y的升序排列,顺序处理P1和P2中的点p(x,y)在y坐标区间中最多取8个点,计算其与点p的距离。
有两个n*n的矩阵A,B,如何快速求解两个矩阵的乘积C=A*B?
矩阵分块
参考
初学算法-分治法求平面上最近点对(Closest Pair)-HDU 1007:https://my.oschina.net/bgbfbsdchenzheng/blog/498823
算法导论求n个点的最小距离:https://blog.csdn.net/Job_yi/article/details/9615471
平面最近点距离问题(分治法):https://blog.csdn.net/hnu2012/article/details/70894678