计算机领域里的经典算法思想

  1. 贪婪算法

    用贪婪算法解决的问题至少有一个最优的解决方案。

    在问题的求解过程中可以建立两个集合,一个集合(不妨设为a)由已经被选出的符合问题要求的候选解组成,另一个集合(不妨设为b)由已经选出的但不能导出最优解的候选解组成

    集合a最终包含一个解

    可以用于贪婪思想解决的经典问题包括:

    带权图的最小生成树问题(Kruskal算法及Prim算法)

    带权图的最短路径问题(Dijkstra算法)

    背包问题

    Huffman树编码问题

     

  2. 分治算法

    整个问题可以分解为两个或多个规模较小的子问题

    对每个子问题的求解类似于对整个问题的求解

    如果子问题的规模仍然比较大,可以继续对子问题进行分治求解

    分治法和递归的思想是紧密相连的

    分治法的通用模板:

    function DivideToConquer(x)

    {

      if(x足够小足够简单){求解x,return}

    else

    {

      把问题分解为子问题x1,x2,x3,....,xn

      for(int i=0;i<n;i++)

      求解xi,即调用DivideToConquer(xi);

    }

    }

     

    分治法求解的经典问题:

    传染病问题

    二分搜索

    快速排序

    二路归并排序

    汉诺塔问题

     

  3. 动态规划

    自底向上,避免对同样的问题进行二次求解

    适用于动态规划的问题需要解决大量重复性的问题,计算大量重复的数值

    至少有一些新的数值可以通过已经计算出来的数值组合出来

    使用分治法划分子问题时,子问题之间的界限是模糊不清的,有互相交叉

    能够用于动态规划求解的经典问题:

    快速傅里叶变换算法

    多边形的最优分割

    最短路径问题

    0-1背包问题

    DNA序列比对问题

    链式矩阵乘法

     

     

  4. 回溯法

    回溯法的本质是进行深度优先搜索,在应用时必须有一个栈(可能编译器隐形地建立了一个栈)保存搜索的路径

    问题可以划分为几个不相关的子问题

    几个子问题有类似的求解方式

    如果子问题可以继续划分,继续划分

     

    可以用于回溯法求解的经典问题:

    迷宫问题

    图的深度优先搜索

    N皇后问题

    旅行商销售问题

     

     

  5. 概率算法

     

     

  6. 分支限界

 

 

posted on 2012-07-11 13:39  edward1992  阅读(482)  评论(0)    收藏  举报

导航