优化算法小结

优化算法小结

最优二叉树问题

Huffman算法

  • 算法流程:
    • 找权最小的两个结点s1、s2作为左右孩子;
    • 将s3=s1+s2加入权重集合中,重新挑选权最小的两个;
    • 重复执行即可。
  • 重点:
    • 作图时s3挖空,在圆圈外标权;
    • 编码左0右1;

最小生成树问题

  • 边的权值之和为最小的生成树。

Prim算法

  • 算法流程:
    • 建立点集,加入起始点;
    • 从与起始点相连的边中选权最小的结点加入点集;
    • 循环执行:将所有与点集中的点有联线的未访问点中取权最小的加入点集;
  • 重点:是所有点集点与外边点联线中权最小的。

Kruskal算法

  • 算法流程:
    • 在所有边中,依次添加权值最小的边;
      • 添加规则:它的添加不能产生回路。
    • 如此重复,直至加上 n-1 条边为止。
  • 重点:无回路,且所有边中权最小才能加入。

最短路径问题

Dijkstra算法

  • 基本思想:求出源点到每一个点的最短路径;
  • 算法流程:
    • 记录所有与源点1相连的点及其路径权;
    • 取权最小的点2加入,此时最短即二者连线;
    • 记录所有与点2相连线的权,同时修改之前记录的权,看是从点1直连近还是从点2走更近;
    • 同样取最小的加入,并记此时到点3的权为源点到点3最短距离;
    • 以此类推,逐个加入;
  • 重点:
    • 动态修改权重;
    • 在所有权中取最小的,而非只看与当前点的连线;
    • 最终记录里应该记录修改后的前驱结点;

Floyd算法

  • 基本思想:求得v和j之间的最短路径,通过尝试在vj之间加入别的点;
  • 算法流程:
    • 从 vi 到 vj 的所有可能存在的路径中,选出一条长度最短的路径。
    • vi 到 vj的最短路径应是下述这些路径中长度最小者:
      • 若<vi,vj>存在,则存在路径{vi,vj};//路径中不含其它顶点
      • 若<vi,v1>,<v1,vj>存在,则存在路径{vi,v1,vj};//路径中所含顶点序号不大于1
      • 若{vi,…,v2}, {v2,…,vj}存在,则存在一条路径{vi, …, v2, …vj};//路径中所含顶点序号不大于2
    • 即尝试v到j的所有可能路径并选择权最小的;

关键路径问题

求关键活动

  • 基本思想:操作过程类似Dijkstra算法,但是不同的是记录的是源点到每一个点权重最大的路径;
  • 算法流程
    • 第一阶段略,参考Dijkstra算法,记录源点到每一个点权重最大的情况,记作每个节点的ve,源点记0;
    • 第二阶段:
      • 取第一阶段中权最大的点作为汇点;
      • 查找每一个点到汇点的路径最大权重情况,并用第一阶段的权减去最大权重;
      • 计算结果记作每个节点的vl,源点记0,汇点的vl=ve;
    • 第三阶段:
      • 将每条边列表,记录权值;
      • 查表记录e,e即每条边的起点的ve;
      • 查表计算l,l为每条边终点的vl-这条边的权;
      • 计算l-e,为零的边即关键活动。
posted @ 2019-06-27 15:24  20175214lzc  阅读(256)  评论(0编辑  收藏  举报