最短路径

生活中,我们常常会面临着对路径的最优选择问题,可能是路程最短,也可能是时间最短,这个的最短路径就类似路程最短的选择。

比如在上海,乘地铁去某个地方,上海的地铁路线很多,从地图上看上去就是一个网。去某个地方就会有多条路线的选择,我们一般就会选最短那条路线。当然,在现实生活中,还会考虑时间、换乘等因素,这里只是举个例子说什么是最短路径。

地铁换乘貌似一眼就可以看出来那条路线是最优的路线。但是在一些复杂的情况下,人眼就很难确定最优路线来,比如送外卖、自驾车等。人眼就很难做出最优选择,因为路况等因素,根本没法判断。这时就需要用算法来选择最佳路线了。这也是这篇文章的主角:迪杰斯特拉(Dijkstra)算法。

迪杰斯特拉算法

迪杰斯特拉(Dijkstra,又译戴克斯特拉)算法由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出。使用了广度优先搜索解决带权有向图的单源最短路径问题。通过一个顶点作为源节点然后找到该顶点到图中所有其它节点的最短路径,产生一个最短路径树。

迪杰斯特拉算法步骤

1.标记所选的初始顶点,当前距离为 0,其余顶点设为无穷大。
2.将具有最小当前距离的非访问顶点设置为当前顶点 C。
3.对于当前顶点 C 的每个邻居顶点 N:将当前距离 C 与连接 C—N 的边缘的权重相加。 如果它小于顶点 N 的当前距离,则将其设置为 N 的新当前距离。
4.将当前顶点 C 标记为已访问。
5.如果有非访问顶点,重复步骤2,直到所有顶点均访问。

迪杰斯特拉算法时间复杂度

假如我们有 V 表示图中的顶点个数,E 表示图中的边个数。

如果用一个链表或者数组来存储所有顶点的集合,要找到最短路径算法所需的运行时间是

如果用邻接表 + 二叉堆来用作优先队列来查找最小的顶点,那么算法所需的时间为

如果用邻接表 + 斐波纳契堆能稍微提高一些性能,让算法运行时间达到

迪杰斯特拉算法示例

Dijkstra的算法是用来计算一个顶点(起始点)与图中每个其他顶点之间的最短路径。

搜索顶点 C 和图中其他顶点之间的最短路径。 首先我们需要初始化数据,选择顶点 C 为初始顶点,当前距离为 0,对于其余顶点,由于我们不知道最小距离,因此它开始为无穷大。 现在与 C 相邻的顶点为 A、B、D,因为没有特定的顺序,我们选择从 A 开始。由于 C 到 A 的权值为 1,当前顶点的最小距离加 C—A 的权值小于默认的无穷大,所以 C—A 的最小距离为 0+1=1。 由于 C 到 B 的权值为 7,当前顶点的最小距离加 C—B 的权值小于默认的无穷大,所以 C—B 的最小距离为 0+7=7。 由于 C 到 D 的权值为 2,当前顶点的最小距离加 C—D 的权值小于默认的无穷大,所以 C—D 的最小距离为 0+2=2。
此时 C—A 的最短距离为 1;
C—B 的最短距离为 7;
C—D 的最短距离为 2。 选取下一个当前顶点为 A,由于 A 到 B 的权值为 3,当前顶点的最小距离加 A—B 的权值小于 7,所以 C—B 的最小距离为 1+3=4。
当前的最短路径分别为 C—A、C—A—B、C—D。 选取下一个当前顶点为 D,由于 D 到 E 的权值为 7,当前顶点的最小距离加 D—E 的权值小于无限大,所以 C—E 的最小距离为 2+7=9。
此时 D—B 的权值为 5,C—B 的最小距离为 2+5=7,大于当前的最小距离,因此不用更新 C—B 的距离。
当前的最短路径分别为 C—A、C—A—B、C—D、C—D—E。 选取下一个当前顶点为 B,由于 B 到 E 的权值为 1,当前顶点的最小距离加 B—E 的权值小于 9,所以 C—E 的最小距离为 4+1=5。现在更新C—E 的最短距离为 5,所有顶点都以标记完成。

最后,最短距离分别为 C—A=1,C—B=4,C—D=2,C—E=5。
最短路径分别为 C—A、C—A—B、C—D、C—A—B—E。

总结

迪杰斯特拉(Dijkstra)算法使用了广度优先搜索解决带权有向图的单源最短路径问题。通过一个顶点作为源节点然后找到该顶点到图中所有其它顶点的最短路径。

用一个链表或者数组来做存储的数据结构时,时间复杂度为

但通过对存储结构的优化,用二叉堆或者斐波纳契堆来存储时,效率上有一定的提升。

PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。

算法之「迪杰斯特拉(Dijkstra)算法」相关推荐

  1. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  2. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  3. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  4. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  5. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  6. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

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

  7. 最短路径算法-迪杰斯特拉(Dijkstra)算法

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

  8. java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...

  9. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  10. 1768 Problem A 算法7-15:迪杰斯特拉最短路径算法

    问题 A: 算法7-15:迪杰斯特拉最短路径算法 时间限制: 1 Sec  内存限制: 32 MB 提交: 118  解决: 56 题目描述 在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点 ...

最新文章

  1. Relation Networks for Object Detection
  2. Ember——在构建Ember应用程序时,我们会使用到六个主要部件:应用程序(Application)、模型(Model)、视图(View)、模板(Template)、路由(...
  3. mysql主从不同步怎么恢复_mysql主从不同步时,怎么恢复
  4. IOS OC项目的单例模式
  5. oracle load select,Oracle数据库的Load详解
  6. 学用软件:laTex软件初体验
  7. VNPY - 事件引擎
  8. sqlite 服务器数据库文件,sqlite可以做服务器数据库吗
  9. 三端食堂售饭管理系统
  10. java调用tuxedo中间件_初探TUXEDO中间件
  11. 深入原理64式:39 线性代数公式总结
  12. VMware+WinDBG_配置_资料
  13. 判断一个字符串能否通过添加一个字符变成回文串
  14. wincc报表日报表实例_wincc 报表,涉及变量计算的日报表怎么做
  15. 多个乘法 用计算机什么符号,电脑乘法符号怎么打
  16. [导入]收录Google公益广告的答案
  17. 8b/10b编码方式(详细)总结附实例快速理解
  18. 怎样在网页中嵌入word
  19. Android平台下嗅探视频
  20. Matlab的信号频谱分析

热门文章

  1. text-align-last: justify;文本对齐ios失效问题解决
  2. mysql urldecode_urlencode()与urldecode()函数
  3. 计算机图形学 裁剪算法
  4. 选择视频编码器的误区------傅德良
  5. JPEG 编解码器 霍夫曼编码
  6. 从外部入侵公司:外部渗透测试
  7. INS/GNSS组合导航(四)卡尔曼滤波比较之KF/EKF/UKF/PF
  8. 腾讯/阿里《低代码 研究报告 100页》.pdf 完整版 开放下载
  9. 字符类型 char 的值域
  10. 使用Lifecycle Manager 升级 esxi7.0 至 7.0.1u1