分治法
分治法的思想
将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:
- 分解:将原问题分解为若干子问题,这些子问题是原问题的规模较小的实例。
- 解决:递归地求解这些子问题。当子问题规模足够小时,可直接求解。
- 合并:合并子问题的解成原问题的解。
一个经典的分治法的例子就是归并排序。
分析分治算法
当一个算法包含对自身的递归调用时,我们往往可以用递归式来描述其运行时间。按照分治模式的三个步骤依次分析。假设
T
(
n
)
T(n)
T(n) 是问题规模为
n
n
n 的一个问题的运行时间。若问题规模足够小,如对于某个常量
c
c
c,
n
≤
c
n \le c
n≤c,则直接求解需要常量的时间。假设把原问题分解为
a
a
a 个子问题,每个子问题的规模是原问题的
1
/
b
1/b
1/b,则为了求解
a
a
a 个规模为
n
/
b
n/b
n/b 的子问题,我们需要
a
T
(
n
/
b
)
aT(n/b)
aT(n/b) 的时间。设分解的总时间为
D
(
n
)
D(n)
D(n),合并的总时间为
C
(
n
)
C(n)
C(n),则递归式如下: