【读书笔记】《算法图解》第七章 狄克斯特拉算法

第七章 狄克斯特拉算法

1. 使用狄克斯特拉算法

如果你需要找出最快的路径,给这些路段加上时间,可使用狄克斯特拉算法。
狄克斯特拉算法包含4个步骤:

  1. 找出“最便宜”的节点,即可在最短时间内到达的节点
  2. 对于该节点的邻居,检查是否有前往他们的最短路径,如果有,就更新其开销。
    (开销指的是从起点出发前往该节点需要多长时间)
  3. 重复这个过程,直到对图中的每个节点都这样做了
  4. 计算最终路径

2. 术语

权重:用于每条边都有关联数字的图,这些数字称为权重(weight)
加权图:带权重的图称为加权图(weighted graph)
非加权图:不带权重的图称为非加权图(unweighted graph)
环:你可以从一个节点出发,走一圈后又回到这个节点。
注意:

  1. 要计算非加权图中的最短路径,可使用广度优先搜索
  2. 要计算加权图中的最短路径,可使用狄克斯特拉算法
  3. 在无相图中,每条边都是一个环
  4. 狄克斯特拉算法只使用于有向无环图
  5. 换钢琴
    狄克斯特拉算法背后的关键理念:找出图中最便宜的节点,并确保没有到该节点的更便宜的路径。
    最短路径指的不一定是物理距离,也可能是让某种度量指标最小。

4. 负权边

负权边:即权重为负的边
如果有负权边,就不能使用狄克斯特拉算法
在包含负权边的图中,要找出最短路径,可使用另一种算法 — 贝尔曼福德算法

5. 实现

实现狄克斯特拉算法的python代码如下:

graph= {}
infinity = float(“inf”)
costs= {}
parents = {}
processed = []
def find_lowest_cost_node(costs):
lowest_cost = float(“inf”)
lowest_cost_node = None
for node in costs:
cost = costs[node]
if cost < lowest_cost and node not in processed:
lowest_cost = cost
lowest_cost_node = node
return lowest_cost_node
node = find_lowest_cost_node(costs)
while node is not None:
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)

6. 小结

  1. 广度优先搜索用于在非加权图中查找最短路径
  2. 狄克斯特拉算法用于在加权图中查找最短路径
  3. 仅当权重为正时狄克斯特拉算法才有用
  4. 如果图中包含负权边,使用贝尔曼福特算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值