前言
大家好,我是一只勤勤恳恳的程序猿。本篇文章小猿将跟您分享算法设计与分析中的分治法,希望对大家有所帮助。
一、分治法设计思想
将一个复杂的问题分解成若干个规模较小、相互独立,但类型相同的子问题求解;然后再将各子问题的解组合成原始问题的一个完整答案,这样的问题求解策略就叫分治法。
说明
(1)、规模较小:当规模小的时候将会容易得到求解答案;
(2)、相互独立:避免在递归的时候重复计算,提高效率;
(3)、类型相同:方便递归实现;
下面使用图解的方式展示一下分治法的设计思想
1、首先将要求解的较大规模的问题分割成k个更小规模的子问题,对这k个子问题分别求解。
2、如果子问题的规模仍然不够小,则再划分为k个子问题。如此递归的进行下去,直到问题规模足够小,很容易求出其解为止,对这k个子问题分别求解。
3、将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
注意点
(1)、最好使子问题的规模大致相等
(2)、最好使各子问题之间相互独立
(3)、分治法是可行的:子问题都可解,可利用这些子问题的解求出原问题的解。
二、分治法与递归
反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。因此,分治与递归就像一对孪生兄弟,经常同时应用在算法设计之中。
三、分治法的适用条件
1、该问题的规模缩小到一定的程度就可以容易地解决。
2、该问题可以分解为若千个规模较小的相同问题,即该问题具有最优子结构性质。
3、利用该问题分解出的子问题的解可以合并为该问题的解。
4、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。需要注意的是,这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。
四、时间复杂度分析
五、分治法设计步骤
一般来说, 分治法的设计步骤由以下三个阶段组成:
1、划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并烬量使这k个子问题的规模大致相同。.
2、求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。
3、合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。
由上面的分析过程可以得到分治法的算法设计模式
对该设计模式进行时间复杂度分析
六、分治法示例
1、数字旋转矩阵
2、有序表查找
3、Strassen矩阵乘法
4、棋盘覆盖问题
5、快速排序
6、最近对问题
总结
知识点总结
1、分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
2、分治法的设计步骤:划分、求解子问题、合并
结语
对蛮力法的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。