分治策略-基础.md
基础思想
分治策略(Divide and Conquer)基本思想:
-
将原始问题划分或者归结为规模较小的子问题;
-
递归或迭代求解每个子问题;
-
将子问题的解综合得到原问题的解。
注意:
-
子问题和原始问题性质完全一样;(递归基础)
-
子问题之间可彼此独立地求解;
-
递归停止时子问题可直接求解。
问题
二分搜索
算法 Binary Search(T, l, r, x)
输入:数组,下标从到;数
输出: // 若在中,为下标;否则为
伪代码:
1 | l ← 1; r ← n |
思想:
-
通过与中位数的比较,将原问题归结为规模减半的子问题,如果小于中位数,则子问题由小于的数构成,否则子问题由大于的数构成。
-
对子问题进行二分检索。
-
当子问题规模为
1
时,直接比较x
与T[m]
,若相等则返回m
,否则返回0
。
复杂度分析:
二分检索问题最坏情况下的时间复杂度:
二分归并排序
算法:Merge Sort(A, p, r)
输入:数组A[p..r]
输出:元素按照从小到大的排序数组A
伪代码:
1 | if p < r |
设计思想:
-
将原问题化为分规模为
n/2
的2个子问题; -
继续划分,将原问题归结为规模为
n/4
的4个子问题,继续…,当子问题规模为1时,划分结束。 -
从规模
1
到n/2
,陆续归并排好序的两个子数组。每归并一次,数组规模扩大一倍,直到原始数组的规模。
时间复杂度的分析:
假设n
为2的幂,二分归并排序最坏的情况下时间复杂度:
Hanoi塔的递归算法
算法 Hanoi(A, C, n) // n个盘子从A到C
1 | if n = 1 then move(A, C) // 1个盘子从A到C |
设n
个盘子的移动次数为T(n)
算法设计思想
-
将原问题归结为规模为
n-1
的2个子问题; -
继续归约,将原问题归结为规模为
n-2
的4个子问题。继续…,当子问题规模为1
时,归约过程截止。 -
从规模
1
到n-1
,陆续组合两个子问题的解。直到规模为n
。 -
分析方法:递推方程。
一般性描述
分治算法 Divide-and-Conquer(P)
1 | if |P|<=c then S(P) |
设计要点
-
原问题可以划分或者归约为规模较小的子问题
子问题与原问题具有相同的性质
子问题的求解彼此独立
划分时子问题的规模尽可能均衡
-
子问题规模足够小时可以直接求解
-
子问题的解综合可以得到原来的解
-
算法实现:递归或者迭代