《算法图解》第七章笔记

7.1 使用狄克斯特拉算法

在这里插入图片描述
狄克斯特拉算法的用途是寻找加权图的最短路径,包含四个步骤:

  1. 找出最便宜的点,即可在最短时间内前往的点。
  2. 对于该点的邻居,检查是否有前往它们的更短路径,如果有,就更新开销。
  3. 重复这个过程,直到对图中的每个节点都这样做了。
  4. 计算最终路径。

7.2 术语

计算非加权图中的最短路径,可使用广度优先搜索;要计算加权图中的最短路径,可使用狄克斯特拉算法。狄克斯特拉算法只适用于有向无环图(directed acyclic graph,DAG)。

7.3 换钢琴

具体例子演示在书中,不多赘述。

狄克斯特拉算法背后的关键理念:找出图中最便宜的节点,并确保没有到该节点的更便宜的路径。

7.4 负权边

如果有负权边,就不能使用狄克斯特拉算法,需要使用贝尔曼-福德算法(Bellman-Ford algorithm)。

7.5 实现

在Python中为实现狄克斯特拉算法,需要三个散列表:

  • Graph:用于存储加权图结构,散列表中嵌套散列表;
  • Costs:用于存储到达某点的代价;
  • Parents:用于存储每个节点的父节点。

实现代码:

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_lowest_cost_node(costs)

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

7.6 小结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值