求最小生成树的新算法

news2024/10/23 2:43:19

不管 prim 算法还是 kruskal 算法都基于 “当前可见最短边” 作贪心策略,但这并不适合分布式并行操作,比方说所有节点一起构建最小生成树,这些算法都显得同步开销过大,甚至导出错误的结果。

最近研究并构建最大流多路径传输协议的模型,也懒得翻书,在早上冒大雨跑步时思考,后来发现 STP(Spanning Tree Protocol) 大致上(并非完全一致)也是这思路。分布式环境下必须要并行操作,而这需要一个新路子。

先说基础,连通图中环路上的最大边一定不在最小生成树中。这很容易用反证法证明:
在这里插入图片描述

这也是个自由度问题,因为事情必须这样,不这样就会有不可能的结果。反之,“一个环的最小边一定在最小生成树中” 却不正确。

环最小边不一定在最小生成树,双环叠加时,同一边可以同时最小和最大正负对冲,不能同时保留,但最大边一定不在最小生成树,同时将它们都砍掉可正正叠加,越砍权重越小:
在这里插入图片描述

基于此,只要找到一个环,砍掉它的最大边,砍掉所有环最大边后,事情就成了。

和最短路径树用广度优先遍历策略不同,遍历连通图的过程中发现所有环路,可采用深度优先策略结合回溯,参考 tarjan 算法,大致是下面代码:

def dfs(node, parent, visited, graph, cycle):
    visited[node] = "grey"
    for neigh in graph[node]:
        if visited[neighbor] == "white":
            dfs(neigh, node, visited, graph, cycle)
        elif visited[neigh] == "grey" and neigh != parent:
            # 发现环路,从当前节点到 neighbor 的路径构成一个环
            # 回溯过程中直接冒泡最大边并标记,代码写不好,算了
            cycle.append(list(reverse_path(path[node]) + [node, neigh, weight]))
    visited[node] = "black"

def find_cycles(graph):
    visited = {node: "white" for node in graph}
    cycles = []
    for node in graph:
        if visited[node] == "white":
            dfs(node, None, visited, graph, cycles)
    return cycles

深度优先遍历结束后,直接把所有标记的边砍掉即可,时间复杂度被边数量,回溯深度影响,控制在 O(EV)。有个细节点,如果一条边同时是两个环的最大边,则需要再砍一刀,否则就需要再遍历一次而不可止:
在这里插入图片描述

以上算法只是一个可行性说明,在更普遍场景,这个算法应由多节点并行完成,各节点相互交互转发 [节点,边,权重] 的 list 信息来判断出环路,由最大边所连接节点自行 block 该边。我说的 STP 大致是这个意思,说的就是这。

仍以老图为例,给出一个交互示例,也用几何表示,给出用肉眼识别环路的方法:
在这里插入图片描述

通过交互消息发现环路,自己阻塞端口,这就是 STP 的绝佳实例。而对于上图右边部分,给一个菌类生长形态的类比:
在这里插入图片描述
浙江温州皮鞋湿,下雨进水不会胖。

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

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

相关文章

韩顺平0基础学Java——第27天

p548-568 明天开始坦克大战 Entry 昨天没搞明白的Map、Entry、EntrySet://GPT教的 Map 和 Entry 的关系 1.Map 接口:它定义了一些方法来操作键值对集合。常用的实现类有 HashMap、TreeMap 等。 2. Entry接口:Entry 是 Map 接口的一个嵌…

【高等数学】傅里叶级数

最近刷了会抖音,看到一个非常有趣的现象:傅里叶级数,今天挑了几个视频来供大家学习。 1.傅里叶级数概念 【小崔说数】傅里叶级数专题https://www.bilibili.com/video/BV1Uq4y1q7xk?t117.4 2.傅里叶级数动画 【谜之舒适】12分钟的傅立叶级…

编译原理:语法分析(语法制导翻译)、语义分析(类型检查、中间代码生成)

编译器在做语法分析的过程中,除了回答程序代码的语法是否合法(LL,LR能否接收)外,还需要完成后续的工作(包括构建语法树、类型检查、中间代码生成、目标代码生成),这些后续工作一般都可以通过语法…

国产芯片方案/血氧仪方案SIC88336

血氧仪是用来测量脉率、血氧浓度以及灌注指数的仪器设备,血氧浓度是临床医疗上重要的基础数据之一。如果有条件,人们应该时刻监测自己的血氧饱和度,对自己的健康更加有利。下面是详细知识说明。 一、血氧仪方案开发原理 该方案一种检测方式是…

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion 文章目录 SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion1. 论文背景1.1 通道独立-通道依赖的区别1.2 论文贡献 2. 模型架构2.1 SOFTS的主要架构2.2 STAR 模…

家用洗地机哪个牌子的好用性价比高?热销品牌型号推荐

洗地机在市场上越来越受到人们的欢迎,它能够一次性完成吸尘、拖地和清洗的所有步骤,极大地提高了清洁效率,是减轻人们日常清洁负担的优秀家电,为了避免大家盲信挑选机器,我整理了一份洗地机选购指南,帮助大…

基于MATLAB的误码率与信噪比(附完整代码与分析)

目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 (1)本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…

原子性(juc编程)

原子性 概述:所谓的原子性是指在一次操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行,多个操作是一个不可以分割的整体。 //比如说:你喂你女朋友吃冰淇…

户外LED显示屏的发展历程

户外LED显示屏自其问世以来,经历了显著的发展与变革。其技术不断进步,应用场景逐步扩大,并在广告、信息传播等领域发挥了重要作用。本文将梳理户外LED显示屏的发展历程,重点介绍其技术演进和应用拓展。 早期发展:直插式…

一文带你理清同源和跨域

1、概述 前后端数据交互经常会碰到请求跨域,什么是跨域,为什么需要跨域,以及常用有哪几种跨域方式,这是本文要探讨的内容。 同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。同源策略限制了从同一个源加载的…

海外盲盒小程序搭建过程的最大挑战:文化差异与本地化

一、引言 随着全球化的深入发展,跨境电商和海外市场的拓展成为许多企业的重要战略方向。盲盒小程序作为一种新兴的消费模式,也在海外市场展现出巨大的潜力。然而,在海外搭建盲盒小程序并非易事,文化差异与本地化问题是其搭建过程…

计算最大数位-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第87讲。 计算最大数位&…

Qwen2大模型微调入门实战-命名实体识别(NER)任务(完整代码)

Qwen2是通义千问团队最近开源的大语言模型,由阿里云通义实验室研发。 以Qwen2作为基座大模型,通过指令微调的方式做高精度的命名实体识别(NER),是学习入门LLM微调、建立大模型认知的非常好的任务。 使用LoRA方法训练&…

MySQL快速安装(mysql8.0.30区别之前yum安装)

目录 一.初始化环境并解压 二.创建程序用户管理 三.修改mysql目录和配置文件的权限 四.修改配置文件 五.设置环境变量,申明/宣告mysql命令便于系统识别 六.初始化数据库 七.设置系统识别,进行操作 八.初始化数据库密码 九.用户并设置密码 十.赋…

机器学习模型评估之校准曲线

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我…

STM32 串口通讯

使用STM32的串口通讯,接收串口助手的数据,并且将接收到的数据返回串口,重定义printf功能。 配置引脚信息 由于每次新建工程都需要配置信息,比较麻烦,好在STM32CubeIDE提供了导入.ioc文件的功能,可以帮我们…

达梦8 兼容MySQL语法支持非分组项作为查询列

MySQL 数据库迁移到达梦后,部分GROUP BY语句执行失败,报错如下: 问题原因: 对于Oracle数据库,使用GROUP BY时,SELECT中的非聚合列必须出现在GROUP BY后面,否则就会报上面的错误,达梦…

基于python+tkinter(Gui)的学生信息管理系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

[创业之路-119] :制造业企业的必备管理神器-ERP-主要功能模块说明与系统架构

目录 一、ERP功能的标准化 二、常见的ERP标准化功能 2.1 基础档案 2.2 供应链 2.3 人力资源管理 2.4 资产管理 2.5 生产制造 2.6 财务会计 2.7 管理会计 2.8 CRM客户管理管理 2.9 商业智能分析 三、常见的ERP软件供应商 国内ERP软件供应商 国外ERP软件供应商 四…

2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改

JDBC案例 将来如果完成的话 就代表对JDBC里面的知识点全部融会贯通了 其实就是对数据的增删改查 我们入门做不出来前端的内容 很正常 准备环境 建表 use mybatis;create table tbl_brand (id int primary key auto_increment,brand_name varchar(20),company_name varcha…