美文网首页
分治算法

分治算法

作者: 我是小曼巴 | 来源:发表于2020-05-11 18:56 被阅读0次

概念

分治算法由两部分组成:
分(divide):递归解决较小的问题。
治(conquer):然后从子问题的解构建原问题的解。

一般坚持子问题是不相交的,即基本上不重叠。

分治算法的运行时间

所有有效的分治算法都是把问题分成一些子问题,每个子问题都是原问题的一部分,然后进行某些附加的工作以算出最后的答案。

比如归并排序通过将原问题分解为两个子问题,每个子问题均为原问题大小的一半,然后用到O(N)的附加工作。由此得到递归运行时间方程:T(N)=2T(N/2)+O(N)该方程的解为O(NlogN)

更加一般的分治算法的运行时间满足如下定理:

最近点问题

对于平面上的点列P,我们需要找到一对最近的点。如果存在N个点,那么就存在N(N-1)/2对点间的距离。我们可以检查所有这些距离,不过这是一个花费O(N^2)的算法。

分治的做法:假设这些点已经按照x坐标排序,那么就可以画一条想象的垂线,把点集分成两半:P_{L}P_{R}。最近的一对点要么在P_{L}中,要么在P_{R}中,或者一个点在P_{L}中一个点在P_{R}中。可以将这三个距离分别叫做d_{L}d_{R}d_{C}。由上面的定理可知,如果一个过程由两个一半大小的递归调用和附加的O(N)工作组成,那么总的时间将是O(NlogN)

\delta =min(d_{L},d_{R}),所以我们只需计算min(\delta,d_{C} ),并且需要在O(N)的时间复杂度内完成。

1)如果d_{C}小于\delta,那么决定d_{C}的两个点必然在分割线的\delta距离内。

2)决定d_{C}的两个点的y坐标相差最多是\delta

于是给出计算min(\delta,d_{C} )的伪代码,假设带中的点按照它们的y坐标排序:

对于任意的点p_{i},在最坏的情形下最多有7个点p_{j}被考虑。所以尽管上述的代码有两重for循环,但实际的复杂度只有O(N)。为了解决上面假设y坐标排序已经是现成的问题,我们将保留两个表。一个是按照x坐标排序的点的表P,而另一个是按照y坐标排序的点的表Q。这两个表可以通过一个预处理排序步骤完成。P_{L}Q_{L} 是传递给左半部分递归调用的参数表,P_{R}Q_{R} 是传递给右半部分递归调用的参数表。当递归调用返回时,我们扫描Q表并删除其x坐标不在带内的所有点,此时Q只含有带中的点,并保证按照y坐标排序。

相关文章

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 算法导论第2.3章 - 分治算法

    分治算法 递归:算法一次或多次递归地调用其自身已解决紧密相关的若干子问题。这些算法遵循分治法的思想。 分治算法三个...

  • 从分治算法到 MapReduce

    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • 09《算法入门教程》分治算法

    1. 前言 本节内容是分治算法系列之一:分治算法的介绍,主要介绍了分治算法的定义及基本思想和实现策略,然后我们介绍...

  • 分治算法

    理解分治算法 分而治之

  • 分治算法

    分治是一种思想体现,就是把一个大的问题分为若干个子问题,这些子问题相互独立且与原问题性质相同然后在子问题继续向下分...

  • 分治算法

    分治算法字面意思就是将一个复杂的数据进行分开计算,分治 的策略就是: 一个分治法将规模为n的问题分成k个规模为n/...

  • 分治算法

    http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741...

  • 分治算法

    分冶算法的基本思想是将原问题分解为几个规模较小的但类似原问题的子问题,递归地求解这些了问题,然后再合并这些子问题的...

网友评论

      本文标题:分治算法

      本文链接:https://www.haomeiwen.com/subject/xfqinhtx.html