转自:https://zhuanlan.zhihu.com/p/40338107,感谢分享!

看这个算法的时候,虽然也是看到各种例子,但是对例子的说明,很多博客写的让我一脸懵,真为自己的智商感到着急。接下去我也将用一个例子来说明这个算法,希望初学者看到我的这篇可以更加浅显易懂。

先引用别人的关于该算法的定义,有耐心的可以看看,也可以直接跳到例子。

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。

基本思想

  1. 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
  2. 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
  3. 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完所有顶点。

操作步骤

  1. 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为”起点s到该顶点的距离”[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
  2. 从U中选出”距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。
  3. 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
  4. 重复步骤(2)和(3),直到遍历完所有顶点。

单纯的看上面的理论可能比较难以理解,下面通过实例来对该算法进行说明。以D为开头,求D到各个点的最短距离。

第1步:初始化距离,其实指与D直接连接的点的距离。dis[c]代表D到C点的最短距离,因而初始dis[C]=3,dis[E]=4,dis[D]=0,其余为无穷大。设置集合S用来表示已经找到的最短路径。此时,S={D}。现在得到D到各点距离{D(0),C(3),E(4),F(*),G(*),B(*),A(*)},其中*代表未知数也可以说是无穷大,括号里面的数值代表D点到该点的最短距离。

第2步:不考虑集合S中的值,因为dis[C]=3,是当中距离最短的,所以此时更新S,S={D,C}。接着我们看与C连接的点,分别有B,E,F,已经在集合S中的不看,dis[C-B]=10,因而dis[B]=dis[C]+10=13,dis[F]=dis[C]+dis[C-F]=9,dis[E]=dis[C]+dis[C-E]=3+5=8>4(初始化时的dis[E]=4)不更新。此时{D(0),C(3),E(4),F(9),G(*),B(13),A(*)}。

第3步:在第2步中,E点的值4最小,更新S={D,C,E},此时看与E点直接连接的点,分别有F,G。dis[F]=dis[E]+dis[E-F]=4+2=6(比原来的值小,得到更新),dis[G]=dis[E]+dis[E-G]=4+8=12(更新)。此时{D(0),C(3),E(4),F(6),G(12),B(13),A(*)}。

第4步:在第3步中,F点的值6最小,更新S={D,C,E,F},此时看与F点直接连接的点,分别有B,A,G。dis[B]=dis[F]+dis[F-B]=6+7=13,dis[A]=dis[F]+dis[F-A]=6+16=22,dis[G]=dis[F]+dis[F-G]=6+9=15>12(不更新)。此时{D(0),C(3),E(4),F(6),G(12),B(13),A(22)}.

第5步:在第4步中,G点的值12最小,更新S={D,C,E,F,G},此时看与G点直接连接的点,只有A。dis[A]=dis[G]+dis[G-A]=12+14=26>22(不更新)。{D(0),C(3),E(4),F(6),G(12),B(13),A(22)}.

第6步:在第5步中,B点的值13最小,更新S={D,C,E,F,G,B},此时看与B点直接连接的点,只有A。dis[A]=dis[B]+dis[B-A]=13+12=25>22(不更新)。{D(0),C(3),E(4),F(6),G(12),B(13),A(22)}.

第6步:最后只剩下A值,直接进入集合S={D,C,E,F,G,B,A},此时所有的点都已经遍历结束,得到最终结果{D(0),C(3),E(4),F(6),G(12),B(13),A(22)}.

 

相信看完以上内容都可以理解dijkstra算法,不过以上内容用文字表述就感觉看起来有些累赘,不过又没有比较好的作图工具,就勉强看着吧。

另外,我发现我的数据更新步骤跟其他人的不太一样,这也是我没有理解别人说的原因之一,我不明白他们的数值是如何更新的,虽然结果都一样。参考博客如下,作者的更新步骤就跟我不同,不过他用图像来说明确实看得爽一点,如果对我的思路也有疑惑可以看看别人的,欢迎批评指正。

posted @ 2020-09-05 16:01 白婷 阅读(348) 评论(0) 推荐(0) 编辑
摘要: 转自:https://blog.csdn.net/fuming2021118535/article/details/51339881,感谢分享! 刚开始学的特征值和特征向量的时候只是知道了定义和式子,并没有理解其内在的含义和应用,这段时间整理了相关的内容,跟大家分享一下; 首先我们先把特征值和特征向 阅读全文
posted @ 2020-09-05 14:54 白婷 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 转自:https://www.jianshu.com/p/1121509ac1dc,感谢分享! 如果使用基于最大似然估计的模型,模型中存在隐变量,就要用EM算法做参数估计。个人认为,理解EM算法背后的idea,远比看懂它的数学推导重要。idea会让你有一个直观的感受,从而明白算法的合理性,数学推导只 阅读全文
posted @ 2020-06-10 20:00 白婷 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 转自:https://blog.csdn.net/sparkkkk/article/details/72598041,感谢分享! 先给一个直观的例子,这个是在我们训练GAN的时候经常出现的 这就是所谓的Mode Collapse 但是实际中ModeCollapse不能像这个一样这么容易被发现(sam 阅读全文
posted @ 2020-01-04 16:29 白婷 阅读(2787) 评论(0) 推荐(0) 编辑
摘要: 转自:http://blog.pluskid.org/?p=287,感谢分享! 如果说 K-means 和 GMM 这些聚类的方法是古代流行的算法的话,那么这次要讲的 Spectral Clustering 就可以算是现代流行的算法了,中文通常称为“谱聚类”。由于使用的矩阵的细微差别,谱聚类实际上可 阅读全文
posted @ 2019-10-18 16:53 白婷 阅读(398) 评论(0) 推荐(0) 编辑
摘要: 转自:https://www.jianshu.com/p/e5f2b20d95ff,感谢分享! 基础Memory-network 传统的RNN/LSTM等模型的隐藏状态或者Attention机制的记忆存储能力太弱,无法存储太多的信息,很容易丢失一部分语义信息,所以记忆网络通过引入外部存储来记忆信息. 阅读全文
posted @ 2019-10-11 20:14 白婷 阅读(1049) 评论(0) 推荐(0) 编辑
摘要: 转自:https://blog.csdn.net/ccnt_2012/article/details/81114920,感谢分享! 阅读全文
posted @ 2019-09-17 20:44 白婷 阅读(1007) 评论(0) 推荐(0) 编辑
摘要: 转自:https://www.kechuang.org/t/84022?page=0&highlight=859356,感谢分享! 在机器学习、多维信号处理等领域,凡涉及到图论的地方,相信小伙伴们总能遇到和拉普拉斯矩阵和其特征值有关的大怪兽。哪怕过了这一关,回想起来也常常一脸懵逼,拉普拉斯矩阵为啥被 阅读全文
posted @ 2019-09-17 08:56 白婷 阅读(4049) 评论(1) 推荐(0) 编辑
摘要: 转自:http://blog.sciencenet.cn/blog-4673-512238.html,感谢分享! 人类行为的统计物理研究 人类行为具有高度的复杂性。研究人类行为中的规律,对于经济学、社会学、管理学的研究和应用有着极为重要的价值。长期以来,对人类的社会行为的研究主要为心理学所关注,通过 阅读全文
posted @ 2019-08-29 19:39 白婷 阅读(2390) 评论(0) 推荐(0) 编辑
摘要: 管理事务: Trello https://trello.com/b/CvhrAyN5/gan-paper-reading 阅读全文
posted @ 2019-06-22 00:08 白婷 阅读(166) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示