最小生成树 算法_最小生成树算法
最小生成树 算法
距离我的资格考试只有十天的路程,我决定离开教科书,改回写作。 毕竟,如果我可以解释这些概念,那么我应该能够通过对它们的测试,对吗? 好吧,今天我很有趣地介绍了算法课程中的一个概念:最小生成树。
最小生成树概述
在讨论最小生成树之前,我们需要讨论图 。 特别地,无向图是其边缘没有特定方向的图。 换句话说,它是一个具有沿两个方向连接两个节点的边的图:
如果要以特殊方式遍历无向图,则可以构造一棵称为生成树的树。 更具体地说, 生成树是图的子集,其中包含所有顶点而没有任何循环。 作为附加标准,生成树必须覆盖最少数量的边:
但是,如果要将边缘权重添加到无向图,则针对最小边缘数优化树可能不会为我们提供最小生成树。 特别地, 最小生成树是无向加权图的子集,其中包含所有没有任何循环的顶点。 再一次,生成的树必须具有最低的总边缘成本:
最后一点:最小生成树可能不是唯一的。 换句话说,给定图可能有多个最小生成树。 例如,如果边缘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
最小生成树 算法
最小生成树 算法_最小生成树算法相关推荐
- 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 ...
- 常用十大算法_回溯算法
回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...
- prim算法_最小生成树(Kruskal和Prim算法)
文章和资源同步更新至微信公众号:算法工程师之路 8月份会开启每日算法题系列,值得期待哦 上一篇文章,我们讲了图的创建和遍历,其中遍历的算法主要有BFS(广度优先算法)和DFS(深度优先算法)两种,并且 ...
- prim算法_贪心算法详解(附例题)
贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...
- java调度问题的贪心算法_贪心算法——换酒问题
知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...
- 单链聚类算法_聚类算法总结
1 什么是聚类算法? 聚类算法就是根据特定的规则,将数据进行分类.分类的输入项是数据的特征,输出项是分类标签,它是无监督的. 常见的聚类规则包括:1)基于原型的,例如有通过质心或中心点聚类, ...
- 接受拒绝算法_通过算法拒绝大学学位
接受拒绝算法 数据科学 (Data Science) Nina was close to tears when she accused Nick Gibb of ruining her life. N ...
- python序列模式的关联算法_关联算法
以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...
- 编程神奇算法_分类算法的神奇介绍
编程神奇算法 由Bryan Berend | 2017年3月23日 (by Bryan Berend | March 23, 2017) About Bryan: Bryan is the Lead ...
最新文章
- oracle数据库解决system表空间已爆满的问题
- oracle 27140,ORA-27140 ORA-27300 ORA-27301
- Tomcat源码分析(一)------ 架构
- python网络爬虫权威指南 豆瓣_豆瓣Python大牛写的爬虫学习路线图,分享给大家!...
- Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)
- jQuery Mobile主题使用与定制
- preempt_disable宏
- 天涯明月刀开发_天涯明月刀手游公测上线,斗鱼暗地操作,打造第二个PDD
- 赛狐ERP「价格利润试算」——精准定价 保证利润最大化
- 那些年常见的前端bug (持续更新)
- requests---timeout请求超时
- iPhone 12 Pro搭载的LiDAR镜头与ToF镜头区别在哪里
- 应用Python把汉语Excel表转换为拼音表格
- Android开发--WIFI输入密码Dialog的实现
- 怎么调计算机运行内存大小,运行内存太小怎么办?如何扩大电脑的运行内存?...
- 中国天气网 天气预报API 国家气象局 根据城市名称抓取城市ID,XML格式、JSON格式、图片代码...
- 物联网新零售项目 物联网亿万级通信一站式解决方案EMQ
- 安装配置Influxdb
- Docker常用的命令记录
- 新一代数据库技术论坛-3306π社区广州站
热门文章
- 多模型算法理论推导过程
- 【雷达通信】基于Matlab GUI中频PD雷达仿真系统【含Matlab源码 1055期】
- djgp2gp2-22计算机电缆-高温电缆,djgp1gp1、djggp2、djgp2gp2、djgp2g、djgpg耐高温硅橡胶计算机报价表...
- FPGA:生成固化文件(将代码固化到板子上面)
- 8种将pdf转化成excel的方法,亲测实用又有效!
- 求次方的几种方法(分治、位运算)
- 趋势交易策略的买卖点选择,几种趋势介绍
- 2017勒索软件威胁形势分析报告
- 用Python操作Excel,实现班级成绩的统计
- 要想有价值,首先要乐于去解决每一个问题