Dijkstra 算法正确性证明
Dijkstra正确性证明
Dijkstra算法的本质#
如果你有思考“为什么”的习惯,就一定会发现,Dijkstra 的本质就是动态规划 + BFS 。松弛操作实际上就类似于动态规划中的状态更新。
设
其中,
这个状态转移方程是显然的,是非常经典的“退一步思考”,即思考点
而 Dijkstra 中,则引入了一切别的策略,本质上都只是优化。
正文#
好了,实际上前文和正文都没关系,只是想要分享一下我对于一个算法的理解。
我们重新回忆算法每一步都干了什么:
- 在未确定最短路集合
中,选择估计最短路最短的点,将其移动至已确定最短路集合 中。 - 利用此点,更新邻近的点(松弛)。
我们无非就是需要证明,每次从
使用反证法,假设此结论不成立,设
整理,得
首先讨论一下第一个点能否不满足此结论。
算法刚开始,
那么,第一次拿出的点一定是
接下来讨论不存在
此算法的
若父节点也未曾更新,
若父节点更新过,意味着父节点的父节点也会有更新。不断追溯,发现,最初的更新来源于源点。
也就是说,若父节点更新,是从源点开始一路更新到父节点。那么意味着父节点存在一条路径
若
所以,若
也就是说
那么讨论一下该路径的性质。
因为
若所有
所以一定有一条路径
刚才已经提到,
但是因为过程 1 的条件,
但此与前文不等式链相矛盾,所以假设不成立,命题得证。
本证明大部分都取自 OI Wiki .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】