菜鸟学算法-狄克斯特拉算法
什么是狄克斯特拉算法
狄克斯特拉算法用于解决有图的最短路径寻找,类似于深度优先算法,每次只走最短距离,走过的不在走,继续寻找最短距离,并不断更新到节点的开销-即是权重,保证开销最小才更新,最后所有节点全部查找完毕即可。
例如下图:
初始开销: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#-DataSet和DataTable详解
- 推荐:常见算法的python实现(github上25000多star)
- 树状数组维护区间和的模型及其拓广的简单总结
- [iOS]深度遍历view的subview
- 致敬 hacker |盘点内存虚拟化探索之路
- python项目如何上线_django项目部署上线(示例代码)
- 【对讲机的那点事】Tx/Rx系统中的非线性失真
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器
- HDU-2067-小兔的棋盘(dp)
- 学校管理系统C#(数据库、源码、演讲内容、ppt等)
- 蓝桥杯单片机数码管技巧
- 装逼软件推荐(持续)
- 重装战姬服务器正在维护,《重装战姬》2月25日更新维护公告
- 使用Python3采集小说网站
- 如何用废品DVD驱动器制作基于GRBL + CNC V3 Shield的绘图仪
- 软件测试之接口测试用例设计,全网独一份
- Linux端类似种子猫的软件,值得一试的四款Linux Torrent客户软件
- Mac/Linux 定时运行命令行
- 目的地址,源地址防火墙双向nat转换
- c语言 指针(1) 指向数组的指针
热门文章
- python画图哆啦a梦大头贴_用python的turtle库画哆啦A梦大头贴
- 写下你最懂最伤感的一句话---摘自水源
- mouseenter、mouseleave与mouseover、mouseout的区别
- python 单例模式浅析
- A 股指数成分数据 API 数据接口
- 单选框默认选中某个值
- 标准与真理——我的个人哲学
- --- Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量
- [英语单词] inside-out
- 腾讯云同一服务器绑定多个IP