无向图的最小生成树

前言

最近在研究使用序列模型来实现图像任务的深度学习,发现将图像数据转换成序列数据总会存在空间位置信息的损失,而图结构能够提供一个很强大的表征方式,因此希望研究一下如何将其进行进一步的应用。

为了深刻的理解图结构,这里从一个最简单的用最小生成树表示无向图的例子进行切入。

什么是无向图

无向图(Undirected Graph)是一种图结构,在这种图中,边(Edge)没有方向性。换句话说,如果存在一条边连接两个顶点(Vertex),则可以从任意一个顶点到达另一个顶点。无向图通常表示为 ( G = (V, E) ),其中:

  • ( V ) 是顶点集合。
  • ( E ) 是边集合,由顶点对组成的集合。

在无向图中,边 ( (u, v) ) 表示顶点 ( u ) 和顶点 ( v ) 之间存在一条边,且 ( (u, v) ) 和 ( (v, u) ) 是等价的。

示例

考虑一个无向图 ( G ) ,其顶点集合 ( V = {1, 2, 3, 4} ) ,边集合 ( E = {(1, 2), (2, 3), (3, 4), (4, 1)} )。这个图可以表示为:

    1 -- 2|    |4 -- 3

无向图的特性

  1. 对称性:如果边 ( (u, v) ) 存在,则边 ( (v, u) ) 也存在。
  2. 度(Degree):一个顶点的度是连接到该顶点的边的数量。
  3. 连通性:如果从图中的任意一个顶点都能到达其他任意一个顶点,则这个图是连通的。

无向图在很多领域都有应用,例如网络拓扑、社交网络分析、生物网络等。

什么是最小生成树

最小生成树(Minimum Spanning Tree,简称 MST)是无向加权图中的一个子图,它包含图中的所有顶点,并且使得所有边的权重之和最小。换句话说,最小生成树是连接图中所有顶点的权重最小的无环子图。

特性

  1. 唯一性:一个无向图可能有多个最小生成树,但对于给定的边权重集合,最小生成树的总权重是唯一的。
  2. 连通性:最小生成树必须包含图中的所有顶点,且是连通的。
  3. 无环性:最小生成树是无环的,否则可以通过去掉环中的某条边来减少总权重。

应用

最小生成树在许多实际问题中有重要应用,例如:

  • 网络设计:设计最小成本的网络连接方案,如电网、通信网络等。
  • 集群分析:在数据聚类中,用最小生成树来找到数据点之间的最短连接路径。
  • 图像处理:在图像分割中,使用最小生成树来连接像素点。

常见算法

  1. Kruskal算法:通过排序所有边并逐步选择不形成环的最小边来构建最小生成树。
  2. Prim算法:从一个顶点开始,逐步选择最小边扩展生成树,直到包括所有顶点。

算法思路

对于一个具有n个顶点的无向图,最多有 n ( n − 1 ) 2 条边 \frac{n(n-1)}{2}条边 2n(n1)条边
举一个具有6个顶点的无向图为例

 (0)-1-(1)| \   |  \5  2  3   3|   \ |    \(2)   (3)-1-(5)\    |    /3   2   4\  |  /(4)

这里设置了9条边,将它表示为列表,并且按照边的权重从小到大排序

[
# (顶点1,顶点2,边权重)
(0, 1, 1),
(3, 5, 1),
(0, 3, 2),
(3, 4, 2),
(1, 5, 3),
(1, 3, 3),
(2, 4, 3),
(4, 5, 4),
(0, 2, 5),
]

利用迭代来找出最小的连通图。

第一轮迭代

选择最小边

对于连通分量0,最小的边是(0, 1, 1)
对于连通分量1,最小的边是(0, 1, 1)
对于连通分量2,最小的边是(2, 4, 3)
对于连通分量3,最小的边是(3, 5, 1)
对于连通分量4,最小的边是(3, 4, 2)
对于连通分量5,最小的边是(3, 5, 1)

合并连通分量

选择(0, 1, 1)合并连通分量0和1。

 (0)-1-(1)(2)   (3)  (5)(4)

选择(3, 5, 1)合并连通分量3和5。

 (0)-1-(1)(2)   (3)-1-(5)(4)

选择(3, 4, 2)合并连通分量3和4。

 (0)-1-(1)(2)   (3)-1-(5)|2|(4)

选择(2, 4, 3)合并连通分量2和4。

 (0)-1-(1)(2)   (3)-1-(5)\    |3   2\  |(4)

更新并查集

第二轮迭代

选择最小边

对于连通分量0-1,最小的边是(0, 3, 2)
对于连通分量2-3-4-5,最小的边是(0, 3, 2)

选择(0, 3, 2)合并连通分量0和3。

 (0)-1-(1)\2\ (2)   (3)-1-(5)\    |3   2\  |(4)

更新并查集,发现所有的顶点都已连通,算法结束

算法实现

class UnionFind:def __init__(self, n):self.parent = list(range(n))self.rank = [0] * ndef find(self, u):if self.parent[u] != u:self.parent[u] = self.find(self.parent[u])return self.parent[u]def union(self, u, v):root_u = self.find(u)root_v = self.find(v)if root_u != root_v:if self.rank[root_u] > self.rank[root_v]:self.parent[root_v] = root_uelif self.rank[root_u] < self.rank[root_v]:self.parent[root_u] = root_velse:self.parent[root_v] = root_uself.rank[root_u] += 1def contractive_boruvka(edges, n):uf = UnionFind(n)mst_edges = []mst_weight = 0iteration = 0while len(mst_edges) < n - 1:iteration += 1print(f"Iteration {iteration}:")# 初始化每个组件的最小边min_edge = [-1] * nfor index, (u, v, weight) in enumerate(edges):root_u = uf.find(u)root_v = uf.find(v)if root_u != root_v:if min_edge[root_u] == -1 or edges[min_edge[root_u]][2] > weight:min_edge[root_u] = indexif min_edge[root_v] == -1 or edges[min_edge[root_v]][2] > weight:min_edge[root_v] = index# 收缩每个组件的最小边for edge_index in min_edge:if edge_index != -1:u, v, weight = edges[edge_index]root_u = uf.find(u)root_v = uf.find(v)if root_u != root_v:uf.union(u, v)mst_edges.append((u, v, weight))mst_weight += weightprint(f"  Connecting {u} - {v} with weight {weight}")print(f"  MST so far: {mst_edges}")print()return mst_edges, mst_weight# 示例使用
edges = [# (顶点1,顶点2,边权重)(0, 1, 1),(3, 5, 1),(0, 3, 2),(3, 4, 2),(1, 5, 3),(1, 3, 3),(2, 4, 3),(4, 5, 4),(0, 2, 5),
]
n = 6mst_edges, mst_weight = contractive_boruvka(edges, n)
print("Final MST edges:", mst_edges)
print("Total weight of MST:", mst_weight)

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

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

相关文章

又缩水Unity7月闪促限时4折活动模块化角色模板编辑器场景美术插件拖尾怪物3D模型UI载具AI对话TPS飞机RPG和FPS202407

Flash Deals are Coming Back! 限时抢购又回来了&#xff01; July 17, 2024 8:00:00 PT to July 24, 2024 7:59:00 PT 太平洋时间 2024 年 7 月 17 日 8&#xff1a;00&#xff1a;00 至 2024 年 7 月 24 日 7&#xff1a;59&#xff1a;00&#xff08;太平洋时间&#xff09;…

云计算实训室的核心功能有哪些?

在当今数字化转型浪潮中&#xff0c;云计算技术作为推动行业变革的关键力量&#xff0c;其重要性不言而喻。唯众&#xff0c;作为教育实训解决方案的领先者&#xff0c;深刻洞察到市场对云计算技能人才的迫切需求&#xff0c;精心打造了云计算实训室。这一实训平台不仅集成了先…

Scala学习笔记17: Try与异常处理

目录 第十七章 Try与异常处理1- 异常的抛出和捕获1. 异常抛出2. 异常捕获 2- 函数式的错误处理1. Try 类型2. 使用 Try3. 处理 Try 结果4. Try 的常用方法5. Try 的优势总结 end 第十七章 Try与异常处理 1- 异常的抛出和捕获 Scala 的异常处理机制与 Java非常相似, 但也有一些…

happens-before

一、简介 happens-before 规定了对共享变量的写操作对其它线程的读操作可见&#xff0c;它是可见性与有序性的一套规则总结&#xff0c;抛开以下 happens-before 规则&#xff0c;JMM 并不能保证一个线程对共享变量的写&#xff0c;对于其它线程对该共享变量的读可见&#xff0…

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号&#xff0c;并且完成实名认证&#xff0c;一般是注册【个人】的身份。中…

网安小贴士(17)认证技术原理应用

前言 认证技术原理及其应用是信息安全领域的重要组成部分&#xff0c;涉及多个方面&#xff0c;包括认证概念、认证依据、认证机制、认证类型以及具体的认证技术方法等。以下是对认证技术原理及应用的详细阐述&#xff1a; 一、认证概述 1. 认证概念 认证是一个实体向另一个实…

Langchain 对pdf,word,txt等不同文件的加载解析

项目中遇到各种数据资源想要加载近langchain构建本地知识ai系统&#xff0c;怎么加载对应的文件格式呢&#xff0c;一起研究下 引入Langchain from langchain.document_loaders import UnstructuredWordDocumentLoader,PyPDFium2Loader,DirectoryLoader,PyPDFLoader,TextLoad…

llama 2 改进之 RMSNorm

RMSNorm 论文&#xff1a;https://openreview.net/pdf?idSygkZ3MTJE Github&#xff1a;https://github.com/bzhangGo/rmsnorm?tabreadme-ov-file 论文假设LayerNorm中的重新居中不变性是可有可无的&#xff0c;并提出了均方根层归一化(RMSNorm)。RMSNorm根据均方根(RMS)将…

redis缓存击穿和缓存穿透的封装、缓存更新的CacheAside方案、数据预热

redis缓存击穿和缓存穿透的封装 一、首先是互斥锁二、封装为工具类三、调用四、数据预热五、缓存更新的CacheAside方案 &#xff08;来源黑马redis&#xff09; 一、首先是互斥锁 //拿到锁private boolean tryLock(String key) {Boolean flag stringRedisTemplate.opsForValue…

降低芯片流片风险的几种方法

[TOC] #说明 该文章仅科普下各方法是如何降低流片失败的可能性的。 #1. UVM方法学 1. uvm方法学的主要思想是通过用其它高级语言&#xff08;python、c等&#xff09;编写参考模型&#xff08;REF&#xff09;实现DUT设计相同功能。再使用uvm的一系列验证组件将相同的激励给…

每天一个数据分析题(四百三十六)- 正态分布

X为服从正态分布的随机变量N(2, 9), 如果P(X>c)P(X<c), 则c的值为&#xff08;&#xff09; A. 3 B. 2 C. 9 D. 2/3 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&…

用ssh tunnel的方式设置 AWS DocumentDB 公网访问

AWS DocumentDB的设定是只允许VPC内进行访问的&#xff0c;同时官方文档给了步骤&#xff0c;通过ssh tunnel的方式&#xff0c;可以从公网&#xff0c;或者从VPC外的网络&#xff0c;对DocumentDB进行访问。 我阅读了AWS官方文档并测试了这个步骤&#xff0c;如下是详细的步骤…

解决npm install(‘proxy‘ config is set properly. See: ‘npm help config‘)失败问题

摘要 重装电脑系统后&#xff0c;使用npm install初始化项目依赖失败了&#xff0c;错误提示&#xff1a;‘proxy’ config is set properly…&#xff0c;具体的错误提示如下图所示&#xff1a; 解决方案 经过报错信息查询解决办法&#xff0c;最终找到了两个比较好的方案&a…

HTTP协议、Wireshark抓包工具、json解析、天气爬虫

HTTP超文本传输协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点&#xff1a; 一发一收…

Transformer中的自注意力是怎么实现的?

在Transformer模型中&#xff0c;自注意力&#xff08;Self-Attention&#xff09;是核心组件&#xff0c;用于捕捉输入序列中不同位置之间的关系。自注意力机制通过计算每个标记与其他所有标记之间的注意力权重&#xff0c;然后根据这些权重对输入序列进行加权求和&#xff0c…

JVM:MAT内存泄漏检测原理

文章目录 一、介绍 一、介绍 MAT提供了称为支配树&#xff08;Dominator Tree&#xff09;的对象图。支配树展示的是对象实例间的支配关系。在对象引用图中&#xff0c;所有指向对象B的路径都经过对象A&#xff0c;则认为对象A支配对象B。 支配树中对象本身占用的空间称之为…

Spire.PDF for .NET【文档操作】演示:如何在 C# 中切换 PDF 层的可见性

我们已经演示了如何使用 Spire.PDF在 C# 中向 PDF 文件添加多个图层以及在 PDF 中删除图层。我们还可以在 Spire.PDF 的帮助下在创建新页面图层时切换 PDF 图层的可见性。在本节中&#xff0c;我们将演示如何在 C# 中切换新 PDF 文档中图层的可见性。 Spire.PDF for .NET 是一…

【LabVIEW作业篇 - 1】:中途停止for和while循环

文章目录 for循环while循环如何使用帮助 for循环 在程序框图中&#xff0c;创建for循环结构&#xff0c;选择for循环&#xff0c;鼠标右键-条件接线端&#xff0c;即出现像while循环中的小红圆心&#xff0c;其作用与while循环相同。 运行结果如下。&#xff08;若随机数>…

分布式搜索引擎ES-Elasticsearch进阶

1.head与postman基于索引的操作 引入概念&#xff1a; 集群健康&#xff1a; green 所有的主分片和副本分片都正常运行。你的集群是100%可用 yellow 所有的主分片都正常运行&#xff0c;但不是所有的副本分片都正常运行。 red 有主分片没能正常运行。 查询es集群健康状态&…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…