文章目录
- 2.3.1中介绍了归排
- 他用分治
- 分治策略中:
- 递归求解一个问题
- 每层递归中用如下三个步骤:
- Divide分解步骤将问题划分为一些子问题
- 子问题形式与原问题一样,只是规模更小
- conqure
- 解决步骤递归地求解出子问题。
- 如果子问题足够小,则停止递归,直接求解
- 合并
- 将 子问题的解组合成原问题的解
- 子问题大时,需递归求解,称为递归情况。
- 当子问题变小,不需递归时,说递归已触底,进入基本情况。
- 有时,除了与原问题形式一样的更小的子问题外
- 还需求解与原问题不完全一样的子问题
- 将这些子问题看作合并步骤的一部分
- 本章更多分治策略
- 最大子数组问题
- 两个
n
×
n
n\times n
n×n矩阵乘法的分治算法
- 一个运时 Θ ( n 3 ) \Theta(n^3) Θ(n3),不优于平凡算法
- 另一Strassen算法 运时
Θ
(
n
2.81
)
\Theta(n^{2.81})
Θ(n2.81)
- 渐进时间复杂性击败平凡算法
递归式
- 递归式与分治方法是紧密相关的
- 使用递归式可以很自然地刻画分治算法的运行时间
- 如2.3.2节,用下面描述MERGE-SORT过程的最坏运行时间为
T
(
n
)
T(n)
T(n)
T ( n ) = { Θ ( 1 ) 若 n = 1 2 T ( n / 2 ) + Θ ( n ) 若 n ≥ 2 (4.1) T(n)=\left\{ \begin{aligned} \Theta(1) & 若n=1\\ 2T(n/2)+\Theta(n)& 若n\ge 2 \\ \end{aligned} \right. \tag{4.1} T(n)={Θ(1)2T(n/2)+Θ(n)若n=1若n≥2(4.1)
求 得 T ( n ) = Θ ( n l o g n ) 求得T(n)=\Theta(nlogn) 求得T(n)=Θ(nlogn) - 递归式可以有很多形式
- 如可将问题划分为2/3和 1/3
- 如果分解和合并步骤都线性时间
- 则有 T ( n ) = T ( 2 n / 3 ) + T ( n / 3 ) + Θ ( n ) T(n)=T(2n/3)+T(n/3)+\Theta(n) T(n)=T(2n/3)+T(n/3)+Θ(n)
- 子问题不必是原问题的一个固定比例。
- 如线性查找的递归版本(练习2. 1-3)仅生成一个子问题,
- 仅比原问题的规模少1
- 每次递归调用将花费常量时间
- 再加上下一层递归调用的时间,
- 递归式为 T ( n ) = T ( n − 1 ) + Θ ( 1 ) T(n)= T(n -1)+\Theta(1) T(n)=T(n−1)+Θ(1)。
三种求解递归式的方法
-
介绍三种求解递归式方法,即得出算法的“ Θ \Theta Θ”或“ O O O”渐近界的方法:
-
代入法: 猜一个界,然后用数学归纳法证明这个界正确。
-
递归树法: 将递归式转为棵树,
- 结点表示不同层次的递归调用产生的代价。
- 然后用边界和技术来求解递归式。
-
.主方法: 求下面公式的递归式的界:
T ( n ) = a T ( n / b ) + f ( n ) (4.2) T(n) = aT(n/b) + f(n)\tag{4.2} T(n)=aT(n/b)+f(n)(4.2)- 它刻画了一个分治算法生成
a
a
a个子问题,
- 子问题都是原问题的 1 / b 1/b 1/b,
- 分解和合并总共花费时间为f(n)
- 为用主方法,要熟记三情况
- 掌握此法, 确定很多简单递归式的渐近界就很easy。
- 本章用主方法确定
- 最大子数组和矩阵相乘的分治算法的运时
- 书中其他用分治策略也用主方法分析
- 有时也会遇到不等式的递推哦
- 它刻画了一个分治算法生成
a
a
a个子问题,
递归式技术的细节
- 会略取向下取整,边界条件等