菜鸟学算法-狄克斯特拉算法
什么是狄克斯特拉算法
狄克斯特拉算法用于解决有图的最短路径寻找,类似于深度优先算法,每次只走最短距离,走过的不在走,继续寻找最短距离,并不断更新到节点的开销-即是权重,保证开销最小才更新,最后所有节点全部查找完毕即可。
例如下图:
初始开销: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. 简介 简介: 摘自百度百科 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路 ...
- 算法-狄克斯特拉算法
狄克斯特拉算法简介 狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题,但不能用于包含负权边的图.而广度优先搜索算法解决的是无权图中的最短路径问题. 一般分为4个步骤: ...
- 最短路-弗洛伊德算法狄克斯特拉算法
最短路 1.多源最短路 定义:现有n个地点,求任意两点间的最短距离 算法:弗洛伊德(floyd)算法 思想:让每一个点成为中转点,进行"松弛"操作: 所谓松弛操作就是要搞出 A+B ...
- 算法图解 第7章 狄克斯特拉算法
本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...
- 算法之狄克斯特拉算法 --《图解算法》
2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...
- 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
- 狄克斯特拉算法(入门)
狄克斯特拉算法可以找出加权图中前往X的最短路径. 注意: - 其只适用于有向无环图 - 适用于正权边,负权边的将出错(贝尔曼-福德算法适用于负权边) 步骤: 找出当前最"便宜"的节 ...
- 小白的算法初识课堂(part7)--狄克斯特拉算法
学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
最新文章
- c语言后缀表达式构造二叉树,C ++程序为后缀表达式构造表达式树
- 「AI在左,营销在右」互动营销创意破圈,这事儿不难
- oracle cube排序,Oracle命令CUBE
- 为什么需要Redis 集群
- 排序(选择,冒泡,直接插入,希尔排序)
- 探讨JS合并两个数组的方法
- mysql之group_concat函数
- UI设计师应该知道的,APP设计师的辅助小工具网站集合导航
- python itertools卡死_python中的itertools的使用详解
- soc设计方法与实现_冷轧钢板局部激光热处理实现汽车轻量化设计新方法
- TransE模型学习笔记
- 学Python可以做Web前端开发吗?
- (全程图解)Axure RP8.0安装、破解、汉化教程
- 计算关联系数matlab,matlab相关性系数【excel中的相关系数是如何计算出来的?】
- android Holo UI框架,Holo风格的开源中国Android客户端——持续更新(2)
- 参加2010年磨房《在路上 - 十年》百公里徒步活动小记
- 小乐乐和25(模拟)
- 还在为电脑装机而发愁吗?想摆脱装机时的捆绑软件吗?赶紧戳进来瞅瞅
- 全国计算机等级考试一级(WIN7+OFFICE2010)作题练习指导
- 【GIS小案例】点聚合效果的实现
热门文章
- 搭建内网pip3镜像源
- mysql 索引类型详解
- snmpwalk获取网络设备OID及相关信息
- 2020年阿里云基础认证(ACA - Alibaba Cloud Certification Associate)
- js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法
- h5调用原生App的方法合集
- fpga map测试_FPGA学习之RoadMap
- win台式找不到计算机管理,win10系统打开计算机管理提示windows找不到文件computer management.lnk的具体方案...
- java url参数加密_针对url参数的加密解密算法(原创)
- java handlebars_前端模板引擎Handlebars的使用总结(一)