• 克鲁斯卡尔(Kruskal)算法详解



    将网构造为图中右边的边集数组结构,并且对它们按权值从小到大排序。如:

    const graph = [
      {
        begin: 4,
        end: 7,
        weight: 7,
      },
      {
        begin: 2,
        end: 8,
        weight: 8,
      },
    ];
    
    注意在无向图中,创建此结构时,每条边的 begin 值应该比 end 小,这样在后面查找是否形成环路的时候会更方便。

    查找过程如下图所示




    概述:通过遍历上面的边集数据结构,从最短的边开始查找,找到边和顶点并记录;继续查找第二短的边和顶点并记录;以此类推;注意在找到一条边时需要查看其两个顶点是否都在已找到的顶点中,如果都在则需要判断这条边是否会形成环路,如果会形成环路则跳过此边继续查找;最终所有的边遍历完成并且没有环路,得到最小生成树。

    查找过程详解:

    1. 这里有9个顶点则创建一个长度为9的数组[null,null,null,null,null,null,null,null,null],数组的索引表示开始节点,值表示结束节点。这个数组是用于查找是否形成环路的重要结构。
    2. 首先我们找到最短的边长7,顶点为4-7,那么我们就在数组中将下标为4的值改为7,表示顶点4入顶点7出。[null,null,null,null,7,null,null,null,null]
    3. 然后找到边长8,顶点为2-8,得到顶点2入顶点8出。[null,null,8,null,7,null,null,null,null]
    4. 继续找到边长10,得到:[1,null,8,null,7,null,null,null,null]
    5. 继续找到边长11,发现边长11的顶点为0-5,而数组中顶点0已有值,那么我们就取其值1,将数组索引1的值改为5,得到:[1,5,8,null,7,null,null,null,null]。也表示从顶点1入可以从顶点5出。
    6. 继续找到边长12,顶点为1-8,从索引1得到5,然后索引5改为8得到:[1,5,8,null,7,8,null,null,null]
    7. 继续找到边长16,有两条,我们分别处理。1-6的,通过索引1得到5,通过索引5得到8,然后将索引8改为6得到:[1,5,8,null,7,8,null,null,6]。另一条3-7,得到:[1,5,8,7,7,8,null,null,6]
    8. 继续找边长17,顶点为5-6,通过索引5得到8,索引8得到6,那么我们将索引6设置为6吗?当然不行,这样就会得到从顶点6入又从顶点6出,自己指向自己,这就形成环路了!所以,边长17这条线pass!
    9. 继续找边长19,顶点为6和7,得到:[1,5,8,7,7,8,7,null,6]
    10. 继续查找,就发现所有的线都会形成环路。最后,上面找到的顶点和线就是最终结果。

  • 相关阅读:
    golang语言特性
    Mysql学习之order by的工作原理
    Mysql聚合函数count(*) 的性能分析
    Mysql的刷脏页问题
    普通索引与唯一索引的选择问题
    Mysql锁的类型与简析
    深入浅出Mysql索引
    Mysql修改语句的运行流程
    Mysql查询语句的运行流程
    Go语言入门之切片的概念
  • 原文地址:https://www.cnblogs.com/3body/p/14607443.html
Copyright © 2020-2023  润新知