狄克斯特拉算法(Dijkstra’s algorithm)

广度优先搜索来查找两点之间的最短路径,那时“最短路径”的意思是段数最少。在狄克斯特拉算法中,你给每段都分配了一个数字或权重,因此狄克斯特拉算法找出的是总权重最小的路径。

术语

该算法用于每条边都有关联数字的图,这些数字称为权重(weight
带权重的图为加权图(weighted graph),不带权重的图为非加权图(unweighted graph)

计算非加权图中的最短路径,可使用广度优先搜索。计算加权图中的最短路径,可使用狄克斯特拉算法。
可能有环的存在:绕环的路径不可能是最短的路径,在无向图中,每条边都是一个环。狄克斯特拉算法只适合于有向无环图(directed acyclic graph,DAG)

负权边

不能将狄克斯特拉算法用于包含负权边的图。在包含负权边的图中,要找出最短路径,可使用另一种算法——贝尔曼-福德算法(Bellman-Fordalgorithm)

实现

代码如下:(书中有详细的每一步过程描述)

graph = {}            #整个图的散列表
graph["start"] = {}
graph["start"]["a"] = 6
graph["start"]["b"] = 2
graph["a"] = {}
graph["a"]["fin"] = 1
graph["b"] = {}
graph["b"]["a"] = 3
graph["b"]["fin"] = 5
graph["fin"] = {}infinity = float("inf")      #散列表是开销
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinityparents = {}            #散列表是父子节点
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = Noneprocessed = []def find_lowest_cost_node(costs):         lowest_cost = float("inf")        lowest_cost_node = Nonefor node in costs:cost = costs[node]if cost < lowest_cost and node not in processed:lowest_cost = costlowest_cost_node = nodereturn lowest_cost_nodenode = find_lowest_cost_node(costs)      #在未处理的节点中找出开销最小的节点
while node is not None:             #在所有节点都被处理后结束cost = costs[node]neighbors = graph[node]for n in neighbors.keys():          #遍历当前节点的所有邻居new_cost = cost + neighbors[n]if costs[n] > new_cost:         #如果经当前节点前往该邻居更近costs[n] = new_cost          #更新该邻居的开销parents[n] = node          #同时将该邻居的父节点设置为当前节点processed.append(node)            #将当前节点标记为处理过node = find_lowest_cost_node(costs)    #找出接下来要处理的节点,并循环
print(costs)
print(parents)
小结
1. 广度优先搜索用于在非加权图中查找最短路径。
2. 狄克斯特拉算法用于在加权图中查找最短路径。
3. 仅当权重为正时狄克斯特拉算法才管用。
4. 如果图中包含负权边,请使用贝尔曼-福德算法。
加深理解的例子


就上面的例子来说,是根据A到图中其余点的最短路径长度进行排序,路径越短越先被找到,路径越长越靠后才能被找到,要找A到F的最短路径,我们依次找到了
A –> C 的最短路径 3
A –> C –> B 的最短路径 5
A –> C –> D 的最短路径 6
A –> C –> E 的最短路径 7
A –> C –> D –> F 的最短路径 9
Dijkstra 算法运行的附加效果是得到了另一个信息,A到C的路径最短,其次是A到B, A到D, A到E, A到F

为什么Dijkstra 算法不适用于带负权的图?
就上个例子来说,当把一个点选入集合S时,就意味着已经找到了从A到这个点的最短路径,比如第二步,把C点选入集合S,这时已经找到A到C的最短路径了,但是如果图中存在负权边,就不能再这样说了。举个例子,假设有一个点Z,Z只与A和C有连接,从A到Z的权为50,从Z到C的权为-49,现在A到C的最短路径显然是A –> Z –> C

《算法图解》系列笔记(七)—— 狄克斯特拉算法相关推荐

  1. 算法图解 第7章 狄克斯特拉算法

    本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...

  2. 算法笔记之狄克斯特拉算法

    算法笔记第七章: 1.狄克斯特拉算法->找出加权图中前往X的最短路径: 2.加权图:(带权重的图) 3.迪克斯特拉算法步骤: x.找出最便宜的节点,即可最短时间内到达的节点:x.更新该节点的邻居 ...

  3. 图解算法学习笔记(七):狄克斯特拉算法

    目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...

  4. 小白的算法初识课堂(part7)--狄克斯特拉算法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...

  5. 用狄克斯特拉算法计算带权最短路径

    目录 用狄克斯特拉算法计算带权最短路径 狄克斯特拉算法思想 举一个栗子:起点到终点 举二个栗子:换钢琴 Warning 代码代码代码 python C JAVA 图文来源 用狄克斯特拉算法计算带权最短 ...

  6. 算法详解之狄克斯特拉算法

    上一篇文章,我们了解了广度优先搜索算法(BFS),BFS主要用来解决图的可达路径验证和最小路径问题,即从一个顶点A到另一个顶点B,是否有可达路径,如果有那么求出其到达的最少步骤.那么这里的最短路径就如 ...

  7. 狄克斯特拉算法(Dijkstra)详细解释

    文章目录 算法用途(目的) 算法思想与本质 图文解释 代码解析 算法用途(目的) 狄克斯特拉算法的用途或者说是目的是计算单源最短路径.单源最短路径的意思是从一个点出发到另外一个点最为的容易.举个例子解 ...

  8. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  9. 算法图解第七章狄克斯特拉算法读书笔记

    广度优先搜索找出的是段数最少的路径;狄克斯特拉算法找出最快的路径. 狄克斯特拉算法包含4个步骤: 1)找出"最便宜"的节点,即可在最短时间内到达的节点. 2)更新该节点的邻居的开销 ...

最新文章

  1. php伪造页面url地址,php 伪造HTTP_REFERER页面URL来源的三种方法
  2. java mysql 删除 博客园_mysql的增删改查
  3. Ajax-简单的HelloWorld实例,使用了XMLHttpRequest(two)
  4. android表情输入键盘,GitHub - UKfire/Emotion: 帮你的Android应用快速集成表情键盘
  5. 缓存插件 Spring支持EHCache缓存
  6. Matplotlib——多图合并
  7. 为你的APK进行数字签名
  8. 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
  9. PDF文件怎么转换成Excel表格?学会这个方法轻松转换。
  10. 费马引理、罗尔定理、拉格朗日中值定理、柯西中值定理
  11. 免费常用快递查询API接口及快递在线下单API分享
  12. 不能忍!花钱买网站VIP账号别人在用?
  13. Android 问题:Installation failed due to: ‘Invalid File:
  14. ES6(ECMAScript6)-ES11 从入门到修仙
  15. DNS防污染和广告拦截好用工具: AdGuard Home
  16. web字体 衬线字体与非衬线字体区别 字体扫盲
  17. 基于PHP+MySQL音乐相册网站的设计与实现
  18. 分布式计算模式:MapReduce
  19. EasyRecovery15数据恢复注意事项及主要功能介绍
  20. 249部经典电影,大家编程之余可以看一下

热门文章

  1. windows 7 下让 Delphi 2010 开发的程序具备UAC管理员权限
  2. 数据猿专访网智天元莫倩:人工智能不仅是泡沫,而且会越来越大
  3. Redis【10】-Redis发布订阅
  4. 我的飞桨学习赛:英雄联盟大师预测
  5. 神舟战神Z7M-笔记本背光灯怎样打开?
  6. 昆石VOS3000_2.1.4.0安装脚本
  7. 如何将网址放到桌面并修改桌面快捷方式的图标
  8. 发票扫描识别,互联网+财税OCR解决方案
  9. plsql developer工具栏按钮不见了解决办法
  10. 网易云音乐导出歌单-速食版