--- title: Divide and Conquer Algorithms localeTitle: 划分和征服算法 --- ## 划分和征服算法 分而治之| (介绍) 像贪婪和动态编程一样,分而治之是一种算法范式。典型的Divide and Conquer算法使用以下三个步骤解决了问题。 1. 除以:将给定问题分解为相同类型的子问题。 2. 征服:递归解决这些子问题 3. 结合:适当地结合答案 以下是一些标准算法,即Divide和Conquer算法。 1)二进制搜索是一种搜索算法。在每个步骤中,算法将输入元素x与数组中的中间元素的值进行比较。如果值匹配,则返回middle的索引。否则,如果x小于中间元素,则算法在中间元素的左侧重复,否则在中间元素的右侧重复。 2)Quicksort是一种排序算法。该算法选择一个枢轴元素,重新排列数组元素,使得小于拾取的枢轴元素的所有元素移动到枢轴的左侧,并且所有更大的元素移动到右侧。最后,算法递归地对枢轴元素左右两侧的子阵列进行排序。 3)Merge Sort也是一种排序算法。算法将数组分成两半,递归地对它们进行排序,最后合并两个排序的一半。 4)最近的一对点问题是在xy平面中的一组点中找到最接近的点对。通过计算每对点的距离并比较距离以找到最小值,可以在O(n ^ 2)时间内解决该问题。 Divide and Conquer算法解决了O(nLogn)时间内的问题。 5)Strassen算法是一种有效的算法来乘以两个矩阵。一个乘以两个矩阵的简单方法需要3个嵌套循环,并且是O(n ^ 3)。 Strassen算法在O(n ^ 2.8974)时间内乘以两个矩阵。 6)Cooley-Tukey快速傅里叶变换(FFT)算法是最常用的FFT算法。它是一种分而治之的算法,适用于O(nlogn)时间。 7)Karatsuba算法是第一个比二次“小学”算法渐近快的乘法算法。它将两个n位数字的乘法减少到最多n ^ 1.585(这是基数2中3的log的近似值)单位数产品。因此,它比传统算法更快,后者需要n ^ 2个单位数产品。 ### 分而治之(D&C)与动态编程(DP) 两种范式(D&C和DP)将给定问题划分为子问题并解决子问题。如何针对特定问题选择其中一个?当多次评估相同的子问题时,应使用Divide and Conquer。否则应使用动态编程或记忆。 例如,二进制搜索是一种Divide and Conquer算法,我们再也不会评估相同的子问题。另一方面,为了计算第n个斐波那契数,应该首选动态规划。