• 优化算法小结


    优化算法小结

    最优二叉树问题

    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,为零的边即关键活动。
  • 相关阅读:
    git 重命名文件夹
    关于IDEA的Incoming窗口的问题
    mysql替换字段中部分字符串
    IDEA项目改包名改项目名并启动【我】
    IDEA在自带市场安装黑色主题及调整包管理器字体大小【我】
    解决Invalid bound statement (not found)(Mybatis的Mapper绑定问题)
    java中Date日期类型的大小比较
    MyBatis-Plus Wrapper条件构造器查询大全
    idea黑色主题
    python3安装mysqlclient,解决django使用pymysql报错的问题
  • 原文地址:https://www.cnblogs.com/fzlzc/p/11097265.html
Copyright © 2020-2023  润新知