分治法

目录

  • 零、主定理
  • 零-零、利用数学方法求解递归式
  • 一、归并排序
    *二、最大子数组问题
    2.1 问题描述
    2.2 使用分治策略求解
    2.3 分治法的分析
  • 三、矩阵乘法的Strassen算法
    3.1 普通矩阵乘法
    3.2 一个简答的分治算法
    3.3 Strassen方法

在分治策略中,递归地求解一个问题,在每层递归中应用如下三个步骤:
1)分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小
2)解决:递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解。
3)合并:将子问题的解组合成原问题的解

分治有两种情况:
1)当子问题足够大,需要递归求解时,称之为递归情况
2)当子问题变得足够小,不再需要递归时,进入基本情况

零、主定理


分治法_第1张图片

主定理的三种情况分别对应以下三种情况:
1)树的总代价由叶节点的代价决定
2)树的总代价均匀分布在树的所有层次上
3)树的总代价由根节点的代价决定


分治法_第2张图片

主定理的证明:(需要用到下面两个引理)


分治法_第3张图片

引理4.2:


分治法_第4张图片

引理4.2的证明:


分治法_第5张图片

引理4.3:


分治法_第6张图片

4.3的证明:


分治法_第7张图片

分治法_第8张图片

主定理的应用:


分治法_第9张图片

几个递归公式的解:
1)T (n) = T (αn) + T ((1 − α)n) + n 的解为:T (n) = Θ(n lg n)
可以用代入法验证
2)T (n) = T (n − 1) + n的解为:T (n) = Θ(n²)


分治法_第10张图片

3)T (n) = T (√n) + 1 的解为:T(n) = Θ(lglgn)


分治法_第11张图片

4)T (n) = T (n/2) + T (n/4) + T (n/8) + n的解为:T(n) = Θ(n)
可以用代入法验证
分治法_第12张图片

5)T (n) = T (n − 1) + lg n的解为:T (n) = Θ(n lg n)
6)T (n) = T (n − 1) + 1/n的结尾:T(n) = Θ(lgn)

零-零、利用数学方法求解递归式

分治法_第13张图片

一、归并排序

二、最大子数组问题

2.1 问题描述

股票的买入卖出,使得收益最大
暴力求解方法:尝试每队可能的组合,共有n(n - 1) /2种,运行时间为Ω(n²)

问题转换:不从每日价格的角度去看待输入,二十考察每日价格变化,第i天的价格变化定义为第i天和第i-1天的价格差,将该数组定义为A。那么问题就转换为寻找A的和最大的非空连续子数组。称之为最大子数组。
只有当数组中包含负数时,最大子数组问题才有意义,否则整个数组和肯定是最大的。

2.2 使用分治策略求解

分治法_第14张图片

考虑求解子数组A[low..high]的最大子数组。
使用分治技术意味着将子数组划分为两个规模尽量相等的子数组,比如中央位置mid。A[low..high]的任何连续子数组A[i..j]所处的位置必然是一下三种情况之一:



这三种情况的求法:
A[low..mid]和A[mid+1..high]递归进行求解
跨mid的求解:找出A[i..mid]和A[mid+1..j]最大子数组,然后合并
求出这三个之后,然后选出其中的最大者,即为A[low..high]的最大子数组


分治法_第15张图片
分治法_第16张图片

分治法_第17张图片

2.3 分治法的分析


可得T(n) = Θ(nlgn)

三、矩阵乘法的Strassen算法

3.1 普通矩阵乘法

分治法_第18张图片

3.2 一个简答的分治算法

分治法_第19张图片

分治法_第20张图片

递归情况的总时间为分解时间、递归调用时间以及矩阵加法时间之和:




得到T(n) = Θ(n³)

3.3 Strassen方法

核心思想是令递归树少一点点,只递归进行7次而不是8次n/2 x n/2矩阵的乘法。


分治法_第21张图片

创建10个矩阵:



分治法_第22张图片

递归地计算7次矩阵乘法:
分治法_第23张图片

计算C的4个子矩阵:






运行时间的分析:

你可能感兴趣的:(分治法)