Python 算法高级篇:最小生成树算法的优化与应用

news2025/7/20 6:27:46

Python 算法高级篇:最小生成树算法的优化与应用

  • 引言
  • 1. 最小生成树问题简介
  • 2. Prim 算法
  • 3. Kruskal 算法
  • 4. 优化与比较
  • 5. 案例应用:通信网络设计
  • 6. 总结

引言

最小生成树( Minimum Spanning TreeMST )是图论中的一个重要问题,涉及到在一个加权连通图中找到一棵包含所有节点且边的权重之和最小的树。最小生成树问题在许多实际应用中都有重要作用,例如通信网络设计、电路板布线、城市规划等。在本篇博客中,我们将深入探讨最小生成树算法的优化和应用,主要关注两个著名的算法: Prim 算法和 Kruskal 算法。

😃😄 ❤️ ❤️ ❤️

1. 最小生成树问题简介

最小生成树问题是一个图论问题,通常描述为以下几个步骤:

  • 给定一个带权重的连通图,其中节点表示地点,边表示路径,并带有权重表示路径的代价或距离。
  • 找到一个子图,这个子图是原图的一颗树,包含了所有的节点。
  • 保证这颗树的边的权重之和最小。

最小生成树问题的解可以有多个,但它们都具有相同的特点:包含了所有节点,但是边的权重之和最小。 Prim 算法和 Kruskal 算法是两个用于解决这个问题的经典算法。

2. Prim 算法

Prim 算法以一个起始节点开始,然后逐步将与当前最小生成树集合相连的最短边加入到该集合中。它维护两个集合:一个是已包含在最小生成树中的节点集合,另一个是未包含在其中的节点集合。在每一步中,算法从未包含集合中选择一个节点,并找到连接已包含节点集合和未包含节点集合的最短边。这个边会被添加到最小生成树中,将对应的节点移到已包含集合中。这个过程一直进行,直到已包含集合包含了所有节点为止。

下面是 Prim 算法的 Python 实现:

import heapq

def prim(graph):
    min_spanning_tree = []
    start_node = list(graph.keys())[0]
    visited = set([start_node])
    edges = [
        (cost, start_node, next_node)
        for next_node, cost in graph[start_node].items()
    ]
    heapq.heapify(edges)

    while edges:
        cost, start, next_node = heapq.heappop(edges)
        if next_node not in visited:
            visited.add(next_node)
            min_spanning_tree.append((start, next_node, cost))

            for neighbor, cost in graph[next_node].items():
                if neighbor not in visited:
                    heapq.heappush(edges, (cost, next_node, neighbor))

    return min_spanning_tree

3. Kruskal 算法

Kruskal 算法是另一种常用于解决最小生成树问题的算法。它从边的角度考虑问题,首先对所有边按照权重进行排序,然后从最小权重的边开始,逐渐构建最小生成树。在构建的过程中,它会检查每一条边,如果这条边连接了两个不在同一个连通分量中的节点,就将它加入到最小生成树中,同时将这两个连通分量合并。这个过程一直持续,直到最小生成树包含了所有的节点。

以下是 Kruskal 算法的 Python 实现:

def kruskal(graph):
    min_spanning_tree = []
    edges = []

    for node in graph:
        for neighbor, cost in graph[node].items():
            edges.append((cost, node, neighbor))

    edges.sort()

    parent = {node: node for node in graph}

    def find(node):
        if parent[node] != node:
            parent[node] = find(parent[node])
        return parent[node]

    for cost, node1, node2 in edges:
        if find(node1) != find(node2):
            min_spanning_tree.append((node1, node2, cost))
            parent[find(node1)] = find(node2)

    return min_spanning_tree

4. 优化与比较

Prim 算法和 Kruskal 算法是解决最小生成树问题的两种主要方法,它们在不同的场景中可能表现出不同的性能。通常情况下, Prim 算法在稠密图上效果更好,因为它以节点为中心,适合于连接较多节点的情况。而 Kruskal 算法在稀疏图上通常更快,因为它以边为中心,适合于连接较少节点但边比较多的情况。

可以根据实际情况选择合适的算法。在某些应用中,还可以进行算法的优化,例如使用堆( heap )数据结构来加速 Prim 算法。

5. 案例应用:通信网络设计

假设我们是一家电信公司的工程师,需要为一座城市设计一个通信网络,以便将所有的建筑物都连接到网络中,并使得网络建设成本最低。这是一个最小生成树问题的实际应用。

我们可以将城市的建筑物看作图中的节点,将建筑物之间的距离或建设成本看作边的权重。通过运行 PrimKruskal 算法,我们可以找到一种最经济的方式来连接所有建筑物,从而使得通信网络的建设成本最小。

这是一个实际问题的抽象,最小生成树算法可以帮助我们解决这类问题,不仅在通信网络设计中有用,还在电路板布线、城市规划等众多领域中发挥着关键作用。

6. 总结

最小生成树问题是图论中一个经典的优化问题,通常涉及在加权连通图中找到一棵树,以最小的总权重连接所有节点。 Prim 算法和 Kruskal 算法是解决这个问题的两种主要方法,它们各自在不同的场景中表现出色。

理解和掌握这两种算法以及它们的优化方法对于解决实际问题非常重要。最小生成树问题在通信网络设计、电路板布线、城市规划等领域都有广泛的应用。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

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

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

相关文章

thymeleaf无法加载resources中的静态资源

springbootthymeleaf整合无法加载resources中的静态资源异常处理 打包编译项目,显示找不到js、css等静态资源 重新编译项目加载资源,还是找不到 修改pom.xml资源配置文件 如果设置编码还是打包失败,或者显示找不到js、css、html等静态资源…

Linux 下C++工程编译

创建文件夹 #include<iostream> using namespace std;int main(){cout<<"THis is C program Process!"<<endl;}编译执行命令&#xff1a; g test.cpp -o test实际上&#xff0c;上述的命令包含了如下的四个过程&#xff1a; 1. 预处理 g -E …

【Redis】Redis常用命令-getsetkeysexistsexpirettltype

文章目录 读取文档注意事项set命令get命令全局/通用命令KEYSEXISTSDELEXPIRETTLTYPE 读取文档注意事项 官方文档链接&#xff1a;https://redis.io/ 注意&#xff1a;redis的命令不区分大小写 在redis文档给出的语法格式说明&#xff1a; []&#xff1a;相当于一个独立的单元&a…

(免费领源码)Java#ssm#MySQL高校知识共享系统设计与实现35050-计算机毕业设计项目选题推荐

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对高校知识共享系统等问题&#xff0c;对高校…

uniapp-自定义表格,右边操作栏固定

uniapp-自定义表格&#xff0c;右边操作栏固定 在网上找了一些&#xff0c;没找到特别合适的&#xff0c;收集了一下其他人的思路&#xff0c;基本都是让左边可以滚动&#xff0c;右边定位&#xff0c;自己也尝试写了一下&#xff0c;有点样式上的小bug&#xff0c;还在尝试修…

香港金融科技周2023:AIGC重塑金融形态

10月31日&#xff0c;由香港财经事务及库务局与投资推广署主办的“香港金融科技周2023大湾区专场”盛大启幕。中国AI决策领先企业萨摩耶云科技集团创始人、董事长兼 CEO林建明受邀参加圆桌会议&#xff0c;与中国内地、香港以及全球金融科技行业顶尖人才、创新企业、监管机构和…

Apache Shiro 越权访问漏洞 CVE-2020-1957 漏洞复现

一、漏洞描述 Apache Shiro 是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 CVE-2020-1957&#xff0c;Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时&#xff0c;可以精心构造…

Java入门必刷的基础题1(八道)

目录 1. 第一题 2. 判定一个数字是否是素数 3. 打印 1 - 100 之间所有的素数 4. 输出 1000 - 2000 之间所有的闰年 5. 输出乘法口诀表 6. 求两个正整数的最大公约数 7. 求二进制中 1 的个数 8.分别输出二进制中的奇数位和偶数位 下面的源码大多只有方法体&#xff0c;需…

玩家必备,2款顶级游戏录屏软件!

“游戏怎么录屏呀&#xff1f;最近迷上了网游&#xff0c;觉得自己的游戏技术挺厉害的&#xff0c;想把游戏视频录下来出一个教程&#xff0c;方便给朋友进行参考&#xff0c;但是我不会录屏&#xff0c;大家有没有游戏录屏的软件或者方法推荐一下。” 随着游戏产业的飞速发展…

用二维码搭建设备巡检系统,轻松实现扫码巡检和数字化台账

针对设备状态不透明、纸质记录效率低、故障报修不及时等设备点巡检的常见问题&#xff0c;可以在草料二维码上自主搭建涵盖点检、巡检、报修、维修、保养等功能的管理系统&#xff0c;无需安装APP&#xff0c;微信扫码就能查看设备档案、用表单替代纸质检查表。 譬如“台州沿海…

什么是威廉姆斯的三维结构?澳福详解作用

从心理学视角出发&#xff0c;威廉姆斯将市场视为一个三维结构&#xff0c;包含了时间、价格与交易者的心理三大组成部分。他提出的成功交易策略是“随波逐流&#xff0c;乘风破浪&#xff0c;随波逐流”。为了培养这种思维方式&#xff0c;交易者应学会如何将自身的观念、观点…

虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动

一、故障现象 一辆2012款上汽大众帕萨特车&#xff0c;搭载CFB发动机&#xff0c;累计行驶里程约为12万km。车主反映&#xff0c;将点火开关置于起动挡&#xff0c;偶尔只能听到“咔哒”一声&#xff0c;起动机没有反应&#xff0c;类似蓄电池亏电时起动发动机的现象。为此&…

AI 革命:最佳 txt 转纹理工具

推荐稳定扩散AI自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 游戏产业和人工智能革命 随着人工智能革命迎来一个具有无可比拟潜力的新时代&#xff0c;游戏行业正处于巨大转变的边缘。随着开发人员利用人工智能的力量&#xff0c;他们正在解锁创新方法来增强游戏…

2023年测试工程师想进BAT必须具备的几项素质!

我发现一个奇怪的现象&#xff1a;总是听到身边的程序员朋友谈论BAT&#xff08;中国大陆互联网的三大巨头&#xff1a;百度、阿里、腾讯&#xff09;以及如何进入BAT&#xff0c;却鲜少有测试会去谈论或者考虑这些问题。 我不知道这是为什么&#xff0c;或者我就算知道也只是…

剑指Offer || 084.全排列||

题目 给定一个可包含重复数字的整数集合 nums &#xff0c;按任意顺序 返回它所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

【Git】Git使用指南+上传项目踩坑总结

记录Git 使用和命令解读&#xff1a; git init git add .git commit -m "first commit"git branch -M maingit remote add origin https://github.com/xxx.gitgit push -u origin main 这是最经常用到的使用 git上传项目的代码&#xff0c;值得注意的是&#xff0c…

进程间通信(IPC)

进程间通信概述 进程间通信是指不同进程之间交换或传播信息。进程间通信的方式通常有管道通信、消息队列、信号量、共享存储、Socket、Stream等&#xff0c;其中Socket和Stream支持不同主机上的两个进程间的通信。 管道&#xff08;无名管道&#xff09;&#xff1a; 管道通信…

无需频繁登录支付宝网站即可完成商家转账,实时到账,方便安全快捷

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…

MATLAB中preparets函数用法

目录 语法 说明 示例 准备开环和闭环网络的数据 preparets函数的功能是为网络模拟或训练准备输入和目标时间序列数据 语法 [Xs,Xi,Ai,Ts,EWs,shift] preparets(net,Xnf,Tnf,Tf,EW) 说明 [Xs, Xi, Ai, Ts, EWs, shift] preparets(net, Xnf, Tnf, Tf, EW) 这个函数接受…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…