1、原理
分为三个阶段:
-Divide:整个问题划分成多个子问题
-Conquer:求解各子问题的解
-Merge:合并子问题的解,形成原始问题的解
2、示例
(1)整数乘法
输入:n位二进制整数X,Y
输出:X、Y的乘积
通常计算X*Y时间复杂性是O(n2),现给出一个时间复杂性为O(n1.59)的算法。
![](https://i-blog.csdnimg.cn/blog_migrate/9b8bbd43cdbbdc6aa182f9c89f2089f3.png)
将X,Y表示成X=A2n/2+B,Y=C2n/2+D
则X*Y=(A2n/2+B)*(C2n/2+D)=AC2n+(AD+BC)2n/2+BD
而AD+BC=(A-B)(C-D)+AC+BD。
计算步骤:
- 划分产生A,B,C,D
- 计算A-B,C-D
- 计算n/2位乘法AC,BD,(A-B)(C-D)
- 计算AC+BD+(A-B)(C-D)
- 计算XY
则T(n)=3T(n/2)+O(n)使用master定理得到T(n)=n1.59.
(2)矩阵乘法
输入:两个n*n矩阵AB
输出:A*B
- 通常计算矩阵乘积时间复杂度是O(n3),这里给出一个O(n2.81)的算法。
- 将A、B分为四个子矩阵
.
- 计算n/2*n/2的矩阵的10个加减和7个乘法
![](https://i-blog.csdnimg.cn/blog_migrate/6297b07c220b1944619dc623d67eca71.png)
- 则
所以T(n)=7T(n/2)+O(n2),根据master定理可得T(n)=O(n2.81).
(3)找最近点对
输入:n个点的集合Q(两维)
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/38b0b16ccd26d7021f0beb48d7cfb420.png)
Preprocessing:
- 若Q中仅包含一个点,则算法结束;
- 把Q中点分别按照x y坐标值排序
Divide:
- 计算Q中各点的x坐标值的中位数m;
- 用x=m将Q划分成两个点集为QL,QR.
Conquer:
- 递归地在QL,QR中找到最近点对
- 令
Merge:
- 在临界区查找距离小于d的点对
- 若找到,则(pl,qr)是Q中最接近点对,否则(p1,p2)和(q1,q2)中距离最小者为Q中最接近点对
(pl,qr)的搜索方法:
![](https://i-blog.csdnimg.cn/blog_migrate/470934b2fb36d658a41becf1706360bb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c4e8e632d1d0861bc081380c9f49d1eb.png)
时间复杂度:
T(n)=2T(n/2)+O(n),则T(n)=O(nlogn)
(4)找到convex hull
输入:平面上的n个点的集合Q
输出:CH(Q):Q的凸包。
【注:Q的凸包是一个多边形P,Q的点或者在P上或者在P内,连接P内任意两点的边都在P内】
![](https://i-blog.csdnimg.cn/blog_migrate/a983d816f6e448f4beac778317b20ae8.png)
Graham-scan算法:
![](https://i-blog.csdnimg.cn/blog_migrate/4531b47196ca18cd9b645fe25b99def7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/26f96a9a290b0aa3545434085e856229.png)
![](https://i-blog.csdnimg.cn/blog_migrate/52a6d441d3405e426c5e8207cffdf645.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3965640b86bae827c193f97028331288.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dc4ba47642a5d7697bd18636e1e843df.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb41092d11dd5c60f20624a61dee8acd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4232d53198410f20238e0b5b26ec9810.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b7969ae7781c1df1ff7c16e79ec6ecd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/da074a702583eba2a2dc28e7e55b8617.png)
![](https://i-blog.csdnimg.cn/blog_migrate/46e3b9b5c92afca0a765705a2a2a0e19.png)
![](https://i-blog.csdnimg.cn/blog_migrate/51a5e9838eb581457f11440710b92e69.png)
时间复杂性分析:
T(n)=2T(n/2)+O(n),则T(n)=O(nlogn)
--------------------------------------^_^我是可爱的分割线^_^--------------------------------------------------
1、友谊点对
2、黑白点匹配
3、求反序个数
4、和最大连续子数组
5、找出两个数组的中位数
6、在点集中找到三个点是构成的三角形周长最小
7、求出满足距离要求的点对数
链接:https://pan.baidu.com/s/1wsqjpB8Xgzgw_GnSRRP40w
提取码:k1yp