更弱智的算法学习 day59
Dijkstra算法的堆优化版本是针对其朴素算法效率不足的改进特别适用于稀疏图​边数远小于顶点数平方的图。下面我将从算法思想和代码实现两方面进行解释。算法思想Dijkstra算法用于求解单源最短路径问题即从给定的起点出发计算其到图中所有其他顶点的最短路径。它的核心是贪心策略基本步骤如下​初始化​将起点到自身的距离设为0到其他所有顶点的距离初始化为无穷大。​选择未访问最近节点​从所有尚未确定最短路径的顶点中选出当前距离起点最近的一个。​松弛操作​对于刚选出的这个顶点的所有邻居检查是否存在一条通过当前顶点到达该邻居的更短路径。如果有则更新该邻居顶点的最短距离。​标记已访问​将当前顶点标记为已处理其最短距离已确定。​重复​重复步骤2-4直到所有顶点都被处理完毕。在朴素Dijkstra算法中步骤2“选择未访问最近节点”是通过遍历所有未访问节点来实现的这使得其时间复杂度为O(n²)。当顶点数量n很大时效率较低。​堆优化的核心思想在于使用一个最小堆优先队列​​ 来维护所有当前“距离起点距离已知但尚未最终确定”的顶点。堆顶元素始终是当前距离最小的顶点。这样步骤2中获取最小距离节点的操作时间复杂度可以从O(n)降低到O(1)获取堆顶而每次调整堆插入或删除的时间复杂度为O(log n)从而将算法的整体时间复杂度优化到O((n m) log n)其中m是边的数量。代码实现解析import heapq class Edge: def __init__(self, to, val): self.to to # 这条边指向的顶点 self.val val # 边的权重 def dijkstra(n, m, edges, start, end): # 1. 图的构建使用邻接表 grid [[] for _ in range(n 1)] for p1, p2, val in edges: grid[p1].append(Edge(p2, val)) # 存储从p1出发到p2的边 # 2. 初始化数据结构 minDist [float(inf)] * (n 1) # 记录起点到每个顶点的最短距离估计值 visited [False] * (n 1) # 标记顶点是否已确定最短距离 pq [] # 最小堆优先队列 # 起点初始化 minDist[start] 0 heapq.heappush(pq, (0, start)) # 将起点(距离0, 顶点编号)入堆 # 3. 主循环 while pq: # 3.1 取出当前距离起点最近的未访问顶点 cur_dist, cur_node heapq.heappop(pq) # 关键优化如果该顶点已被处理过则跳过由于堆中可能存在同一顶点的多个历史距离 if visited[cur_node]: continue # 标记当前顶点为已访问此时cur_dist就是它的最终最短距离 visited[cur_node] True # 3.2 松弛操作遍历当前顶点的所有邻居 for edge in grid[cur_node]: # 如果邻居未被访问且通过当前顶点到达邻居的距离更短 if not visited[edge.to] and cur_dist edge.val minDist[edge.to]: # 更新邻居的最短距离估计值 minDist[edge.to] cur_dist edge.val # 将新的距离和邻居顶点入堆。注意这里入堆的是新的估计值旧的估计值依然在堆中但会被上面的continue跳过。 heapq.heappush(pq, (minDist[edge.to], edge.to)) # 返回起点到终点的最短距离若不可达则返回-1 return -1 if minDist[end] float(inf) else minDist[end]核心要点与优化解释​邻接表 (grid)​​使用邻接表而非邻接矩阵来存储图特别适合边数较少的稀疏图节省空间。​最小堆 (pq)​​heapq模块实现了最小堆。堆中的元素是元组(distance, node)。Python比较元组时按顺序比较因此以距离作为第一项能保证堆总是按距离从小到大排序。​visited数组的重要性​这是避免重复处理的关键。当一个顶点从堆中弹出时如果它已经被标记为visited说明有更短的路径已经确定了它的距离当前弹出的这个可能更大的距离记录就是无效的直接跳过。​冗余入堆​代码中在更新一个邻居的距离后会直接将其新距离入堆而不是先删除堆中该邻居的旧距离。这会导致堆中可能存在同一个顶点的多个不同距离记录。这是一种常见的“惰性删除”优化虽然增加了堆的大小但避免了复杂的堆内元素修改操作在实践中通常更高效。最终的正确性由visited数组和出堆时的检查来保证。Bellman-Ford 算法是解决带负权边的有向图单源最短路径问题的一种经典算法。下面我将结合你提供的代码详细解释其原理和实现。⚙️ 算法核心思想Bellman-Ford 算法通过动态规划和松弛操作来求解最短路径。其核心步骤是进行最多V-1轮V 为顶点数的松弛操作确保找到从源点到所有其他顶点的最短路径。如果图中存在从源点可达的负权环算法能够检测出来。​关键特性​​处理负权边​与 Dijkstra 算法不同Bellman-Ford 允许图中包含负权重的边。​检测负权环​通过额外的松弛操作可以判断图中是否存在负权环。​简单路径限制​最短路径最多包含V-1条边因此最多需要V-1轮松弛。算法流程与代码解析以下流程图展示了 Bellman-Ford 算法的主要步骤和你代码中的关键逻辑对应你提供的代码其执行过程如下1. 初始化距离数组minDist [float(inf)] * (n 1) # 所有顶点初始距离为无穷大 minDist[1] 0 # 源点起点距离设为0创建一个数组minDist用于记录从源点顶点1到各个顶点的当前最短距离估计值。初始时源点自身的距离设为0其他顶点设为无穷大表示尚未找到路径。2. 核心松弛操作for i in range(1, n): # 最多进行n-1轮松弛 updated False for src, dest, weight in edges: # 遍历所有边 if minDist[src] ! float(inf) and minDist[src] weight minDist[dest]: minDist[dest] minDist[src] weight # 松弛操作 updated True if not updated: # 提前终止优化 break​外层循环​最多进行n-1轮。因为任何不含负权环的最短路径最多包含n-1条边。​内层循环​遍历图中的所有边。对于每条边(src, dest, weight)进行松弛操作​检查如果从源点经过顶点src再到顶点dest的路径距离比当前已知到dest的最短距离更短则更新minDist[dest]。​提前终止优化​如果在一轮松弛中没有任何距离被更新说明所有最短路径已被找到可以提前结束循环减少不必要的计算。3. 结果返回if minDist[-1] float(inf): # 检查终点是否可达 return unconnected return minDist[-1] # 返回到达终点的最短距离检查目标顶点通常是编号为n的顶点的最短距离是否仍是无穷大。如果是则表示从源点无法到达该顶点返回 unconnected。否则返回计算得到的最短距离。关键点说明1. 负权环处理代码没有显式检测负权环。标准的 Bellman-Ford 算法在完成n-1轮松弛后会再进行一轮松弛。如果在这一轮中任何顶点的距离还能被更新则说明图中存在从源点可达的负权环​因为可以不断绕环降低总路径成本。添加检测的代码如下# 在n-1轮松弛之后添加负权环检测 for src, dest, weight in edges: if minDist[src] ! float(inf) and minDist[src] weight minDist[dest]: return 图中存在从源点可达的负权环无最短路径在你的代码中由于题目可能确保无负权环或者只关心连通性因此省略了此步骤。2. 时间复杂度与空间复杂度​时间复杂度​代码中有两层循环外层最多n-1次内层遍历所有m条边因此最坏时间复杂度为 ​O(nm)​*​。​空间复杂度​主要是存储边集和距离数组空间复杂度为 ​O(n m)​​

相关新闻

探索整流器与逆变器的协同应用:从原理到实践

探索整流器与逆变器的协同应用:从原理到实践

整流器逆变器。 前级采用PWM整流器,采用双闭环前馈解耦控制,实现并网单位功率因数,稳定直流电压。 后级采用两电平逆变器,通过双闭环前馈解耦控制,稳定输出电压。 整个仿真环境完全离散化,运行时间更快&…

2026/7/3 15:08:03 阅读更多 →
永磁同步模型中的电流预测控制与广义预测控制(速度环)探索

永磁同步模型中的电流预测控制与广义预测控制(速度环)探索

永磁同步模型电流预测控制广义预测控制(速度环) 速度环预测控制采用广义预测与扩展状态观测器结合,提高系统鲁棒性和稳态特性。 电流环采用预测控制双矢量改进算法。 含有对应学习文献 在永磁同步电机(PMSM)控制系统中&#xff0c…

2026/7/3 15:08:05 阅读更多 →
从数据库到智能体:教育企业如何构建自己的“数字大脑”?

从数据库到智能体:教育企业如何构建自己的“数字大脑”?

在近期一场顶级技术大会上,“智能体结构”成为焦点。会议指出,未来内容不是写出来的,而是从智能系统中“生长”出来的。这对于依赖内容与服务的教育行业而言,启示深远。创客匠人作为教育数字化领域的长期陪伴者,观察到…

2026/7/4 16:31:34 阅读更多 →

最新新闻

OpenWrt SSH双因素认证配置指南:TOTP与备用端口方案

OpenWrt SSH双因素认证配置指南:TOTP与备用端口方案

1. 项目概述:为什么要在OpenWrt上折腾SSH双因素认证? 如果你和我一样,把家里的路由器刷成了OpenWrt,那它大概率已经成了你网络的核心枢纽。除了路由,你可能还用它跑了Docker、挂载了硬盘做轻量NAS,或者部署…

2026/7/5 13:22:08 阅读更多 →
FPGA 工频同步采集 + DDR3 缓存完整实现方案

FPGA 工频同步采集 + DDR3 缓存完整实现方案

目录 整体系统架构功能概述 时钟域划分(核心跨域隔离) 一、50Hz 工频 DPLL 同步模块 dpll_50hz.v 原理 二、ADC 同步采集模块 adc_sync_sample.v 三、异步 FIFO 跨时钟域桥 data_fifo_bridge.v 四、DDR3 MIG 控制器封装 ddr3_mig_top.v IP 配置要…

2026/7/5 13:22:08 阅读更多 →
web安全-PHP反序列化漏洞

web安全-PHP反序列化漏洞

前言PHP反序列化漏洞是Web安全领域中最具威胁性的漏洞类型之一。与SQL注入、XSS等常见漏洞不同,反序列化漏洞往往能直接导致远程代码执行(RCE),获取服务器权限。本文将系统性地讲解PHP反序列化漏洞的基础概念、魔术方法、POP链构造…

2026/7/5 13:22:08 阅读更多 →
高效智能的Windows ADB驱动一键安装解决方案

高效智能的Windows ADB驱动一键安装解决方案

高效智能的Windows ADB驱动一键安装解决方案 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirrors/la/Latest-adb-fastboot-in…

2026/7/5 13:22:08 阅读更多 →
我第一次用 Codex,差点把桌面交给它

我第一次用 Codex,差点把桌面交给它

CODEX 第三期 写在前面 这不是一篇炫技教程。它只解决小白第一次用 Codex 时最容易忽略的一件事:不要急着把桌面、客户资料和真实项目交给 AI,先用一个安全小文件夹跑通入门闭环。 我第一次打开 Codex 的时候,差点犯一个很蠢的错误。 不是装错版本,也不是登录失败。 而…

2026/7/5 13:20:08 阅读更多 →
AI写专著全流程解析,利用工具轻松打造20万字专业专著!

AI写专著全流程解析,利用工具轻松打造20万字专业专著!

对于很多研究者来说,写学术专著时最让人头疼的,莫过于“有限的时间”与“无限的需求”之间的矛盾。撰写专著通常需要数年时间,而研究者还要兼顾教学、科研、学术交流等各种任务,能够专心写作的时间往往是零散的。这种零碎的写作方…

2026/7/5 13:20:08 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻