分治策略(Divide and Conquer) 将原始问题划分或者归结为规模较小的子问题 递归或迭代求解每个子问题 将子问题的解综合得到原问题的解
注意: 子问题与原始问题性质完全一样 子问题之间可彼此独立地求解 递归停止时子问题可直接求解(子问题足够小)
设计思想 通过x与中位数的比较,将原问题归结为规模减半的子问题 对子问题进行二分检索 当子问题规模为1时,直接比较x与T[m],若相等则返回m,否则返回0
时间复杂度分析
设计思想 划分将原问题归结为规模为n/2的2个子问题 继续划分,当子问题规模为1时,划分结束 从规模1到n/2,陆续归并被排好的两个数组,每归并一次,数组规模扩大一倍,直到原始数组
设计思想 将原问题归结为规模为n-1的2个子问题 继续规约,当子问题规模为1时,归约过程截止 从规模1到n-1,陆续组合两个子问题的解,直到规模为n
将原问题归约为规模小的子问题,子问题与原问题具有相同的性质 子问题规模足够小时可直接求解 算法可以递归也可以迭代实现 算法的分析方法:递推方程
Divide-and-Conquer(P)
if |P| <= c then S(P)
divide P into P1, P2, ...,Pk(划分)
for i<--1 to k
yi <--Divide-and-Conquer(Pi)(求解子问题)
Return Merge(y1, y2, ..., yk)(综合解)
原问题可以划分或者归约为规模较小的子问题 子问题与原问题具有相同的性质 子问题的求解彼此独立 划分时子问题的规模尽可能均衡 子问题规模足够小时可直接求解 子问题的解综合得到原问题的解 算法实现:递归或迭代 两类递推方程 迭代法、递归树 迭代法、换元法、递归树、主定理
输入:
n片芯片,其中好芯片至少比坏芯片多1片
问题:
设计一种测试方法,通过测试从n片芯片中挑出1片好芯片
要求:使用最少的测试次数
最坏情况
最好情况
Fibonacci O(logn)
Fn+1 Fn 1 1 ^n
Fn Fn-1 1 0
利用子问题的依赖关系,使某些子问题的解通过组合其他子问题的解而得到 整数位乘问题
矩阵相乘问题,Strassen矩阵乘法
Coppersmith-Winograd:O(n2.376)
适用于:子问题个数多,划分和综合工作量不太大
平面点对问题
输入:平面点集P中有n个点,n>1
输出:P中的两个点,其距离最小
W(n) = aW(n/b) + f(n)