算法设计与分析之分治法


前言

        大家好,我是一只勤勤恳恳的程序猿。本篇文章小猿将跟您分享算法设计与分析中的分治法,希望对大家有所帮助。

在这里插入图片描述

一、分治法设计思想

        将一个复杂的问题分解成若干个规模较小相互独立,但类型相同的子问题求解;然后再将各子问题的解组合成原始问题的一个完整答案,这样的问题求解策略就叫分治法
        说明
        (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、分治法的设计步骤:划分、求解子问题、合并

结语
        对蛮力法的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值