最小生成树 算法

距离我的资格考试只有十天的路程,我决定离开教科书,改回写作。 毕竟,如果我可以解释这些概念,那么我应该能够通过对它们的测试,对吗? 好吧,今天我很有趣地介绍了算法课程中的一个概念:最小生成树。

最小生成树概述

在讨论最小生成树之前,我们需要讨论 。 特别地,无向图是其边缘没有特定方向的图。 换句话说,它是一个具有沿两个方向连接两个节点的边的图:


如果要以特殊方式遍历无向图,则可以构造一棵称为生成树的树。 更具体地说, 生成树是图的子集,其中包含所有顶点而没有任何循环。 作为附加标准,生成树必须覆盖最少数量的边:


但是,如果要将边缘权重添加到无向图,则针对最小边缘数优化树可能不会为我们提供最小生成树。 特别地, 最小生成树是无向加权图的子集,其中包含所有没有任何循环的顶点。 再一次,生成的树必须具有最低的总边缘成本:


最后一点:最小生成树可能不是唯一的。 换句话说,给定图可能有多个最小生成树。 例如,如果边缘ED的成本为4,我们可以选择ED或BD来完成我们的树。

顺便说一句,让我们谈谈本文其余部分的情况。 特别是,我们将研究构造最小生成树的两种算法:Prim算法和Kruskal算法。

最小生成树算法

如前所述,本文的目的是研究两种主要的最小生成树算法。 两种算法都采用贪婪的方法来解决最小生成树问题,但是它们的处理方式略有不同。

普里姆算法

构造最小生成树的一种方法是选择一个起始节点,然后将最便宜的相邻边缘不断添加到树中(避免循环),直到每个节点都已连接为止。 本质上,这就是Prim的算法的工作原理。


在此示例中,我们从A开始并不断扩展树,直到连接了所有节点。 在这种情况下,我们选择AB,然后选择BC,然后选择CD。 最后,我们得到了成本为12的最小生成树。

当然,我们本来可以总是从任何其他节点开始以同一棵树结束。 例如,我们可以从D开始,这将在另一个方向上构建树(DC-> CB-> BA)。

可以想象,这是一个非常简单的贪婪算法,总是构造最小生成树。 当然,需要一些决策来避免产生周期。 就是说,只要新边缘不连接当前树中的两个节点,就不会有任何问题。

克鲁斯卡尔算法

构造最小生成树的另一种方法是在所有可用边(避免循环)中连续选择最小的可用边,直到每个节点都已连接。 自然,这就是Kruskal算法的工作原理。


在此示例中,我们从选择最小边沿开始,在这种情况下为AC。 为了识别这种联系,我们将A和C放在一起。 然后,找到下一个最小边缘AB。 在这种情况下,B尚未包含在包含A的集合中,因此我们可以安全地添加它。

在这一点上,我们遇到了一个问题。 如果选择BC,则将创建一个循环,因为B和C已通过A连接。由于B和C位于同一集合中,因此我们可以安全地跳过该边。

最后,我们考虑下一个最小的边缘,即CD。 由于D没有以某种方式连接到C,我们可以将其添加到包含A,B和C的集合中。由于我们的集合现在包含所有四个顶点,因此可以停止。

不幸的是,这个例子可能不是最好的,因为如果我们从A或C开始,Prim的算法将以类似的方式运行。当然,绘制这些示例会花费一些时间,因此,我建议查看Wikipedia中的Prim和Kruskal算法。 每个页面都有一个漂亮的动画,显示了差异。

就我个人而言,我发现该算法在处理方面更具挑战性,因为我发现回避周期标准不太明显。 就是说,正如我在各种教科书中所看到的那样,该解决方案通常依赖于维护代表不同树的集合中节点的集合。 然后,该算法仅选择两个节点(如果它们在不同的树中)。 否则,在节点之间绘制一条边将创建一个循环。

翻译自: https://www.javacodegeeks.com/2019/09/minimum-spanning-tree-algorithms.html

最小生成树 算法

最小生成树 算法_最小生成树算法相关推荐

  1. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  2. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  3. prim算法_最小生成树(Kruskal和Prim算法)

    文章和资源同步更新至微信公众号:算法工程师之路 8月份会开启每日算法题系列,值得期待哦 上一篇文章,我们讲了图的创建和遍历,其中遍历的算法主要有BFS(广度优先算法)和DFS(深度优先算法)两种,并且 ...

  4. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  5. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

  6. 单链聚类算法_聚类算法总结

    1      什么是聚类算法? 聚类算法就是根据特定的规则,将数据进行分类.分类的输入项是数据的特征,输出项是分类标签,它是无监督的. 常见的聚类规则包括:1)基于原型的,例如有通过质心或中心点聚类, ...

  7. 接受拒绝算法_通过算法拒绝大学学位

    接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...

  8. python序列模式的关联算法_关联算法

    以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...

  9. 编程神奇算法_分类算法的神奇介绍

    编程神奇算法 由Bryan Berend | 2017年3月23日 (by Bryan Berend | March 23, 2017) About Bryan: Bryan is the Lead ...

最新文章

  1. oracle数据库解决system表空间已爆满的问题
  2. oracle 27140,ORA-27140 ORA-27300 ORA-27301
  3. Tomcat源码分析(一)------ 架构
  4. python网络爬虫权威指南 豆瓣_豆瓣Python大牛写的爬虫学习路线图,分享给大家!...
  5. Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
  6. jQuery Mobile主题使用与定制
  7. preempt_disable宏
  8. 天涯明月刀开发_天涯明月刀手游公测上线,斗鱼暗地操作,打造第二个PDD
  9. 赛狐ERP「价格利润试算」——精准定价 保证利润最大化
  10. 那些年常见的前端bug (持续更新)
  11. requests---timeout请求超时
  12. iPhone 12 Pro搭载的LiDAR镜头与ToF镜头区别在哪里
  13. 应用Python把汉语Excel表转换为拼音表格
  14. Android开发--WIFI输入密码Dialog的实现
  15. 怎么调计算机运行内存大小,运行内存太小怎么办?如何扩大电脑的运行内存?...
  16. 中国天气网 天气预报API 国家气象局 根据城市名称抓取城市ID,XML格式、JSON格式、图片代码...
  17. 物联网新零售项目 物联网亿万级通信一站式解决方案EMQ
  18. 安装配置Influxdb
  19. Docker常用的命令记录
  20. 新一代数据库技术论坛-3306π社区广州站

热门文章

  1. 多模型算法理论推导过程
  2. 【雷达通信】基于Matlab GUI中频PD雷达仿真系统【含Matlab源码 1055期】
  3. djgp2gp2-22计算机电缆-高温电缆,djgp1gp1、djggp2、djgp2gp2、djgp2g、djgpg耐高温硅橡胶计算机报价表...
  4. FPGA:生成固化文件(将代码固化到板子上面)
  5. 8种将pdf转化成excel的方法,亲测实用又有效!
  6. 求次方的几种方法(分治、位运算)
  7. 趋势交易策略的买卖点选择,几种趋势介绍
  8. 2017勒索软件威胁形势分析报告
  9. 用Python操作Excel,实现班级成绩的统计
  10. 要想有价值,首先要乐于去解决每一个问题