思想
1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
2. divide-and-conquer(P)
{
if(|P| <= n0)adhoc(P);
divide P into samller subinstances P1,P2...,Pk;
for(int i = 1;i < k;i++)
{
yi = divide-and-conquer(Pi);
}
return merge(y1,y2...,yn);
}
3.如何划分子问题
- 集合论,找到一个原来集合问题的一个划分,子问题之间不相交,同时子问题的规模类型相同
- 最优子结构(子问题类型相同)
- 最好使子问题的规模大致相同,即将一个问题的大小分成相等规模的k个子问题的处理方法是行之有效的。
例子
1. fibonacci 数列
2. 排列问题
3. 整数划分问题
4. Hanoi 塔问题
5. 二分搜索
6. 大整数乘法
7. Strassen 矩阵乘法
8. 合并排序
9. 快速排序
复杂度分析
主定理:T(n) = aT(n/b)+f(n),a>=1,b>1,f(n)是给定的多项式函数,刻画了一个分治算法,生成a个子问题,每个问题的规模是原来的1/b,分解合并步骤共消耗f(n). T(n)的复杂度的分析如下:
1. 若f(n)<n^(log(a/b)) 则T(n) = n^(log(a/b))
2. 若f(n)=n^(log(a/b)) 则T(n) = n^(log(a/b))logn
3. 若f(n)>n^(log(a/b)) 则T(n) = f(n)
思想
用一个表来记录所有以解决问题子问题的答案,不管该子问题以后是否会用到,只要它被计算过,就将其结果存入到表中,这就是动态规划法的基本思想。
基本要素:
1. 最优子结构:当一个问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
2. 重叠子问题: 在使用递归算法的时候有很多子问题是重叠的,那么我们使用一个表将已经求解过的子问题的结果保存下来
备忘录方法基本步骤
1. 找出最优解的性质,并刻画其结构特征
2. 递归地定义最优值
3. 以自底向上的方式计算出最优值
4. 根据计算最优值时得到的信息,构造最优解
例子
1. 矩阵连乘
2. 最长公共子序列
3. 0-1背包问题
思想
贪心算法总是做出当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它做出的选择只是在某种意义上的局部最优选择。
贪心选择的基本要素:
1. 贪心选择性质: 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
2. 最优子结构: 一个问题的最优解包含其子问题的最优解时,此问题具有最优子结构性质
贪心算法VS动态规划
1. 贪心算法拥有贪心选择性质,动态化算法没有。动态规划算法中,每步所作出的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择; 而贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后去解作出这个选择后产生相应的子问题。 贪心选择依赖于过往所做选择,但是不以利于将来将要作出的选择,也不依赖于子问题的解。
2. 动态规划算法通常以自底向上的方式解各子问题,贪心算法则是自顶向下方式迭代进行贪心选择,每一次贪心选择将所求问题简化为规模更小的子问题
例子
1. 活动安排问题 (最早截止时间优先)
2. 背包问题 (权重空间比值最大者优先)
3. 哈夫曼编码 (频率大者优先)
4. 单源最短路径 (局部最短路径优先)
5. 最小生成树
-prim (与源集合相连的权值最小边优先)
-kruskal-(集合中边权值最小优先)
6. 多级调度问题(长作业优先)
原文:http://www.cnblogs.com/yanspecial/p/5636089.html