dijkstra算法
好的,我们用中文来解释 Dijkstra 算法。
Dijkstra 算法是什么?
Dijkstra 算法(迪杰斯特拉算法)是一种用于在 带权有向图 或 带权无向图 中,寻找 单个源点 到 所有其他顶点 的最短路径的 贪心算法。这里的“权”通常指边的长度、花费、时间等非负值。
核心思想:
- 出发点: 从源点出发。
- 逐步扩展: 每一步都确定一个距离源点 最近 且尚未被确认找到最短路径的顶点(我们称之为“当前最近点”)。
- 更新邻居: 基于这个“当前最近点”,更新它所有邻居顶点到源点的 估计最短距离。如果通过“当前最近点”到达某个邻居的路径比之前已知的路径更短,就更新这个邻居的距离估计值。这个过程称为 松弛操作。
- 标记确定: 将“当前最近点”标记为 已找到最短路径(它的最短距离值此时就是最终确定值)。
- 重复: 重复步骤 2-4,直到所有顶点都被标记为已找到最短路径,或者没有可到达的顶点为止。
为什么需要“贪心”? 在每一步,它都 只关注当前看起来最优(距离源点最近)的那个未确定顶点,认为从源点到它的最短路径已经找到(基于当前已知的所有局部信息),并利用这个信息去更新其他点的距离。这种“当前最优”的选择策略就是贪心思想的体现。
关键要求:图中不能有负权边!
- Dijkstra 算法正确性的一个重要前提是:图中 所有边的权值必须是非负的。
- 为什么? 因为算法基于一个假设:一旦一个顶点的最短路径被确定,就不会再有其他路径能提供更短的距离。但如果存在负权边,后续通过负权边可能构成一条更短的路径指向某个已被“确定”的顶点,这就破坏了算法的前提假设,导致结果错误。
算法步骤详解(手动模拟理解):
-
初始化:
- 创建一个数组
dist,记录每个顶点到源点的 当前估计最短距离。源点的dist设为0,其他所有顶点的dist设为 无穷大 (∞),表示尚未找到路径。 - 创建一个集合
S(或标记数组),用于存放 已找到最短路径 的顶点。开始时S为空。 - 创建一个集合
Q(或优先队列),包含所有顶点(或者所有未确定最短路径的顶点)。
- 创建一个数组
-
进入主循环:
- 步骤 A:选择当前最近点 - 从集合
Q中找出dist值最小的顶点u。这个u就是本轮确定的“当前最近点”。 - 步骤 B:标记确定 - 将
u从Q中移除(或标记为已访问),并加入集合S。这意味着顶点u到源点的最短路径已被最终确认,其值就是dist[u]。 - 步骤 C:松弛操作(更新邻居) - 遍历
u的所有 未在S中 的邻居顶点v(即尚未确定最短路径的邻居):- 计算 从源点经
u到v的路径长度:dist[u] + weight(u, v)(其中weight(u, v)是边(u, v)的权重)。 - 将这个计算值
dist[u] + weight(u, v)与v当前记录的dist[v]进行比较。 - 如果
dist[u] + weight(u, v) < dist[v]:- 更新
dist[v] = dist[u] + weight(u, v) - (可选:记录
v的前驱节点为u,用于最终回溯路径)。
- 更新
- 计算 从源点经
- 步骤 A:选择当前最近点 - 从集合
-
终止条件: 重复步骤 A-C,直到满足以下条件之一:
- 集合
Q变为空(所有顶点都已处理)。 - 或者,只剩下那些
dist值为无穷大 (∞) 的顶点(表示它们无法从源点到达)。
- 集合
最终结果:
dist数组:包含了源点到图中 每个可达顶点 的最短路径长度。对于不可达的顶点,其dist值保持为无穷大 (∞)。- (如有记录前驱):可以回溯前驱节点,重构出源点到每个顶点的具体最短路径。
时间复杂度:
- 朴素实现 (遍历查找最小值):
O(V² + E),其中V是顶点数,E是边数。适合稠密图。 - 优先队列优化 (最小堆/二叉堆):
O((V + E) log V)。适合稀疏图。 - 更优的优先队列 (斐波那契堆):
O(E + V log V)(理论最优,但常数因子大,实践中不一定最快)。
空间复杂度: O(V)(用于存储 dist、前驱、访问标记等)或 O(V + E)(存储图结构本身)。
图解比喻:
想象你(源点)站在一个城市中心。你有一张地图(图),上面标明了所有路口(顶点)和道路(边)的长度(权重,非负)。你想知道去每个路口的最短距离。
- 你(源点)到自己的距离是 0。
- 你看周围的路口(邻居),记录下直接能走到的距离(更新邻居的
dist)。 - 你 确定 最近的那个路口(A)的距离就是最短路径(加到
S)。 - 站在路口 A,你看 A 能直接到达的其他路口(B, C)。计算 “你 -> A -> B” 和 “你 -> A -> C” 的距离。
- 如果 “你 -> A -> B” 比你之前(可能直接从你那里或通过其他点)知道的到 B 的距离更短,就更新记录到 B 的最短估计距离(松弛)。
- 在所有 未确定最短路径 的路口中(包括你直接从中心看到的邻居和从 A 看到的邻居),再次找出离你 估计距离最近 的那个路口(假设是 C),确定 它的距离就是最终最短路径(加到
S)。 - 站在路口 C,重复步骤 4-6:更新 C 的邻居们的估计距离...
- 如此反复,直到所有路口都确定了最短距离,或者确认某些路口永远无法到达。
关键点总结:
- 单源最短路径: 从一个起点出发,计算到其他所有点的最短距离。
- 非负权边: 图中边的权重不能是负数。
- 贪心策略: 每一步都优先处理当前距离源点最近的未确定顶点。
- 松弛操作: 核心步骤,利用新确定的点去优化其邻居的距离估计。
- 逐步确定: 顶点一旦被加入
S集合,其dist值就不再改变,即为最终的最短路径长度。
Dijkstra vs BFS:
- BFS (广度优先搜索) 可以看作是当所有边权为 1 时的 Dijkstra 算法的特例。在无权图中,BFS 天然地保证了最先访问到的路径就是最短路径(按边数计)。
- Dijkstra 算法解决了 带非负权重的图 中的最短路径问题(按权重总和计)。
为什么不能有负权边?
假设源点为 S,目标点为 T。
- S 有两条边:S->A (权 1), S->B (权 2)。
- A 到 T 有一条边:A->T (权 4)。此时 S->A->T 总权为 5。
- B 到 A 有一条 负权边:B->A (权 -3)。S->B->A 的权是 2 + (-3) = -1。
- 那么 S->B->A->T 的权是 -1 + 4 = 3,比最初的 5 更短。
- 如果 Dijkstra 先确定了 A 的最短路径为 S->A (权 1),并标记 A 为已完成。那么当它后续处理 B 时,即使发现 S->B->A 权为 -1,它也不会再去更新已经“完成”的 A 点(因为算法假设已完成点的距离不会再变小)。这就导致了错误,因为实际上通过 B 到 A 再到 T 的路径 (权 3) 比最初确定的 S->A->T (权 5) 更短。
- 存在负权边时,已经“确定”的点可能通过包含负权边的路径变得更短,破坏了 Dijkstra 算法的基础假设。这种情况下就需要使用能处理负权边的算法,如 Bellman-Ford 算法。
简单示例(无负权):
(B)
1/ \2
(A) (D)
3\ /1
(C)
- 源点:
A - 初始化
dist:dist[A] = 0dist[B] = ∞dist[C] = ∞dist[D] = ∞
- 初始化
S = {},Q = {A, B, C, D} - 第1轮:
- A:
dist最小 (0),选 A。 - 标记 A 完成 (
S = {A})。 - 松弛 A 的邻居 B 和 C:
dist[A] + weight(A, B) = 0 + 1 = 1 < ∞=> 更新dist[B] = 1dist[A] + weight(A, C) = 0 + 3 = 3 < ∞=> 更新dist[C] = 3
- A:
- 第2轮: (
Q = {B, C, D},S = {A})- 当前最小
dist是 B (1),选 B。 - 标记 B 完成 (
S = {A, B})。 - 松弛 B 的邻居 D:
dist[B] + weight(B, D) = 1 + 2 = 3 < ∞=> 更新dist[D] = 3
- 当前最小
- 第3轮: (
Q = {C, D},S = {A, B})- 当前最小
dist是 C (3) 和 D (3),假设选 C(按加入Q的顺序或任意选一个)。 - 标记 C 完成 (
S = {A, B, C})。 - 松弛 C 的邻居 D:
dist[C] + weight(C, D) = 3 + 1 = 4。4 > dist[D] (当前值 3)=> 不需更新 D。
- 当前最小
- 第4轮: (
Q = {D},S = {A, B, C})- 当前最小
dist是 D (3),选 D。 - 标记 D 完成 (
S = {A, B, C, D})。 - D 没有未完成的邻居(或没有邻居)。
- 当前最小
- 结束:
dist[A]=0,dist[B]=1,dist[C]=3,dist[D]=3
结论: Dijkstra 算法是解决 单源、非负权图最短路径问题 的最经典、最高效算法之一。理解其贪心本质(每一步选择当前最近点)、松弛操作以及负权边的限制至关重要。
中国铁路网的Dijkstra算法实现案例
该项目分别在DE1-SOC开发板的FPGA和HPS上实现了Dijkstra算法,能在中国铁路网中找到两站之间的最短距离和路线。
2024-04-09 11:10:04
车辆导航系统中最优路径算法的研究
的目的。并且改进后的 Di jkstra算法客服了传统的 Dijkstra算法计算盲目性计算的缺点,提高了路径搜寻的技术效率关键词:车辆导航系统
全文详解A*算法及其变种
相比于 BFS,Dijkstra 算法新增了cost_so_far用于记录从当前点current到起点的路径所需要的代价,并将搜索规则改为优先搜索cost最小的点.如下图所示,,
2023-09-14 09:25:34
基于STM32的A*(A星)寻路算法实现
STM32 + LED点阵屏 实现A星算法寻路A星算法最初发表于1968年。它可以被认为是Dijkstra
资料下载
贾熹
2021-12-27 19:15:59
基于改进Dijkstra算法的多AGV动态路径规划
针对多自动导引车( Automatic guided vehicle,AGV)在柔性制造系统中岀现的路径规划与冲突问题,提出了一种基于时间窗的改进 Dijkstra算法,实现多ΔGⅤ的动态路径规划
资料下载
佚名
2021-05-17 16:30:56
一种高效节能的虚拟网络映射算法
资源评估,计算最佳映射节点。在链路映射阶段,采用υ Dijkstra算法,对于毎条候选物理链路,综合考虑链路剩氽带宽资源、途径节点剩余资源以及跳数,重新计算链路排序值,从而获得高效节能的最佳映射链路。仿真实验数据表明
资料下载
佚名
2021-05-10 15:34:33
一种优化的双层卫星网络临时按序路由算法
路由算法HCR。在LEO层使用HCR算法建立从源卫星到目的卫星的多条无循环路径,当LEO层出现网络拥塞时利用GEO层卫星实现数据分层传输。仿真结果表明,与传统
资料下载
佚名
2021-03-31 15:57:25
基于SVDPP算法的新型协同过滤推荐算法
为进一步改善个性化推荐系统的推荐效果,通过使用强化学习方法对 SVDPP算法进行优化,提出一种新的协同过滤推荐算法。考虑用户评分的时间效应,将推荐问题转化为马尔科夫决策过程。在此基础上,利用Q-
资料下载
佚名
2021-03-09 17:20:09
Dijkstra算法和A*算法
在本文中,我们将主要介绍Dijkstra算法和A*算法,从成本计算的角度出发,并逐步展开讨论。 我们将从广度优先搜索开始,然后引入
2023-07-07 10:56:01
Dijkstra和A*算法及其Matlab实现
写在前面的话:只是对两种路径优化算法进行简单的理解和尝试,为后续使用做准备。如果用到,请再次好好理解原理和Matlab源码。
2022-12-07 15:04:36
秒杀几道运用Dijkstra算法的题目
读完本文,可以去力扣解决如下题目: 743. 网络延迟时间(中等) 1514. 概率最大的路径(中等) 1631. 最小体力消耗路径(中等) 其实,很多算法的底层原理异常简单,无非就是一步一步延伸
2021-09-24 10:59:28
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机