【科研相关知识】Dijkstra算法

Dijkstra算法

相关背景知识

  • Dijkstra算法是解决图论中的最短路径问题
  • 而最短路径问题是在图中找到两个节点之间的最短路径
  • 在导航中确定路线最短,在网络中路由器使用Dijkstra算法确定最短路径和转发端口。
  • 最短路径算法有Dijkstra算法和Floyd(弗洛伊德算法)

历史来源

Dijkstra算法是一种计算图中单源最短路径的算法,由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出。这个算法用于解决有向图中单个源点到其他各顶点的最短路径问题。

算法的基本思想是,从源点出发,逐步探索源点到其他各顶点的最短路径。算法使用了一个优先队列来维护所有待访问的顶点,并按照路径长度递增的顺序进行访问。算法执行过程中,一旦找到从源点到某个顶点的最短路径,就将这个顶点从优先队列中移除,并将这个最短路径长度作为该顶点的“标签”。

Dijkstra算法的步骤如下:

  • 初始化:将所有顶点的最短路径估计值设为无穷大,除了源点设为0。将所有顶点状态设为未访问。创建一个优先队列,并将源点加入优先队列。
  • 循环执行以下步骤直到优先队列为空: a. 从优先队列中取出具有最小估计值的顶点u。 b. 标记顶点u为已访问。 c. 对于顶点u的每一个邻接点v,执行以下操作: i. 计算通过u到达v的路径长度。 ii. 如果这个路径长度小于当前v的最短路径估计值,则更新v的最短路径估计值。 iii. 将顶点v及其新的最短路径估计值加入优先队列。
  • 算法结束,此时如果所有顶点都被访问过,那么每个顶点的最短路径估计值就是源点到该顶点的最短路径长度。

example

在这里插入图片描述

基于上图分析 Dijkstra 算法的过程,找到节点A到其他任意节点的最短路径。

  1. 首先初始化所有节点的最短距离、是否访问以及先驱节点
节点是否已访问最短路径距离先驱节点
Afalse0-
Bfalse--
Cfalse--
Dfalse--
Efalse--
Ffalse--
  1. 由于节点A到其本身的距离为0且最短,将其加入最短路径中,并标记已访问。
节点是否已访问最短路径距离先驱节点
Atrue0-
Bfalse--
Cfalse--
Dfalse--
Efalse--
Ffalse--
  1. 接下来更新经过节点A的相邻节点距离到起始节点的距离,即BA DA,同时更新B点和A点的先驱节点
节点是否已访问最短路径距离先驱节点
Atrue0-
Bfalse5A
Cfalse--
Dfalse3A
Efalse--
Ffalse--
  1. 继续选择未访问节点中拥有最短的路径距离的节点,即D点
节点是否已访问最短路径距离先驱节点
Atrue0-
Bfalse5A
Cfalse--
Dtrue3A
Efalse--
Ffalse--
  1. 更新经过节点D的相邻节点距离到起始节点的距离,即EDA,通时更新E点的先驱节点
节点是否已访问最短路径距离先驱节点
Atrue0-
Bfalse5A
Cfalse--
Dtrue3A
Efalse9D
Ffalse--
  1. 继续选择未访问节点中拥有最短的路径距离的节点,即B点
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Cfalse--
Dtrue3A
Efalse9D
Ffalse--
  1. 更新经过节点B的相邻节点距离到起始节点的距离,即CBA EBA,通时更新C点和E点的先驱节点。此时EBA这条路径更短,故进行更新。
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Cfalse7B
Dtrue3A
Efalse6B
Ffalse--
  1. 继续选择未访问节点中拥有最短的路径距离的节点,即E点
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Cfalse7B
Dtrue3A
Etrue6B
Ffalse--
  1. 更新经过节点E的相邻节点距离到起始节点的距离,判断DEBA FEBA BEDA,通时更新先驱节点。
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Cfalse7B
Dtrue3A
Etrue6B
Ffalse10E
  1. 继续选择未访问节点中拥有最短的路径距离的节点,即C点
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Ctrue7B
Dtrue3A
Etrue6B
Ffalse10E
  1. 更新经过节点C的相邻节点距离到起始节点的距离。F点经过CE到达A点距离相同,故不再变化
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Ctrue7B
Dtrue3A
Etrue6B
Ffalse10E
  1. 检查所有未标记节点中距离最短的节点F,将其加入最短路径中,并标记
节点是否已访问最短路径距离先驱节点
Atrue0-
Btrue5A
Ctrue7B
Dtrue3A
Etrue6B
Ftrue10E
  1. 至此算法结束,得到一个从源节点A到各个节点的最短距离和路径。路径集合可以通过先驱节点推导出来。例如F到A的最短路径距离为10,一步步推导得出最短路径为A - B - E - F。
  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在輸入......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值