一、分治法
1.含义
- Divide(分):P into smaller problems P1, P2, …, Pk.(将大问题分成更小的子问题)
- Conquer(治):by solving the (smaller) subproblems recursively.(递归地解决更小的子问题)
- Combine(并):the solutions to P1, P2, …, Pk into the solution for P.(将子问题的解联合起来求出大问题的解)
例子:归并排序
- Divide: Divide the n elements into two subsequences of n/2 elements each.(将n个元素的序列划分成两个n/2个元素的子序列)
- Conquer: Sort the two subsequences recursively.(递归地排序两个子序列)
- Combine: Merge the two sorted subsequences to produce the sorted answer.(合并两个已排序的子序列)
PS:理解(这三个部分互不交融,职能是各自独立的)
- 分到不能再分才开始解:归并排序一直划分(递归)到排序一个元素(不能再划分)为止。
- 解只是解最小问题的解:归并排序的解不做任何事情。
- 并不是求解具体的最小问题的,只是负责将子问题的答案如何合并:负责将已经得到的两个排好的部分排序是并。
2. 例子
3. 时间复杂度
T ( n ) T(n) T(n) 是规模为n的问题的运行时间。
- 最小划分规模:当问题规模小于等于 c 时,就不可继续划分了。
- 划分结果:产生了 a 个子问题,每个子问题的规模是原始问题的 1/b。
- 划分时间 D(n):将规模为n的问题划分为子问题的时间。
- 合并时间 C(n):将子问题的解决方案合并为规模为n的原始问题的解决方案的时间。
例子:归并排序
- 最小规模 c=1
- 划分产生 a=2 个子问题,每个子问题的规模是 1/b=1/2
- 划分时间 D(n)=无(因为直接传参数
⌊(p + r) / 2)⌋
就行) - 合并时间 C(n)=
Θ
(
n
)
\Theta(n)
Θ(n)