什么是狄克斯特拉算法

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

例如下图:

初始开销: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语言后缀表达式构造二叉树,C ++程序为后缀表达式构造表达式树
  2. 「AI在左,营销在右」互动营销创意破圈,这事儿不难
  3. oracle cube排序,Oracle命令CUBE
  4. 为什么需要Redis 集群
  5. 排序(选择,冒泡,直接插入,希尔排序)
  6. 探讨JS合并两个数组的方法
  7. mysql之group_concat函数
  8. UI设计师应该知道的,APP设计师的辅助小工具网站集合导航
  9. python itertools卡死_python中的itertools的使用详解
  10. soc设计方法与实现_冷轧钢板局部激光热处理实现汽车轻量化设计新方法
  11. TransE模型学习笔记
  12. 学Python可以做Web前端开发吗?
  13. (全程图解)Axure RP8.0安装、破解、汉化教程
  14. 计算关联系数matlab,matlab相关性系数【excel中的相关系数是如何计算出来的?】
  15. android Holo UI框架,Holo风格的开源中国Android客户端——持续更新(2)
  16. 参加2010年磨房《在路上 - 十年》百公里徒步活动小记
  17. 小乐乐和25(模拟)
  18. 还在为电脑装机而发愁吗?想摆脱装机时的捆绑软件吗?赶紧戳进来瞅瞅
  19. 全国计算机等级考试一级(WIN7+OFFICE2010)作题练习指导
  20. 【GIS小案例】点聚合效果的实现

热门文章

  1. 搭建内网pip3镜像源
  2. mysql 索引类型详解
  3. snmpwalk获取网络设备OID及相关信息
  4. 2020年阿里云基础认证(ACA - Alibaba Cloud Certification Associate)
  5. js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法
  6. h5调用原生App的方法合集
  7. fpga map测试_FPGA学习之RoadMap
  8. win台式找不到计算机管理,win10系统打开计算机管理提示windows找不到文件computer management.lnk的具体方案...
  9. java url参数加密_针对url参数的加密解密算法(原创)
  10. java handlebars_前端模板引擎Handlebars的使用总结(一)