分支策略—分治法

分治算法的实质:把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

在这里插入图片描述

分治算法通常以数学归纳法来验证。而它的计算成本则多数以解递归关系式来判定。

分治法模式在每一层递归时都有三个步骤

  1. 分解原问题为若干子问题,都是原问题的规模较小的实例。
  2. 解决这些子问题,递归求解子问题,如果子问题足够小,直接求解。
  3. 合并这些子问题的解变成原问题的解。
    有时候,除了求解与原问题形式完全一样的规模更小的子问题外,还需要求解与原问题不完全一样的子问题,将这些子问题的求解看作合并步骤的一部分。

分析分治算法
分析算法运行时间的递归式来自基本模式的三个步骤,假设T(n)是规模为n的一个问题的运行时间。如果问题规模足够小,n<=c,则直接求解需要常量时间,我们写做Θ(1),假设把原问题分解为a个子问题,每个子问题的规模为原问题的1/b,为了求解一个规模是n/b的子问题,需要T(n/b),a个子问题需要a*T(n/b)时间,如果分解问题需要时间D(n),合并子问题的解成原问题的解需要时间C(n),那么可以得到递归式:

  1. T(n)=Θ(1) 如果n<=c;
  2. T(n)=aT(n/b)+D(n)+C(n) 其他
    递归式可以有很多形式,不一定是把原问题分解为相同规模的子问题。
    这里介绍一种求解递归式的方法
    主方法
    即是T(n)=aT(n/b)+D(n)+C(n)又可以写成T(n)=aT(n/b)+f(n),含义是将原问题分解为a个子问题,规模减小为原来的1/b,分解和合并花费时间f(n)。

下面是我收集的利用了分治算法的实例
1.归并排序
2. 最大子数组问题 3. 矩阵乘法的Strassen算法