算法----五大算法之分治法
来源:互联网 发布:3cdaemon syslog 端口 编辑:程序博客网 时间:2024/05/09 20:17
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
1. 基本概念
字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如快速排序,归并排序等。
2. 适用范围
分治法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
3. 分治法的步骤
分治法在每一层递归上都有三个步骤:
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3 合并:将各个子问题的解合并为原问题的解。
它的一般的算法设计模式如下:
Divide-and-Conquer(P)
if |P|≤n0 then return(ADHOC(P)) 将P分解为较小的子问题 P1 ,P2 ,...,Pk for i←1 to k do yi ←Divide-and-Conquer(Pi) △ 递归解决Pi T ←MERGE(y1,y2,...,yk) △ 合并子问题 return(T)
其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。
4. 复杂度分析
参见http://blog.sina.com.cn/s/blog_48258fbe0100gcy8.html
5. 典型问题
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)快速排序
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表
(10)HANOI塔
参考:http://c.chinaitlab.com/special/algorithm/Index.html
- 算法----五大算法之分治法
- 算法----五大算法之分治法
- 五大常用算法之分治法
- 五大常用算法之分治法
- 五大常用算法 之 分治法
- 五大常用算法之分治算法
- 五大算法之分治算法
- 常用五大算法之:分治算法
- 五大常用算法之--分治算法
- 五大算法---分治算法
- 五大算法:分治算法
- 五大算法之一--分治法
- 五大算法之一--分治法
- 五大算法之一--分治法
- 五大算法之一--分治法
- 五大常用算法之一:分治法
- <五大经典算法> 五、分治算法
- 五大算法之(1)分治算法
- 2-7. HttpClient
- 如何看Datasheet
- 示波器探头基础系列
- 达内C++视频(全)
- 关于C ++的四咱强制类型转换
- 算法----五大算法之分治法
- java学习之路----正则表达式----日期的补充
- 示波器探头知识
- 用字符串存js函数名执行调用
- HDOJ 钱币兑换
- iphone开源项目分享
- (Relax 数论1.29)POJ 3286 How many 0's?(统计a-b之间-出现的次数)
- Objective-C语法快速参考
- UVA试题分类