算法图解第七章狄克斯特拉算法读书笔记
- 广度优先搜索找出的是段数最少的路径;狄克斯特拉算法找出最快的路径.
- 狄克斯特拉算法包含4个步骤: 1)找出"最便宜"的节点,即可在最短时间内到达的节点. 2)更新该节点的邻居的开销. 3)重复这个过程,直到对图中的每个节点都这样做了. 4) 计算最终路径.
- 狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重.带权重的图称为加权图,不带权重的图称为非加权图.要计算非加权图的最短路径,可使用广度优先搜索,要计算加权图中的最短路径,可使用狄克斯特拉算法,
- 环如图所示, 你可以从A点出发,走到一圈后又回到A点
- 无向图意味着两个节点彼此指向对方,其实就是环,在无向图中,每条边都是一个环,狄克斯特拉算法只适用于有向无环图.
- 如果有负权边,就不能使用狄克斯特拉算法
- 在包含负权边的图中,要找出最短路径,可使用另一种算法----贝尔曼-福德算法.
- python实现狄克斯特拉算法, 以下图为例:
实现代码:
# 1 把节点的所以邻居都存储到散列表
graph = {} # 散列表
graph["start"] = {} # 开始位置的散列表
graph["start"]["a"] = 6
graph["start"]["b"] = 2
print(graph["start"].keys())
graph["a"] = {} # 起点a能到达哪些点的散列表
graph["a"]["fin"] = 1 # 起点a到终点的权重graph["b"] = {}
graph["b"]["a"] = 3
graph["b"]["fin"] = 5graph["fin"] = {} # 终点的散列表没有邻居
# 2 用一个散列表来存储每个节点的开销,不知道的开销设为无穷大
infinity = float("inf") # python中表示无穷大
# 创建开销表的散列表
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity
# 3 还需要一个存储父节点的散列表
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None# 4 需要一个数组,用于记录处理过的节点,因为对于同一个节点,不用处理多次
processed = []# 算法实现思路 1:只要还有要处理的节点 --> 2: 获取离起点最近的节点 --> 3: 更新其邻居的开销 --> 4:如果有邻居的开销被更新,同时更新
# 其父节点 ---> 5:将该节点标记为处理过 回到第一点
# 找出开销最低的节点
def find_lower_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_lower_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 # 就更新该邻居的开销parents[n] = node # 同时将该邻居的父节点设置为当前节点processed.append(node) # 将该节点标记为处理过node = find_lower_cost_node(costs) # 找出接下来要处理的节点,并循环
print("最小的权重:", costs["fin"])
nodeTmp = "fin"
luxian = []
luxian.append(nodeTmp)
while nodeTmp != "start":nodeTmp = parents[nodeTmp]luxian.append(nodeTmp)
print(luxian)
算法图解第七章狄克斯特拉算法读书笔记相关推荐
- 算法图解 第7章 狄克斯特拉算法
本章内容 继续图的讨论,介绍加权图------提高或降低某些边的权重. 介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径. 介绍图中的环,它导致狄克斯特拉算法不管用. 在前一章,你找出了从A点 ...
- 《算法图解》系列笔记(七)—— 狄克斯特拉算法
狄克斯特拉算法(Dijkstra's algorithm) 广度优先搜索来查找两点之间的最短路径,那时"最短路径"的意思是段数最少.在狄克斯特拉算法中,你给每段都分配了一个数字或权 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
- 小白的算法初识课堂(part7)--狄克斯特拉算法
学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...
- 算法详解之狄克斯特拉算法
上一篇文章,我们了解了广度优先搜索算法(BFS),BFS主要用来解决图的可达路径验证和最小路径问题,即从一个顶点A到另一个顶点B,是否有可达路径,如果有那么求出其到达的最少步骤.那么这里的最短路径就如 ...
- 用狄克斯特拉算法计算带权最短路径
目录 用狄克斯特拉算法计算带权最短路径 狄克斯特拉算法思想 举一个栗子:起点到终点 举二个栗子:换钢琴 Warning 代码代码代码 python C JAVA 图文来源 用狄克斯特拉算法计算带权最短 ...
- 狄克斯特拉算法(Dijkstra)详细解释
文章目录 算法用途(目的) 算法思想与本质 图文解释 代码解析 算法用途(目的) 狄克斯特拉算法的用途或者说是目的是计算单源最短路径.单源最短路径的意思是从一个点出发到另外一个点最为的容易.举个例子解 ...
- 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
- 算法图解part7:狄克斯特拉算法
算法图解part7:狄克斯特拉(Dijkstra)算法 1.狄克斯特拉算法(Dijkstra's algorithm) 2.术语 3.负权边 4.实现狄克斯特拉算法 4.1 最短路径思路 4.2 py ...
最新文章
- MyBatis——@Result注解column参数传递——父查询函数的参数传递到子查询
- 每秒10W次高并发订单业务,你怎么实现?
- 软件测试职业发展之路的反思(转)
- C#中的套接字编程(二) --转
- linux服务器进程不存在,查看 Linux 服务器的进程
- 华为鸿蒙生态最新消息,魅族加入华为鸿蒙生态?大家先别高兴,此鸿蒙非彼鸿蒙...
- 通过adb查看当前页面中显示的窗口Activity名称
- 读书笔记 计算机系统--系统架构与操作系统的高度集成 第二章处理器体系结构...
- 慕课网EMOS在线办公系统源码笔记1-6章
- 从零开始制作小车TB6612控制电机
- 其实你不懂我的芯--SIM卡的前世今生
- C.就来谈谈深搜与广搜
- 【判断是否为手机号】
- 智能物流仓储机器人|海格里斯HEGERLS货物夹抱式防倾倒装置四向穿梭车
- 最好用的Ins客户端:Flume pro for mac
- 怎么把已经初始化的字符数组设置为空?
- 《曹云社》走进东软:奇妙的HR数字化
- nginx【nginx跨域、nginx开启gizp压缩、nginx服务器部署项目】
- 计算机毕业设计(附源码)python语言学习系统
- C语言----排班系统