迪杰斯特拉c++_计算机网络基础(十)---网络层-迪杰斯特拉算法

2b3056fff651dcd8f4fbcb3aad886c4d.png

文章内容概览

d6733f7891bc29ffe97ce45e7889398b.png

迪杰斯特拉算法

  • Dijkstra(迪杰斯特拉)算法是著名的图论算法
  • Dijkstra算法解决有权图从一个节点到其它节点的「最短路径」问题
  • 特点:“以起点为中心,向外层层扩展”

最短路径问题

假设有下图这样的一个网络,该网络有A、B、C、D、E、F这几个节点和若干条边,每条边都有相应的距离。假设此时要求A到E的最短路径

ed5717557ff0c6cb34ea97c2ae36a19e.png

下边列出由A到E的所有可能的路径以及路径长度

A->B->C->E = 13
A->C->E = 11
A->D->C->E =13
A->D->E = 9
A->F->E = 10

从列出的结果来看,最短的路径是A->D->E这条,距离是9。这是人为的去查找的,但是我们是需要将其转换成程序语言来解决求最短路径问题

先用文字介绍一下该算法的整个过程,然后再通过例子来解释每个过程

迪杰斯特拉算法

「迪杰斯特拉算法过程描述」

  1. 初始化两个集合(S,U)(S为只有初始顶点点A的集合,U为其它顶点的集合)
  2. 如果U不为空,对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D
  • 将顶点D放入S集合
  • 更新通过顶点D到达U集合所有点的距离(如果距离更小则更新,否则不更新)
  • 重复步骤2
  1. 直到U集合为空,整个算法过程完成

通过下边的例子来理解上边的过程

因为要求A到E的最短距离,所以,首先将A纳入S集合,且A到A的距离为0。然后其它顶点U的集合就是B、C、D、E、F,并计算A到这几个顶点的距离,从图中可以看出来

6ff9c42d02c38f897011215148dff089.png

因为集合U不为空,所以对集合U中,A到各个顶点的距离进行排序,找到到A的距离最短的顶点,将其放入集合S。从图中可以看出来,A到顶点B的距离是最小的,所以将其放入集合S

然后应该计算:「A通过B到达其余各个顶点的距离」

因为知道B到C的距离为5,所以A通过B到达C的距离为:A->B->C = 6+5 = 11,因为原来集合U中A到C的距离为9,9 < 11,所以,不需要更新到集合U中,然后就得到下边这样的结果

ede70e52a9e19cef84f913ac58642ef3.png

然后再对U进行判断,发现不为空。所以对U中A到各个顶点的距离再进行排序,发现A到F的距离是最短的,此时就把到F放入到S集合中。然后此时计算A通过F达到各个顶点的距离。发现A通过F到达E的距离为10,此时,更新U中A到顶点E的距离(原来这个距离是不知道的),然就得到如下结果

2f5827b933bdddb13231f809ae5bfec9.png

然后就是重复上边的步骤,发现U中距离最短的是D,那么就把D放入到集合S,然后计算A通过D到达各个顶点的距离,发现A通过D到达C的距离为11,A通过D到达E的距离是9。此时发现A通过D到达C的距离大于U中的A到C的距离9,所以不替换U中A到C的距离。然后发现A通过D到达E的距离9,小于U中A到E的距离10,所以,替换掉U中A到E的值,那么就得到如下结果

8c03ef860827fcd9a2a771172928d168.png

然后集合U中还剩两个元素(两个距离值相同,随便选一个放入集合S),接着重复上边的步骤,直到集合U为空。最终得到如下结果

c52ca0ca4a1294508a2d10453ece0e8d.png

得到的S集合中的距离就是A到达各个顶点的最短距离,以上便是迪杰斯特拉算法的整个过程。有兴趣的话也可以推一个B到各个顶点的最短距离

在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践(公众号:IT猿圈)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值