算法比较

  1. 相比于第6章的广度优先算法计算的是无权图中的最短路径,狄克特斯拉算法计算的是加权图中的最短路径

算法流程

  1. 找出最便宜的节点,即可在最短时间内前往的节点。
  2. 对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销。
  3. 重复这个过程,直到对图中的每个节点都这样做了。
  4. 计算最终路径

注意事项

  1. 迪杰斯特拉适用于有向无环图,因为无向或者有环,在该算法中,你会发现它会不断的循环,因为一直有邻居。
  2. 该算法不适用于负权边,负权边的意思就是边的权重为负值。原因在于,算法本身考虑的是当前最小的cost的节点A,跳转到A节点进行下一步,如果计算完A节点的所有邻居后,根据cost的表选择另外一个节点B,从B到A权重为负值,也就意味着,A节点在cost中的值可以被更新,但是算法已经将节点A剔除。

代码讲解

上图中,左图是我们要解决的问题,首先我们需要用的是构建三个散列表,下面详细看代码

#author:ErenCoder#构建图
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']={}#构建cost表
infinity=float('inf')
costs={}
costs['a']=6
costs['b']=2
costs['fin']=infinity#构建parents表
parents={}
parent['a']='start'
parent['b']='start'
parent['fin']=None#记录处理过的节点
processed=[]#在未处理的节点中找出开销最小的节点
node=find_lowest_cost_node(costs)
#这个while循环在所有节点都被处理过后结束
while node is not None:cost=costs[node]neighbors=graph[node]#遍历当前节点的所有邻居for n in neighbors.keys():#更新节点n的cost值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)
def find_lowest_cost_node(costs):lowest_cost=float('inf')lowest_cost_node=None#遍历所有的节点for node in costs:cost=costs[node]#如果当前节点的开销更低且未处理过if cost<lowest_cost and node not in processed:lowest_cost=costlowest_cost_node=nodereturn lowest_cost_node

大家如果有不理解的欢迎随时交流,freestyle

第7章——狄克特斯拉算法相关推荐

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

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

  2. 【狄克特斯拉算法验证】

    #include <stdio.h> #include "graph.h" void Ppath(int path[],int i,int v) //前向递归查找路径上 ...

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

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

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

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

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

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

  6. 算法图解-狄克斯特拉算法

    本章内容: 加权图-提高或者降低某些边的权重 狄克斯特拉算法,能找出加权图中前往x的最短路径 图中的环,它导致狄克斯特拉算不管用 7.1狄克斯特拉算法 4个步骤: 找出最便宜的节点,即最短时间内前往的 ...

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

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

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

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

  9. 算法图解part7:狄克斯特拉算法

    算法图解part7:狄克斯特拉(Dijkstra)算法 1.狄克斯特拉算法(Dijkstra's algorithm) 2.术语 3.负权边 4.实现狄克斯特拉算法 4.1 最短路径思路 4.2 py ...

最新文章

  1. SAP MM 预留单据里的Base date和Requirement date
  2. python终端中退格键,方向键不能使用
  3. 完美解决Flask-Migrate使用SQLite生成自动迁移脚本的Bug
  4. 正则表达式 语言间通用
  5. gt,gte,lt,lte缩写的含义
  6. linux变量赋值用中括号,Shell脚本定义变量和重新赋值
  7. 1047:判断能否被3,5,7整除
  8. Docker快速部署PostgreSQL服务
  9. 瑞典 林雪平大学 机器人视觉方向 博士招生
  10. Python案例:用米粒填充国际象棋盘
  11. 又一家药企IPO被拒,原因竟然是……
  12. 9月16日见!vivo高管亲曝NEX 3 5G:99.6%屏占比确认
  13. android8 测试,Android 8.0 Oreo 国内可用测试平台上线
  14. IM系统中聊天记录模块的设计与实现
  15. Netty-Pipeline组件
  16. 【人脸识别】基于matlab二值膨胀差分和椒盐滤波教室内人数统计【含Matlab源码 251期】
  17. Django-应用与分布式路由
  18. line-height绝对值和相对值的区别
  19. 怎么查看拼多多店铺销量?怎么查看店铺后台数据图?
  20. php 微信文章阅读量,微信阅读量

热门文章

  1. CompletableFuture:让你的代码免受阻塞之苦
  2. 一个牛逼的 多级缓存 实现方案!
  3. 拜托!不要用“ ! = null 做判空了
  4. 漫画 | 如何向外行解释产品经理频繁更改需求会令程序员很焦灼?
  5. 配置 Spring Batch 批处理失败重试
  6. 为什么 Java 中“1000==1000”为false,而”100==100“为true?
  7. 跳来跳去,到底去大公司还是小公司?
  8. 前后端分离接口规范~
  9. 1行代码消除PyTorch的CUDA内存溢出报错,这个GitHub项目刚发布就揽星600+
  10. 西湖大学三位资深博导自述:我与我的第一位博士生