【数据结构】深入理解Floyd最短路径算法:全面解析及Python实现

文章目录

    • 一、Floyd-Warshall算法简介
    • 二、Floyd-Warshall算法的数学表述
    • 三、Floyd-Warshall算法的Python实现
    • 四、Floyd-Warshall算法的应用场景
    • 五、Floyd-Warshall算法的优缺点
    • 六、优化与改进
    • 七、总结

Floyd-Warshall算法是一种用于解决加权图中最短路径问题的经典算法。该算法可以在 O ( V 3 ) O(\mathbf{V}^3) O(V3)时间复杂度内计算出所有顶点对之间的最短路径,其中 V \mathbf{V} V是图中的顶点数。Floyd-Warshall算法的一个显著特点是其简单且直观的实现过程,非常适合用于教学和理解动态规划的基本概念。本文将详细介绍Floyd-Warshall算法的原理,并通过Python代码实现加深对该算法的理解。

一、Floyd-Warshall算法简介

Floyd-Warshall算法的主要目的是在一个加权图中找出所有顶点对之间的最短路径。其核心思想是通过不断更新路径权重,从而逐步逼近所有顶点对之间的最短路径。

算法的基本步骤如下:

  1. 初始化距离矩阵,直接用图的邻接矩阵表示。如果两个顶点之间有边相连,则用边的权重初始化距离矩阵;如果没有边相连,则初始化为无穷大。
  2. 对于每一个顶点 k \mathbf{k} k,尝试用 k \mathbf{k} k作为中间顶点,更新所有顶点对之间的距离。具体来说,如果从顶点 i \mathbf{i} i到顶点 j \mathbf{j} j的路径经过顶点 k \mathbf{k} k会更短,则更新距离矩阵。
  3. 重复步骤2,直到所有顶点对之间的最短路径都被计算出来。

二、Floyd-Warshall算法的数学表述

Floyd-Warshall算法利用动态规划的思想,设 d ( i , j ) \mathbf{d(i, j)} d(i,j)表示顶点 i \mathbf{i} i到顶点 j \mathbf{j} j的最短路径长度, k \mathbf{k} k表示中间顶点,则 d ( i , j ) \mathbf{d(i, j)} d(i,j)的更新公式为:
d ( i , j ) = min ⁡ ( d ( i , j ) , d ( i , k ) + d ( k , j ) ) \mathbf{d(i, j)} = \min(\mathbf{d(i, j)}, \mathbf{d(i, k)} + \mathbf{d(k, j)}) d(i,j)=min(d(i,j),d(i,k)+d(k,j))
这个公式的含义是,如果通过顶点 k \mathbf{k} k可以使得 i \mathbf{i} i j \mathbf{j} j的路径更短,则更新 d ( i , j ) \mathbf{d(i, j)} d(i,j) d ( i , k ) + d ( k , j ) \mathbf{d(i, k)} + \mathbf{d(k, j)} d(i,k)+d(k,j)

三、Floyd-Warshall算法的Python实现

下面是Floyd-Warshall算法的完整Python实现:

# 初始化无穷大值
INF = float('inf')# Floyd-Warshall算法实现
def floyd_warshall(graph):# 获取顶点数V = len(graph)# 初始化距离矩阵dist = [[INF] * V for _ in range(V)]for i in range(V):for j in range(V):dist[i][j] = graph[i][j]# 核心算法for k in range(V):for i in range(V):for j in range(V):if dist[i][j] > dist[i][k] + dist[k][j]:dist[i][j] = dist[i][k] + dist[k][j]# 处理负权回路的情况for i in range(V):if dist[i][i] < 0:raise ValueError("图中含有负权回路")return dist# 示例图,使用邻接矩阵表示
graph = [[0, 3, INF, 7],[8, 0, 2, INF],[5, INF, 0, 1],[2, INF, INF, 0]
]# 计算最短路径
distances = floyd_warshall(graph)# 打印结果
print("顶点对之间的最短路径距离矩阵:")
for row in distances:print(row)

在上述代码中,graph是使用邻接矩阵表示的图,其中INF表示顶点之间没有直接路径。算法的核心部分通过三重循环更新距离矩阵dist,最终计算出所有顶点对之间的最短路径。

四、Floyd-Warshall算法的应用场景

Floyd-Warshall算法由于其全局性的最短路径计算能力,在多个领域都有广泛的应用。例如:

  1. 交通网络分析:可以用于计算城市中各个地点之间的最短路径,为交通规划提供参考。
  2. 网络路由:在计算机网络中,可以用于寻找数据包在不同节点之间的最短传输路径。
  3. 社交网络分析:可以用于分析社交网络中不同用户之间的关系强度和最短联系路径。

五、Floyd-Warshall算法的优缺点

优点

  1. 简洁易实现:算法逻辑简单,代码实现较为容易。
  2. 全局性最短路径:一次计算可以得到所有顶点对之间的最短路径。

缺点

  1. 时间复杂度高:对于大规模图, O ( V 3 ) O(\mathbf{V}^3) O(V3)的时间复杂度较高,不适用于顶点数特别多的图。
  2. 空间复杂度高:需要存储 V × V \mathbf{V \times V} V×V的距离矩阵,对于大规模图,内存消耗较大。

六、优化与改进

虽然Floyd-Warshall算法在某些场景下有其优势,但在处理大规模图时,性能问题较为突出。以下是几种可能的优化与改进方法:

  1. 稀疏图优化:对于稀疏图,可以采用邻接表来减少空间复杂度。
  2. 多线程并行化:利用现代多核处理器,通过多线程并行化来加速计算过程。
  3. 增量更新:在动态图中,通过增量更新的方法只计算变化部分,提高效率。

七、总结

Floyd-Warshall算法是一种经典的图算法,尽管其时间复杂度较高,但其全局最短路径计算的能力在许多应用中仍然具有重要价值。通过本文的详细介绍和Python代码实现,相信读者能够更好地理解和掌握这一算法。在实际应用中,结合具体场景进行优化和改进,可以进一步提升算法的性能。

希望本文能帮助读者深入理解Floyd-Warshall算法,为解决复杂图问题提供有力的工具。如果有任何疑问或建议,欢迎在评论区交流讨论。

推荐我的相关专栏:

  • python 错误记录
  • python 笔记
  • 数据结构

在这里插入图片描述

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

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

相关文章

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用&#xff0c;keepliaved配置主备抢…

极验设备指纹HarmonyOS 鸿蒙版SDK官方下载

近日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在东莞召开。在大会开幕日的首场主题演讲中&#xff0c;华为宣布当前已有TOP5000应用成为鸿蒙原生应用&#xff0c;350&#xff0b;SDK已适配HarmonyOS NEXT版本。其中&#xff0c;极验作为其重要伙伴&#xff…

JWT令牌详细解析

JWT令牌 前言一、JWT是什么&#xff1f;二、JWT与传统CookieSession的对比三、JWT1. JWT的功能2. JWT的结构3. JWT的使用 前言 主要介绍了SpringBoot集成JWT令牌详细说明,JWT方式校验方式更加简单便捷化&#xff0c;无需通过redis缓存&#xff0c;而是直接根据token取出保存的…

解决C#读取US7ASCII字符集oracle数据库的中文乱码

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;全栈领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、解决方法二、安装System.Data.OleDb连接库三…

隐藏需求缺失的4种解决技巧

在需求分析过程中&#xff0c;隐藏需求的缺失往往会造成项目范围扩张、成本增加&#xff0c;造成延期交付和风险增加等问题&#xff0c;直接影响客户满意度。而隐藏需求的挖掘和确认&#xff0c;有利于优化项目范围&#xff0c;提升产品质量&#xff0c;增强团队信心。 因此&am…

录屏工具哪款好用?精选3款,宝藏分享

“想问一下大家平时都是用哪一款录屏软件啊&#xff1f;感觉现在市面上的录屏软件特别多&#xff0c;但是却一直找不到适合自己的&#xff0c;想看一下大家的宝藏录屏工具都有哪些&#xff0c;求推荐&#xff01;” 在数字化时代的浪潮中&#xff0c;录屏工具如同一把神奇的画…

【机器学习】Scoring Model Scores: 理解、设计与优化评分模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Scoring Model Scores: 理解、设计与优化评分模型引言1. 评分模型的定义与重要性…

什么是大数据信用?它的作用有哪些?怎么查询大数据?

在金融行业中&#xff0c;风险管理是至关重要的一环。传统的信用评估方法主要基于借款人的财务状况和信用历史&#xff0c;但这些信息往往无法全面反映借款人的信用状况。大数据信用的出现为金融风控提供了新的解决方案。 首先&#xff0c;大数据信用可以为金融机构提供更全面的…

ns3-gym入门(三):在opengym基础上实现一个小小的demo

因为官方给的"opengym""opengym-2"这两个例子都很简单&#xff0c;所以自己改了一个demo&#xff0c;把reward-action-state相互影响的关系表现出来 一、准备工作 在ns3.35/scratch目录下创建一个文件夹&#xff1a; &#xff08;后续的运行指令后面都需要…

Excel办公技巧:制作二级联动下拉菜单

分享制作二级联动下拉菜单的方法&#xff0c;即使数据有增删&#xff0c;菜单也能自动更新&#xff01; 可以通过先定义名称&#xff0c;再结合数据验证&#xff0c;来做二级联动下拉菜单。 1. 准备数据 首先&#xff0c;我们需要准备好要进行二级联动下拉菜单的数据&#xff…

【单目3D检测】smoke(1):模型解析

SMOKE是纵目科技在2020年提出的单目3D检测新方法&#xff0c;论文展示了一种新的3D目标检测方法&#xff0c;该方法通过将单个关键点估计与回归3D变量相结合来预测每个检测到的目标3D bounding box。SMOKE延续了centernet的key-point做法&#xff0c;认为2d检测模块是多余的&am…

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…

Spring Web MVC入门(2)(请求2)

目录 1.传递JSON数据 传递JSON对象 2.获取URL中的参数PathVariable 3.上传文件RequestPart 4.获取Cookie/Session (1)获取Cookie 简洁获取Cookie (2)获取Session Sesson读取 简洁获取Session(1) 简洁获取Session(2) 5.获取Header 简洁获取Header 1.传递JSON数据 J…

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里&#xff0c;数据结构就像是一个个五彩斑斓的糖果盒&#xff0c;每一种糖果都有其独特的味道和形状。这些多姿多彩&#xff0c;形状和味道各异的糖果盒子包括了&#xff1a;List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Diction…

深度学习落地实战:识别火车票信息

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

本地多模态看图说话-llava

其中图片为bast64转码&#xff0c;方便json序列化。 其中模型llava为本地ollama运行的模型&#xff0c;如&#xff1a;ollama run llava 还有其它的模型如&#xff1a;llava-phi3&#xff0c;通过phi3微调过的版本。 实际测试下来&#xff0c;发现本地多模型的性能不佳&…

【数智化案例展】某省会城市——轨道交通线网云平台建设

‍ 逸迅科技案例 本项目案例由逸迅科技投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 本项目将打造一个先进的线网指挥中心大数据平台&#xff0c;它将作为这座城市轨道…

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备&#xff0c;专为工业环境下的高速数据传输和远程设备控制而设计&#xff0c;支持多种工业以太网协议&#xff0c;包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…

如何制定高效的媒体公关解决方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体公关解决方案是指企业或组织为提升品牌形象、塑造公众认知、应对危机事件等目的&#xff0c;通过媒体渠道制定并实施的一系列公关策略和行动计划。这一解决方案旨在通过有效的媒体沟…

4. JavaSE ——【移位运算符】

&#x1f4d6; 开场白 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&…