分治算法及常见示例

Posted gaoyixue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治算法及常见示例相关的知识,希望对你有一定的参考价值。

1、原理

分为三个阶段:

-Divide:整个问题划分成多个子问题

-Conquer:求解各子问题的解

-Merge:合并子问题的解,形成原始问题的解

2、示例

(1)整数乘法

输入:n位二进制整数X,Y

输出:X、Y的乘积

通常计算X*Y时间复杂性是O(n2),现给出一个时间复杂性为O(n1.59)的算法。

技术图片

将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个乘法

          技术图片

  • 技术图片

所以T(n)=7T(n/2)+O(n2),根据master定理可得T(n)=O(n2.81).

(3)找最近点对

输入:n个点的集合Q(两维)

输出:技术图片

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)的搜索方法:

 技术图片技术图片

时间复杂度:

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内】

技术图片

Graham-scan算法

技术图片技术图片技术图片

 

 技术图片技术图片技术图片

技术图片技术图片技术图片

 技术图片

技术图片

时间复杂性分析:

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

 

以上是关于分治算法及常见示例的主要内容,如果未能解决你的问题,请参考以下文章

常见算法——贪心算法&分治算法

python_分治算法贪心算法动态规划算法

五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

lanczos算法及C++实现实对称三对角阵特征值分解的分治算法

C++经典算法问题:棋盘覆盖问题(分治算法)!含源码示例

LeetCode 分治算法