freeCodeCamp/guide/chinese/algorithms/divide-and-conquer-algorithms/index.md

2.5 KiB
Raw Blame History

title localeTitle
Divide and Conquer Algorithms 划分和征服算法

划分和征服算法

分而治之| (介绍) 像贪婪和动态编程一样分而治之是一种算法范式。典型的Divide and Conquer算法使用以下三个步骤解决了问题。

  1. 除以:将给定问题分解为相同类型的子问题。
  2. 征服:递归解决这些子问题
  3. 结合:适当地结合答案

以下是一些标准算法即Divide和Conquer算法。

1二进制搜索是一种搜索算法。在每个步骤中算法将输入元素x与数组中的中间元素的值进行比较。如果值匹配则返回middle的索引。否则如果x小于中间元素则算法在中间元素的左侧重复否则在中间元素的右侧重复。

2Quicksort是一种排序算法。该算法选择一个枢轴元素重新排列数组元素使得小于拾取的枢轴元素的所有元素移动到枢轴的左侧并且所有更大的元素移动到右侧。最后算法递归地对枢轴元素左右两侧的子阵列进行排序。

3Merge Sort也是一种排序算法。算法将数组分成两半递归地对它们进行排序最后合并两个排序的一半。

4最近的一对点问题是在xy平面中的一组点中找到最接近的点对。通过计算每对点的距离并比较距离以找到最小值可以在On ^ 2时间内解决该问题。 Divide and Conquer算法解决了OnLogn时间内的问题。

5Strassen算法是一种有效的算法来乘以两个矩阵。一个乘以两个矩阵的简单方法需要3个嵌套循环并且是On ^ 3。 Strassen算法在On ^ 2.8974)时间内乘以两个矩阵。

6Cooley-Tukey快速傅里叶变换FFT算法是最常用的FFT算法。它是一种分而治之的算法适用于Onlogn时间。

7Karatsuba算法是第一个比二次“小学”算法渐近快的乘法算法。它将两个n位数字的乘法减少到最多n ^ 1.585这是基数2中3的log的近似值单位数产品。因此它比传统算法更快后者需要n ^ 2个单位数产品。

分而治之DC与动态编程DP

两种范式DC和DP将给定问题划分为子问题并解决子问题。如何针对特定问题选择其中一个当多次评估相同的子问题时应使用Divide and Conquer。否则应使用动态编程或记忆。

例如二进制搜索是一种Divide and Conquer算法我们再也不会评估相同的子问题。另一方面为了计算第n个斐波那契数应该首选动态规划。