计算机领域里的经典算法思想
- 贪婪算法
用贪婪算法解决的问题至少有一个最优的解决方案。
在问题的求解过程中可以建立两个集合,一个集合(不妨设为a)由已经被选出的符合问题要求的候选解组成,另一个集合(不妨设为b)由已经选出的但不能导出最优解的候选解组成
集合a最终包含一个解
可以用于贪婪思想解决的经典问题包括:
带权图的最小生成树问题(Kruskal算法及Prim算法)
带权图的最短路径问题(Dijkstra算法)
背包问题
Huffman树编码问题
- 分治算法
整个问题可以分解为两个或多个规模较小的子问题
对每个子问题的求解类似于对整个问题的求解
如果子问题的规模仍然比较大,可以继续对子问题进行分治求解
分治法和递归的思想是紧密相连的
分治法的通用模板:
function DivideToConquer(x)
{
if(x足够小足够简单){求解x,return}
else
{
把问题分解为子问题x1,x2,x3,....,xn
for(int i=0;i<n;i++)
求解xi,即调用DivideToConquer(xi);
}
}
分治法求解的经典问题:
传染病问题二分搜索
快速排序
二路归并排序
汉诺塔问题
- 动态规划
自底向上,避免对同样的问题进行二次求解
适用于动态规划的问题需要解决大量重复性的问题,计算大量重复的数值
至少有一些新的数值可以通过已经计算出来的数值组合出来
使用分治法划分子问题时,子问题之间的界限是模糊不清的,有互相交叉
能够用于动态规划求解的经典问题:
快速傅里叶变换算法
多边形的最优分割
最短路径问题
0-1背包问题
DNA序列比对问题
链式矩阵乘法
- 回溯法
回溯法的本质是进行深度优先搜索,在应用时必须有一个栈(可能编译器隐形地建立了一个栈)保存搜索的路径
问题可以划分为几个不相关的子问题
几个子问题有类似的求解方式
如果子问题可以继续划分,继续划分
可以用于回溯法求解的经典问题:
迷宫问题
图的深度优先搜索
N皇后问题
旅行商销售问题
- 概率算法
- 分支限界
posted on 2012-07-11 13:39 edward1992 阅读(482) 评论(0) 收藏 举报