Python 算法高级篇:最短路径算法的优化

news2025/6/30 22:34:30

Python 算法高级篇:最短路径算法的优化

  • 引言
  • 1. Dijkstra 算法
  • 2. Bellman-Ford 算法
  • 3. SPFA 算法
  • 4. 优化与比较
  • 5. 案例分析:地理导航
  • 6. 总结

引言

最短路径算法是图算法中的一个重要领域,它用于查找从一个起始节点到目标节点的最短路径。在这篇博客中,我们将深入探讨三种最短路径算法的优化: Dijkstra 算法、 Bellman-Ford 算法和 SPFA 算法。这些算法在各种实际应用中都发挥着关键作用,从网络路由到地理信息系统,再到社交网络分析。

😃😄 ❤️ ❤️ ❤️

1. Dijkstra 算法

Dijkstra 算法用于解决从一个节点到所有其他节点的最短路径问题,但要求边的权重为非负数。该算法维护一个距离表,通过不断选择距离最短的节点来更新表中的距离值。

下面是 Dijkstra 算法的 Python 实现:

import heapq

def dijkstra(graph, start):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    queue = [(0, start)]

    while queue:
        current_distance, current_node = heapq.heappop(queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight

            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(queue, (distance, neighbor))

    return distances

2. Bellman-Ford 算法

Bellman-Ford 算法可以处理带有负权边的图,它通过迭代松弛操作来查找最短路径。在每轮迭代中,它遍历所有边,不断更新节点的距离值,直到收敛为止。

以下是 Bellman-Ford 算法的 Python 实现:

def bellman_ford(graph, start):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0

    for _ in range(len(graph) - 1):
        for node in graph:
            for neighbor, weight in graph[node].items():
                if distances[node] + weight < distances[neighbor]:
                    distances[neighbor] = distances[node] + weight

    return distances

3. SPFA 算法

SPFAShortest Path Faster Algorithm )是一种基于队列的最短路径算法,类似于 Bellman-Ford 算法,但它通过维护一个队列来避免不必要的松弛操作,从而提高了效率。

以下是 SPFA 算法的 Python 实现:

from collections import deque

def spfa(graph, start):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    queue = deque([start])
    in_queue = {node: False for node in graph}
    in_queue[start] = True

    while queue:
        node = queue.popleft()
        in_queue[node] = False

        for neighbor, weight in graph[node].items():
            if distances[node] + weight < distances[neighbor]:
                distances[neighbor] = distances[node] + weight
                if not in_queue[neighbor]:
                    queue.append(neighbor)
                    in_queue[neighbor] = True

    return distances

4. 优化与比较

Dijkstra 算法适用于非负权边的图, Bellman-Ford 算法适用于带负权边的图,而 SPFA 算法是 Bellman-Ford 算法的一种优化版本,用于提高效率。在实际应用中,你应该根据具体问题的特点来选择合适的算法。

5. 案例分析:地理导航

让我们通过一个案例来说明最短路径算法的应用。假设我们正在开发一个地理导航应用,希望帮助用户找到从一个地点到另一个地点的最短路径。我们可以使用上述算法来解决这个问题。

首先,我们需要将地理区域建模成一个图,其中节点表示地点,边表示道路或路径,边的权重可以表示距离或时间。用户可以通过输入起始地点和目的地来触发算法,然后我们可以使用 DijkstraBellman-FordSPFA 算法来计算最短路径。

这些算法不仅可以用于道路导航,还可以用于网络路由、飞行航线规划、物流等各种领域。

6. 总结

最短路径算法是图算法中的一个核心领域,具有广泛的应用。 Dijkstra 算法、 Bellman-Ford 算法和 SPFA 算法分别适用于不同类型的图,并且在解决最短路径问题时发挥着关键作用。理解这些算法的原理和实现有助于解决各种实际问题,从地理导航到网络路由。

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

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

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

相关文章

2.1 点纹理背景

快速复制——设置背景纹理 然后填充为淡蓝色&#xff0c;无轮廓&#xff0c;纹理背景就做好了

阿里云2023年双11活动,云服务器价格出炉,2核2G云服务器99元/年!

阿里云2023年双11期间推出了金秋云创季活动&#xff0c;新老用户均可领取上云满减券礼包&#xff0c;单笔订单最高减2400元&#xff0c;还有多款爆品超低折扣&#xff0c;2核2G云服务器99元/年&#xff0c;续费不涨价&#xff0c;新老用户同享&#xff01; 一、阿里云双11活动地…

arcgispro中机器学习部分

参考链接 arcgis.learn 模块 |ArcGIS API for Python arcgis包位置 安装路径\GeoScene\Pro\bin\Python\envs\arcgispro-py3\Lib\site-package\arcgis 以automl进行训练工具为例&#xff0c;工具导入模块中涉及机器学习的模块 该模块所在位置 安装路径\GeoScene\Pro\bin\Py…

解决ping: www.baidu.com: Name or service not known

配置了静态ip后&#xff0c;ping不通外网的问题 1、修改网络配置文件 修改你所用的网卡的配置信息&#xff1a;主要配置红框的内容 ONBOOTyes DNS1114.114.114.114 DNS28.8.8.82、重启网络服务systemctl restart network 3、修改DNS配置文件 修改&#xff1a;vi /etc/reso…

6西格玛质量标准: 提升业务效率的关键

在现代竞争激烈的商业环境中&#xff0c;企业需要不断提高效率&#xff0c;降低成本&#xff0c;同时确保产品和服务的质量。为了达到这个目标&#xff0c;许多企业已经转向了6西格玛质量标准。这个方法旨在通过最小化缺陷和提高流程稳定性来优化业务运作&#xff0c;为客户提供…

2.3.2 交换机的STP技术

实验2.3.2 交换机的STP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置。2.开启交换机的STP。3.配置SW3A和SW3B上STP的优先级。将SW3A配置为根交换机&#xff0c;SW3B配置为备用根交换机。 六、任务验收七、任务小结 一、任务描述 由于…

【C++】引用(取别名)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 引用 1. 引用概念2. 引用特…

要是能重来,你还会选择程序员吗?

昨天面试了2个应届毕业生&#xff0c;一男一女&#xff0c;男的我觉得技术还可以&#xff0c;就录了&#xff0c;女的没有通过&#xff0c;完事后我去厕所边上的楼道抽烟&#xff0c;却发现女孩子蹲在地上哭的一塌糊涂。 我听得很清楚她跟那个男同学说的话&#xff0c;她已经忘…

双亲委派模式

双亲委派模型 双亲委派的工作过程 一个类加载器收到类加载的请求时&#xff0c;它不会马上加载该类&#xff0c;而是把这个请求委托给父加载器去完成&#xff0c;每一个层次的类加载器都是如此&#xff0c;因此所有的类加载请求都必须先通过启动类加载器尝试加载&#xff0c;只…

【mysql】单表数据量过大解决方案

文章目录 背景问题方案数据库冷热数据分离方案 背景 包装码表单表数据量很大&#xff0c;造成查询瓶颈&#xff1b;目前单表数据量达到3000w&#xff0c;单表字段数16 问题 索引膨胀&#xff0c;查询耗时长&#xff0c;影响正常CRUD … 方案 ● 分区 按日期…范围&#x…

python manage.py createsuperuser运行错误

我做思念作笺&#xff0c;随风而去&#xff0c;落在你常路过的那个街角… 错误复现 PS D:\教学文件\Django\djangoProject\webDemo02> python manage.py createsuperuser System check identified some issues:WARNINGS: ?: (urls.W005) URL namespace admin isnt unique…

如何选择最适合的技术栈来进行外卖App系统开发?

选择合适的技术栈对于外卖App系统的开发至关重要。以下是针对不同方面的考量&#xff1a; 1. 后端开发 对于后端开发&#xff0c;选择一个稳定、高效的框架是关键。Node.js、Python&#xff08;Django或Flask&#xff09;、Ruby on Rails等都是流行的选择。举例&#xff0c;…

【unity/vufornia】Duplicate virtual buttons with name.../同一个ImageTarget上多个按钮失灵

问题&#xff1a;在同一个ImageTarget上添加多个按钮时无法触发对应按钮的事件。 解决过程&#xff1a; 1.查看报错&#xff1a;“Duplicate virtual buttons with name...”这一行&#xff0c;顾名思义&#xff0c;命名重复。 2.英文搜索到以下文章&#xff0c;应该在inspe…

思维训练第一课 倒装句

系列文章目录 文章目录 系列文章目录前言一、什么是倒装二、倒装的几种情况1、在以here&#xff0c;there或out&#xff0c;in,up,down,away等小品副词开头的句子里表示强调或修辞需要。但主语是人称代词的时候&#xff0c;主语和谓语的语序不变&#xff0c;当然副词依然放开头…

阿里云CTO周靖人:打造一朵AI时代最开放的云

10月31日&#xff0c;在2023云栖大会上&#xff0c;阿里云CTO周靖人表示&#xff0c;面向智能时代&#xff0c;阿里云将通过从底层算力到AI平台再到模型服务的全栈技术创新&#xff0c;升级云计算体系&#xff0c;打造一朵AI时代最开放的云。在现场&#xff0c;周靖人公布了云计…

SMTP邮件发送图片-如何在github中存储图片并访问

之前写了一篇文章 Go&#xff1a;实现SMTP邮件发送订阅功能&#xff08;包含163邮箱、163企业邮箱、谷歌gmail邮箱&#xff09;&#xff0c;实现了通过邮箱服务来发送邮件&#xff0c;但都是文字内容&#xff0c;要是想实现邮件发送图片&#xff0c;就需要将图片放到公网可访问…

全链路压力测试的目的在于哪儿?

全链路压力测试(End-to-End Load Testing)是一种关键的性能测试方法&#xff0c;旨在评估一个应用程序或系统在真实使用情况下的性能表现。这种类型的测试模拟了用户在应用程序的各个组成部分之间执行各种操作的情景&#xff0c;以便了解系统在高负载下的表现如何。本文将介绍全…

同步异步 阻塞非阻塞

同步/异步 阻塞/非阻塞 IO一般有两个阶段&#xff1a;数据就绪和数据读写。 数据就绪&#xff1a;根据系统IO操作的就绪状态。 阻塞非阻塞 数据读写&#xff1a;根据应用程序和内核的交互方式。 同步异步 陈硕&#xff1a;在处理IO的时&#xff0c;阻塞和非阻塞都是同步IO…

光伏储能充电桩一体化能量管理系统-安科瑞黄安南

一.背景与需求 随着全球能源危机、用能增加以及新能源技术的增加&#xff0c;新能源发电越来越广&#xff0c;并逐步形成新型能源与电力市场&#xff0c;但新能源的能量密度普遍偏低&#xff0c;进行大功率发电还需要挑选适合的位置场地&#xff0c;因此属于间歇式电源。而微电…

Python与Pycharm的安装与使用

1. Python下载与安装 python官网&#xff1a;链接 Python下载&#xff1a;各版本下载链接 1.1 Python下载 1、首先进入下载页面&#xff0c;选择一个版本下载&#xff0c;这里以Python3.7为例 2、点击下载&#xff0c;随后得到对应安装包 1.2 Python安装 1、双击进行软件…