当前位置: 首页 > news >正文

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

 💯 博客内容:【茶话数据结构】查找最短路径——Dijkstra算法详解

😀 作  者:陈大大陈

🦉所属专栏:数据结构笔记

🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!

💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

目录

题记 

两大注意事项

实例题目

超超超详细图解

 答案以及详尽总结

后记

题记 

 复习到离散数学图论时,想起来这个算法,感觉很有写博客的必要!今天这篇博客就来讲一下查找最短路径的Dijkstra算法。

Dijkstra 算法,是由荷兰计算机科学家 Edsger Wybe Dijkstra 在1956年发现的算法,戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。Dijkstra 算法原始版本仅适用于找到两个顶点之间的最短路径,后来更常见的变体固定了一个顶点作为源结点然后找到该顶点到图中所有其它结点的最短路径,产生一个最短路径树。本算法每次取出未访问结点中距离最小的,用该结点更新其他结点的距离。需要注意的是绝大多数的Dijkstra 算法不能有效处理带有负权边的图。

两大注意事项

需要注意两个问题

1.每次从未标记的节点中选择距离出发点最近的节点,标记它,收录到最短路径集合中。

2.计算刚加入的节点A的临近节点B的距离(不包含标记的节点),若(节点A的距离+节点B的距离到节点B的边长)<节点B,就更新节点B的距离和其前一个位置的点。

实例题目

 如图,计算从起点0到终点4的最短路径长度。 

超超超详细图解

 我们作出这样的表格,用于施展Dijkstra算法。

出发点表示从出发点到现在位置地距离。

首先从距离出发点最近的点,也就是出发点开始,它距离出发点的位置显然是0,。

标记它,并收录到最优路径集合中,我们用一个对钩来表示已被收录。

 下一步就是找它的临近节点,分别是1和7。

更新1和7的出发点距离和前面点,如图。

 紧接着从没有被标记的节点中选出出发点距离最短的,即为1,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,即为7和2,因为0已经被标记所以不算。

计算出0和它们的距离分别是15和12,12小于默认的正无穷,更新。

15比8大,不更新。

 选出出发点距离最小的点,即为7,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,即为6和8,因为1和0已经被标记所以不算。

计算出0和它们的距离分别是9和15,小于默认的正无穷,更新。

 选出出发点距离最小的点,即为6,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,即为5和8,因为7已经被标记所以不算。

计算出0和它们的距离分别是11和15,11的更新,15的和之前相等,不更新。

  选出出发点距离最小的点,即为5,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,即为2,3和4,因为6已经被标记所以不算。

计算出0和它们的距离分别是15和25和21。

15大于12,不更新,25小于正无穷,更新,21小于正无穷,更新。

 选出出发点距离最小的点,即为2,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,即为3和8,因为1和5已经被标记所以不算。

计算出0和它们的距离分别是19和14,分别小于25和15,都更新。

 选出出发点距离最小的点,即为8,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,全都标记过了,最方便的一集,小时候写哭了。

直接标记后跳过。

 选出出发点距离最小的点,即为8,标记它,并收录到最短路径集合中。

紧接着计算它的邻接节点,就剩下一个4没被标记了。

计算出距离它的距离是28,大于21,不更新。

最后一步将4标记,并收录到最短路径集合中。、

我们的最终答案堂堂出炉!!!

 答案以及详尽总结

从上面的表中可以得到答案,0到4的最短路径是21。

从头到尾经过的节点是 0 7 6 5 4。

其实需要注意的就这两点。 

1.每次从未标记的节点中选择距离出发点最近的节点,标记它,收录到最短路径集合中。

2.计算刚加入的节点A的临近节点B的距离(不包含标记的节点),若(节点A的距离+节点B的距离到节点B的边长)<节点B,就更新节点B的距离和其前一个位置的点。

后记

韩信带净化,成为大牛道阻且长,小僧还在山腰上。。。

博客里如果有问题的话,还请大佬私信我,我会修改的。

有问题的话请私信问我,我看到就会回的。 

相关文章:

  • 【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解
  • 走进网络世界 了解一些基础知识
  • rabbitmq-spring-boot-start配置使用手册
  • 数字孪生10个技术栈:数据清洗-数据的洗衣机
  • Qt+FFmpeg+opengl从零制作视频播放器-15.音视频一些知识
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)
  • VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:
  • 2115. 从给定原材料中找到所有可以做出的菜
  • 垃圾回收器介绍
  • FDU 2020 | 1. 食堂打饭
  • 基于SpringBoot的“智慧食堂”系统(源码+数据库+文档+PPT)
  • 突破编程_C++_设计模式(状态模式)
  • C语言分析基础排序算法——计数排序
  • 网络建设与运维培训介绍和能力介绍
  • Linux--搭建Zabbix监控系统
  • .pyc 想到的一些问题
  • [NodeJS] 关于Buffer
  • 「面试题」如何实现一个圣杯布局?
  • 2017 年终总结 —— 在路上
  • 2019.2.20 c++ 知识梳理
  • Apache Spark Streaming 使用实例
  • exif信息对照
  • HTTP 简介
  • Iterator 和 for...of 循环
  • Java 23种设计模式 之单例模式 7种实现方式
  • mac修复ab及siege安装
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue全家桶实现一个Web App
  • WePY 在小程序性能调优上做出的探究
  • 近期前端发展计划
  • 坑!为什么View.startAnimation不起作用?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 深度解析利用ES6进行Promise封装总结
  • 终端用户监控:真实用户监控还是模拟监控?
  • No resource identifier found for attribute,RxJava之zip操作符
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #include
  • #laravel 通过手动安装依赖PHPExcel#
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (离散数学)逻辑连接词
  • (力扣)循环队列的实现与详解(C语言)
  • (六)软件测试分工
  • (七)理解angular中的module和injector,即依赖注入
  • (三)docker:Dockerfile构建容器运行jar包
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net 路由处理厉害了