漫画:什么是最小生成树?


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg


作者 | 小灰

来源 | 程序员小灰

 

640?wx_fmt=jpeg

640?wx_fmt=jpeg



—————  第二天  —————



640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg



————————————



640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


首先看看第一个例子,有下面这样一个带权图:


640?wx_fmt=png


它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


640?wx_fmt=png


去掉那些多余的边,该图的最小生成树如下:


640?wx_fmt=png



下面我们再来看一个更加复杂的带权图:


640?wx_fmt=png


同样道理,下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:


640?wx_fmt=png



去掉那些多余的边,该图的最小生成树如下:


640?wx_fmt=png



640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


怎样铺设才能保证成本最低呢?


城市之间的交通网就像一个连通图,我们并不需要在每两个城市之间都直接进行连接,只需要一个最小生成树,保证所有的城市都有铁路可以触达即可。


640?wx_fmt=png



640?wx_fmt=jpeg


640?wx_fmt=jpeg


Prim算法是如何工作的呢?


这个算法是以图的顶点为基础,从一个初始顶点开始,寻找触达其他顶点权值最小的边,并把该顶点加入到已触达顶点的集合中。当全部顶点都加入到集合时,算法的工作就完成了。Prim算法的本质,是基于贪心算法


接下来说一说最小生成树的存储方式。我们最常见的树的存储方式,是链式存储,每一个节点包含若干孩子节点的指针,每一个孩子节点又包含更多孩子节点的指针:


640?wx_fmt=png


这样的存储结构很清晰,但是也相对麻烦。为了便于操作,我们的最小生成树用一维数组来表达,数组下标所对应的元素,代表该顶点在最小生成树当中的父亲节点。(根节点没有父亲节点,所以元素值是-1)


640?wx_fmt=png



下面让我们来看一看算法的详细过程:


1.选择初始顶点,加入到已触达顶点集合。


640?wx_fmt=png



2.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到2的边权值最小,把顶点2加入到已触达顶点集合,Parents当中,下标2对应的父节点是0。


640?wx_fmt=png


3.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从2到4的边权值最小,把顶点4加入到已触达顶点集合,Parents当中,下标4对应的父节点是2。


640?wx_fmt=png



4.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从0到1的边权值最小,把顶点1加入到已触达顶点集合,Parents当中,下标1对应的父节点是0。


640?wx_fmt=png


5.从已触达顶点出发,寻找到达新顶点的权值最小的边。显然从1到3的边权值最小,把顶点3加入到已触达顶点集合,Parents当中,下标3对应的父节点是1。


640?wx_fmt=png


这样一来,所有顶点都加入到了已触达顶点集合,而最小生成树就存储在Parents数组当中。


640?wx_fmt=jpeg

640?wx_fmt=jpeg


  1. final static int INF = Integer.MAX_VALUE; static int INF = Integer.MAX_VALUE;


  2. public static int[] prim(int[][] matrix){ static int[] prim(int[][] matrix){
  3.     List<Integer> reachedVertexList = new ArrayList<Integer>();List<Integer> reachedVertexList = new ArrayList<Integer>();

  4.     //选择顶点0为初始顶点,放入已触达顶点集合中//选择顶点0为初始顶点,放入已触达顶点集合中
  5.     reachedVertexList.add(0);.add(0);
  6.     //创建最小生成树数组,首元素设为-1//创建最小生成树数组,首元素设为-1
  7.     int[] parents = new int[matrix.length];int[] parents = new int[matrix.length];
  8.     parents[0] = -1;[0] = -1;

  9.     //边的权重//边的权重
  10.     int weight;int weight;
  11.     //源顶点下标//源顶点下标
  12.     int fromIndex = 0;int fromIndex = 0;
  13.     //目标顶点下标//目标顶点下标
  14.     int toIndex = 0;int toIndex = 0;

  15.     while (reachedVertexList.size() < matrix.length) {while (reachedVertexList.size() < matrix.length) {
  16.         weight = INF;= INF;
  17.         //在已触达的顶点中,寻找到达新顶点的最短边//在已触达的顶点中,寻找到达新顶点的最短边
  18.         for (Integer vertexIndex : reachedVertexList) {for (Integer vertexIndex : reachedVertexList) {
  19.             for (int i = 0; i < matrix.length; i++) {for (int i = 0; i < matrix.length; i++) {
  20.                 if (!reachedVertexList.contains(i)) {if (!reachedVertexList.contains(i)) {
  21.                     if (matrix[vertexIndex][i] < weight) {if (matrix[vertexIndex][i] < weight) {
  22.                         fromIndex = vertexIndex;= vertexIndex;
  23.                         toIndex = i;= i;
  24.                         weight = matrix[vertexIndex][i];= matrix[vertexIndex][i];
  25.                     }}
  26.                 }}
  27.             }}
  28.         }}
  29.         //确定了权值最小的目标顶点,放入已触达顶点集合//确定了权值最小的目标顶点,放入已触达顶点集合
  30.         reachedVertexList.add(toIndex);.add(toIndex);
  31.         //放入最小生成树的数组//放入最小生成树的数组
  32.         parents[toIndex] = fromIndex;[toIndex] = fromIndex;
  33.     }}

  34.     return parents;return parents;
  35. }


  36. public static void main(String[] args) { static void main(String[] args) {
  37.     int[][] matrix = new int[][]{int[][] matrix = new int[][]{
  38.             {0, 4, 3, INF, INF},{0, 4, 3, INF, INF},
  39.             {4, 0, 8, 7, INF},{4, 0, 8, 7, INF},
  40.             {3, 8, 0, INF, 1},{3, 8, 0, INF, 1},
  41.             {INF, 7, INF, 0, 9},{INF, 7, INF, 0, 9},
  42.             {INF, INF, 1, 9, 0},{INF, INF, 1, 9, 0},
  43.     };};
  44.     int[] parents = prim(matrix);int[] parents = prim(matrix);
  45.     System.out.println(Arrays.toString(parents));System.out.println(Arrays.toString(parents));
  46. }


这段代码当中,图的存储方式是邻接矩阵,在main函数中作为测试用例的图和对应的邻接矩阵如下:

640?wx_fmt=png


当然,也可以使用邻接表来实现prim算法,有兴趣的小伙伴可以尝试写一下代码。



640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=png

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 屡试不爽的互联网架构三大马车!

  • 2019年技术盘点容器篇(四):来自京东云的技术问答 | 程序员硬核评测

  • 《长安十二时辰》科技梗揭秘!唐朝就能看到 5G 踪影?

  • 天才程序员: "开发 CryptoKitties 难不难? 只需掌握这3点..."

  • 教你如何用Python实现文本摘要模型(附教程)

  • 微软 CTO 韦青:5G 与亚里士多德

  • 什么限制了GNN的能力?首篇探究GNN普适性与局限性的论文出炉!


真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一种基于AliOS Things的uData感知设备软件框架

摘要&#xff1a;   uData框架设计之初的思想是基于传统sensorhub概念基础之上的&#xff0c;结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。 点此查看原文&#xff1a;http://click.aliyun.com/m/40592/ uData诞生背景uDat…

第12篇:Flowable-BPMN操作流程之用户任务UserTask

接上一篇&#xff1a; 第11篇&#xff1a;Flowable-BPMN部署常见问题没有对ACT_RE_PROCDEF表进行插入>操作 https://blog.csdn.net/weixin_40816738/article/details/102902524 文章目录一、定义二、常用配置三、参数赋值四、监听类实现五、BPMN配置六、验证6.1. 创建新流程…

通用智能传感集线器(Sensorhub)介绍

摘要&#xff1a;   智能传感集线器&#xff0c;也称之为Sensor hub&#xff0c;是一种基于低功耗MCU和轻量级RTOS操作系统之上的软硬件结合的解决方案&#xff0c;其主要功能是连接并处理来自各种传感器设备的数据。 点此查看原文&#xff1a;http://click.aliyun.com/m/405…

第13篇: Flowable-BPMN操作流程之流程进展查看之流程图

接上一篇&#xff1a; 第12篇&#xff1a;Flowable-BPMN操作流程之用户任务UserTask https://blog.csdn.net/weixin_40816738/article/details/102902596 文章目录一、背景二、原理三、实现方案3.1. 流程是否完成功能3.2. 完成流程图3.3. 控制器入口四、验证测试4.1. 创建流程4…

阿里云MaxCompute,用计算力让数据发声

摘要&#xff1a; 计算的价值绝不止计算本身&#xff0c;而是让本不会说话的数据发声。 从玛雅历法到圆周率&#xff0c;从万有引力定律到二进制&#xff0c;从固化的物体到虚拟的思维都由数据注入。阿里云大数据计算服务MaxCompute以技术驱动产品&#xff0c;用计算力让数据发…

命令行编译java项目_命令行编译运行java工程(转)

平时建立Java工程都是借助eclipse或intellij这些ide编辑器来构建&#xff0c;对于java工程的实际编译执行原理&#xff0c;从未了解过。作为一个曾经的C程序员&#xff0c;对于源码刨根问底的那份执着从未丢过。于是今天就写了这样的一个例子进行测试。1.首先建立个跟目录MyJav…

面试鹅厂,我三面被虐的体无完肤……

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | codegoose来源 | https://segmentfault.com/a/1190000017864721经过半年的沉淀&#xff0c;加上对MySQL&#xff0c;redis和分布式这块的补齐&#xff0c;终于重拾面试信心&#xff0c;再次出征。鹅厂面试职位&#xff1a;go…

阿里云MaxCompute印度开服,加速大数据产业升级

摘要&#xff1a; 2018年1月18日&#xff0c;阿里云大数据计算服务MaxCompute将在印度正式开服。通过MaxCompute强大的计算能力&#xff0c;阿里云将加速印度大数据产业的全面升级。 点此查看原文&#xff1a;http://click.aliyun.com/m/40728/ 2018年1月18日&#xff0c;阿里云…

第14篇:Flowable-BPMN操作流程之任务完成

接上一篇&#xff1a; 第13篇&#xff1a; Flowable-BPMN操作流程之流程进展查看之流程图 https://blog.csdn.net/weixin_40816738/article/details/102902629 文章目录一、背景二、原理三、API3.1. 直接完成任务3.2. 完成任务并且设置任务参数四、实现4.1. 接口4.2. 接口实现4…

java垃圾回收 分代_Java分代垃圾回收策略原理详解

一、为什么要分代分代的垃圾回收策略&#xff0c;是基于这样一个事实&#xff1a;不同的对象的生命周期是不一样的。因此&#xff0c;不同生命周期的对象可以采取不同的收集方式&#xff0c;以便提高回收效率。在Java程序运行的过程中&#xff0c;会产生大量的对象&#xff0c;…

MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发

摘要&#xff1a; 2017/12/20 北京云栖大会上阿里云MaxCompute发布了最新的功能Python UDF&#xff0c;万众期待的功能终于支持啦&#xff0c;我怎么能不一试为快&#xff0c;今天就分享如何通过Studio进行Python udf开发。 点此查看原文&#xff1a;http://click.aliyun.com/m…

如何填报大数据相关专业? | Alfred数据室

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | AlfredWu来源 | Alfred数据室高考出分了&#xff0c;又是一年一度各位考生和家长手忙脚乱开始填报志愿的时候了。很多考生和家长纷纷咨询Alfred&#xff1a;大数据现在不是很火吗&#xff1f;大数据专业怎么样呀&#xff1f…

第15篇: Flowable-BPMN操作流程之排他网关

接上一篇&#xff1a; 第14篇&#xff1a;Flowable-BPMN操作流程之任务完成 https://blog.csdn.net/weixin_40816738/article/details/102902647 文章目录一、背景二、定义三、流程准备四、流程文件五、控制器六、流程通过验证6.1. 创建新流程6.2. 启动流程6.3. 控制台查看任务…

阿里云视频AI全能力解读

摘要&#xff1a; 结合人工智能视频理解流程和用户的需求场景&#xff0c;我们将视频AI的功能分成四个大部分&#xff0c;视频智能审核、视频内容理解、视频智能编辑、视频版权保护。其中视频审核功能包括视频鉴黄、暴恐涉政识别、广告二维码识别、无意义直播识别等&#xff0c…

阿里云智能视频 AI 重装来袭

摘要&#xff1a; 近日&#xff0c;阿里云重磅推出视频点播新功能——视频AI &#xff0c;基于深度学习、计算机视觉技术和海量数据&#xff0c;为广大用户提供多场景的视频AI服务。 点此查看原文&#xff1a;http://click.aliyun.com/m/40809/ 近日&#xff0c;阿里云重磅推出…

Hadoop精华问答 | Hadoop框架中最核心的设计是什么?

Hadoop能够进行大批量数据的离线处理,但是在实时计算上的表现实在是不尽如人意;而Storm就可以担当这部分的角色&#xff0c;今天&#xff0c;就让我们看看关于Storm的精华问答吧。1Q&#xff1a;hadoop发展史A&#xff1a;2Q&#xff1a;Hadoop 有哪些优点&#xff1f;A&#x…

SpringBoot2.x整合Swagger2 实现API文档实时生成

我们提供Restful接口的时候&#xff0c;API文档是尤为的重要&#xff0c;它承载着对接口的定义&#xff0c;描述等&#xff0c;本文主要介绍了SpringBoot集成Swagger2生成接口文档的方法示例&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 我们提供Restful接口的时候&a…

阿里云 ESS 弹性伸缩服务新功能来袭,更全面、更自动化的使用体验

摘要&#xff1a; 2017年9月阿里云弹性伸缩服务伸缩配置新增了实例自定义数据、秘钥对、实例RAM角色、标签新特性&#xff1b;近日&#xff0c;阿里云又发布了VSWitchIds.N多可用区新特性。 点此查看原文&#xff1a;http://click.aliyun.com/m/40810/ 弹性伸缩是一种根据业务需…

java 提取轮廓_TensorFlow 卷积操作模拟sobel算子提取图像轮廓

注意&#xff1a;sobel算子不保证结果在0-255&#xff0c;需要做一次归一化处理&#xff0c;再乘以255输出的数据shape与图像的shape不一样&#xff0c;需要一次转化效果代码import matplotlib.pyplot as plt # plt 用于显示图片import matplotlib.image as mpimg # mpimg 用于…

阿里云MaxCompute(大数据)公开数据集---带你玩转人工智能

摘要&#xff1a; 目前阿里云大数据产品已经免费向全部用户开放了多种公用数据集。开放的数据类别包括&#xff1a;股票价格数据&#xff0c;房产信息&#xff0c;影视及其票房数据。 点此查看原文&#xff1a;http://click.aliyun.com/m/40813/ 目前阿里云MaxCompute大数据产品…