分治算法采用了“分而治之”的思想,将一个问题划分为子问题,子问题求解了,那么合并子问题的解就能得到原问题的解了!
分治算法分为三个阶段:
接下来看几个分治算法的例子来体会该思想!
例1: 归并排序
问题:给一个集合中的数字进行排序。
例2: 求一个集合中的最大数算法?
例3: MaxMin问题
思考:直接扫描求的最大值和最小值,需要
次比较操作,能不能达到更快呢?
思路:将这组数分为两部分,分别求的两部分的最小值和最大值,合并的时候最小值取两部分最小的,最大值取两部分最大的即可!算法伪代码如下:
算法的时间复杂度分析:
使用迭代法求得:
例4:整数乘法
思考:直接相乘,算法的时间复杂度为
, 那么能不能得到更优化的解法呢?
注意到,
使用了4次乘法,故时间复杂度为
,这里是否可以减少乘法次数呢?答案是可以的!
此时,算法的时间复杂度为:
例5: 矩阵乘法
思考:直接计算矩阵A和矩阵B的乘积的时间复杂度为
,那么能不能更优呢?
注意到:
故得到算法的时间复杂度为:
参考:
【1】哈工大骆吉州《算法分析与设计》PPT