什么是狄克斯特拉算法

狄克斯特拉算法用于解决有图的最短路径寻找,类似于深度优先算法,每次只走最短距离,走过的不在走,继续寻找最短距离,并不断更新到节点的开销-即是权重,保证开销最小才更新,最后所有节点全部查找完毕即可。

例如下图:

初始开销:A:6,B:2,终点:∞

算法执行过程如下

起点--B--终点 终点开销更新为 7

起点--B--A A点开销更新为5

起点--B--A--终点 终点开销更新为 6

起点--A A处理过,不在处理

最后开销:A:5,B:2,终点:6

代码实现:

'''--------------加权散列表逻辑体现-----------'''
graph = {}
graph['start'] = {}
graph['start']['A'] = 6
graph['start']['B'] = 2
#print(graph['start'].keys())
graph['A'] = {}
graph['A']['FIN'] = 1
graph['B'] = {}
graph['B']['FIN'] = 5
graph['B']['A'] = 3graph['FIN'] = {} #没有任何邻居
'''--------------开销表逻辑体现-----------'''
infinity = float('inf')
costs = {}
costs['A'] = 6
costs['B'] = 2
costs['FIN'] = infinity
'''--------------父节点散列表逻辑体现-----------'''
parent = {}
parent['A'] = 'start'
parent['B'] = 'start'
parent['FIN'] = None
'''--------------处理过节点-----------'''
processed  = []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 = cost #就将其视为开销最低的节点lowest_cost_node = nodereturn lowest_cost_nodenode = find_lowest_cost_node(costs) #在未处理节点中找到开销最小节点
while node is not None: #这个while循环再所有节点都被处理后结束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 #就更新该邻居的开销parent[n] = nodeprocessed.append(node)node = find_lowest_cost_node(costs)print(costs)
print(parent)

终点最短开销:6

路径:start--B--A--FIN

小结

  • 广度优先搜索用于在非加权图中查找最短路径。
  • 狄克斯特拉算法用于在加权图中查找最短路径。
  • 仅当权重为正时狄克斯特拉算法才管用。
  • 如果图中包含负权边,请使用贝尔曼福德算法。

菜鸟学算法-狄克斯特拉算法相关推荐

  1. 算法 | 狄克斯特拉算法

    算法 | 狄克斯特拉算法 1. 简介 简介: 摘自百度百科 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路 ...

  2. 算法-狄克斯特拉算法

    狄克斯特拉算法简介 狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题,但不能用于包含负权边的图.而广度优先搜索算法解决的是无权图中的最短路径问题. 一般分为4个步骤: ...

  3. 最短路-弗洛伊德算法狄克斯特拉算法

    最短路 1.多源最短路 定义:现有n个地点,求任意两点间的最短距离 算法:弗洛伊德(floyd)算法 思想:让每一个点成为中转点,进行"松弛"操作: 所谓松弛操作就是要搞出 A+B ...

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

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

  5. 算法之狄克斯特拉算法 --《图解算法》

    2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...

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

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

  7. 狄克斯特拉算法(入门)

    狄克斯特拉算法可以找出加权图中前往X的最短路径. 注意: - 其只适用于有向无环图 - 适用于正权边,负权边的将出错(贝尔曼-福德算法适用于负权边) 步骤: 找出当前最"便宜"的节 ...

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

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

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

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

最新文章

  1. C#-DataSet和DataTable详解
  2. 推荐:常见算法的python实现(github上25000多star)
  3. 树状数组维护区间和的模型及其拓广的简单总结
  4. [iOS]深度遍历view的subview
  5. 致敬 hacker |盘点内存虚拟化探索之路
  6. python项目如何上线_django项目部署上线(示例代码)
  7. 【对讲机的那点事】Tx/Rx系统中的非线性失真
  8. 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器
  9. HDU-2067-小兔的棋盘(dp)
  10. 学校管理系统C#(数据库、源码、演讲内容、ppt等)
  11. 蓝桥杯单片机数码管技巧
  12. 装逼软件推荐(持续)
  13. 重装战姬服务器正在维护,《重装战姬》2月25日更新维护公告
  14. 使用Python3采集小说网站
  15. 如何用废品DVD驱动器制作基于GRBL + CNC V3 Shield的绘图仪
  16. 软件测试之接口测试用例设计,全网独一份
  17. Linux端类似种子猫的软件,值得一试的四款Linux Torrent客户软件
  18. Mac/Linux 定时运行命令行
  19. 目的地址,源地址防火墙双向nat转换
  20. c语言 指针(1) 指向数组的指针

热门文章

  1. python画图哆啦a梦大头贴_用python的turtle库画哆啦A梦大头贴
  2. 写下你最懂最伤感的一句话---摘自水源
  3. mouseenter、mouseleave与mouseover、mouseout的区别
  4. python 单例模式浅析
  5. A 股指数成分数据 API 数据接口
  6. 单选框默认选中某个值
  7. 标准与真理——我的个人哲学
  8. --- Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量
  9. [英语单词] inside-out
  10. 腾讯云同一服务器绑定多个IP