算法设计与分析 - Week 3 分治策略

分治策略的基本思想

分治策略(Divide and Conquer)
将原始问题划分或者归结为规模较小的子问题
递归或迭代求解每个子问题
将子问题的解综合得到原问题的解

注意:
子问题与原始问题性质完全一样
子问题之间可彼此独立地求解
递归停止时子问题可直接求解(子问题足够小)

二分检索

设计思想
通过x与中位数的比较,将原问题归结为规模减半的子问题
对子问题进行二分检索
当子问题规模为1时,直接比较x与T[m],若相等则返回m,否则返回0

时间复杂度分析

二分归并排序

设计思想
划分将原问题归结为规模为n/2的2个子问题
继续划分,当子问题规模为1时,划分结束
从规模1到n/2,陆续归并被排好的两个数组,每归并一次,数组规模扩大一倍,直到原始数组

Hanoi塔的递归算法

设计思想
将原问题归结为规模为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

改进分治算法的途径1:减少子问题数

利用子问题的依赖关系,使某些子问题的解通过组合其他子问题的解而得到
整数位乘问题
矩阵相乘问题,Strassen矩阵乘法
Coppersmith-Winograd:O(n2.376)

小结

适用于:子问题个数多,划分和综合工作量不太大

改进分治算法的途径2:增加预处理

平面点对问题
输入:平面点集P中有n个点,n>1
输出:P中的两个点,其距离最小

W(n) = aW(n/b) + f(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值