欢迎使用CSDN-markdown编辑器

分治策略


相信可能不少人都知道递归的概念,也曾用递归解决过不少难题。但说到分治策略,可能大家就会对这个词感到陌生了。事实上,递归与分治策略是密切相关。在这篇博客中,我将带领各位领略“分治策略”的魅力。

ID:15322244
数据科学与计算机学院


目录

百科解释

分治策略是对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。。 —— [ 百度百科 ]
这里写图片描述

解读

百度百科对分治策略的描述,我们可以这样来理解:分治策略中,我们往往会使用递归来解决问题,每一个递归又可以分为三个步骤。

1.分解

分解步骤将问题划分为一些子问题,子问题的形式与原来的一致,只是规模更小。

2.解决

解决步骤递归地求解出子问题。当子问题的规模足够小时便停止递归,直接求值。规模足够小的定义一般是为1。

3.合并

合并步骤将子问题的解组合成原问题的解。


当子问题足够大,需要递归求解时,我们称之为递归情况。当子问题变得足够小的时候,便不再需要递归,此时我们说递归已经“触底”进入了基本情况。有时候除了要解决与原问题形式一样的规模更小的子问题以外,还需要解决与原问题形式截然不同的子问题。

其实讲了这么多,感觉还是在讲递归。但亦如前面所说,递归与分治策略是密切相关的。而在我看来,分治策略更多地是指一种解决问题的思维方式,有它才能推出解决问题的方法(递归)。


实例演练

分治算法中,比较经典的题目就是“求最大子序列之和”。

题目描述:

输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

解法:

由于讲的是分治策略,因此在这里讲解的主要是解题思路。如果没有接触过这种题型,那么相信一开始大家的思路应该都是通过枚举来解决这类问题。枚举固然是可以,但缺点是效率低,枚举的时间复杂度为O(n^2),有计算机基础的人应该都能明白枚举的这一劣势。那么我们该怎么改进算法从而提高效率?那边是分治策略。
首先,我们将数组从中间均分为两半,得到两个子数组A,B。此时就出现了三种可能:一、最大子数组和在A中。二、最大子数组和在B中。三、最大子数组和横跨A、B,它的前半段在A中,后半段在B中。
对于第一、第二种可能,我们可以通过再将A、B子数组划分为更小的子数组进行递归。对于第三种可能,我们可以从中间项开始分别往前、往后进行求和,分别求出前后的最大子序列和,在合并,得出最终结果。最后,再讲三种可能条件下算得的值进行比较,就可以得出最大的子序列了。

结语

分治策略是一种思维方法,它通过对问题的抽象、分解达到化繁为简的效果。除了解决“求最大子序列和”这类问题以外,分治策略的进阶运用还有解决矩阵乘法的Strassen算法。在此我给出主方法求解递归式的数学公式,有兴趣的话,各位可以自己去查阅相关资料1,深入学习。

T(n)=aT(n/b)+f(n)



  1. 相关资料推荐《算法导论》
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值