• 五、图——图的应用


    最小生成树

      1.定义

      权值和最小的生成树,极小连通子图,包含所有的顶点,尽可能少的边,多一条边就会构成回路,少一条边就会不连通。

      2.求法

      求最小生成树必须解决如下问题:

      1)尽可能选取权值最小的边,并且不构成回路

      2)尽可能使 n 个顶点连接 n - 1 条边连通  

      常见方法有:Prim算法和 Kruskal 算法,他们都是典型的贪心算法

      3.典型算法

    • Prim算法

      过程:始终以顶点为主导,将顶点分为 A 类和 B类,A类是加入最小生成树的顶点,B类是剩下的顶点。初始化的时候,A = {} ,B = {全部}。任意选择一个顶点开始,从起始点开始选择权值最小的边,将这条边和顶点加入最小生成树;然后以加入的顶点再找最小权值的边,跳过已经用过的和成为回路的边,直到所有的顶点。

         适用于:边稠密的,时间复杂度为 O (顶点的平方)

    • kruskal算法

      不断选取权值最下的边,并且判断加入之后不构成回路。

      适用于:顶点稠密但是边稀疏的图

      时间复杂度:用堆来存储边的集合,每次选取最小权值的边是 O (log|E|),时间复杂度是 O (E log|E|)  

      4.应用场景

      几个城市(图1)之间怎么修路,可以使整体上代价最小?

    最短路径

      对于无向图来说,BFS可以查找到 非带权的单源最短路径,这是因为 BFS 总是按照距离由近到远来遍历图中顶点。

      对于有向权值图

      迪杰斯特拉算法(非负权值,单源最短路径)

      逐步将顶点纳入已求得最短路径的顶点。

      时间复杂度:O (|v|2)

      Floyd算法求各顶点之间最短路径问题(每一对点之间的最短路径,允许权值为负的边,但是不允许包含带负权值的边组成的回路)

      n阶方阵;A-1,A0......逐步加入顶点。

      Ak [ i ][ j ]表示从顶点 Vi 到顶点 Vj的路径长度,k表示绕行第 K 个顶点的运算步骤。 

    拓扑排序  

      有向无环图,反映活动的前驱和后继关系的。

    关键路径

      顶点表示事件,边表示活动,边上的权值表示活动开销。

      具有的性质:1)某个顶点,入这个顶点的边代表的活动都发生了,它才可以发生。

            2)这个顶点的事件发生后,以这个顶点出发的有向边代表的活动才可以发生。

      关键路径:从源点到汇点的最长路径的长度,但是它其实是完成工程的最短时间。

      求关键路径的步骤:

      1)事件Vk最早发生的时间Ve(k)

      2)   事件最晚发生时间 Vl(k)

      3)活动的最早开始时间 e(i)

      4)活动的最晚开始时间 l(i)

      5)  d(i) = l (i) - e (i),余量为0,说明活动必须要如期完成,否则会拖延整个工程的进度,它的拖延会拖延整个工程的进度

      

  • 相关阅读:
    日活跃用户统计函数
    统计学习方法(五)——决策树
    统计学习方法(四)——朴素贝叶斯法
    统计学习方法(三)——K近邻法
    统计学习方法(二)——感知机
    Hive UDAF开发之同时计算最大值与最小值
    hive UDAF开发入门和运行过程详解(转)
    Linux操作系统启动流程
    Linux目录的作用
    Linux分区
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12855844.html
Copyright © 2020-2023  润新知