❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!
推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
导航:
- LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
- 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
- python源码解读:解读python的源代码与调用关系,快速提升代码质量
- python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
- 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识
期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️
引言
《庆余年》是一部引人入胜的古装剧,讲述了范闲在风云变幻的朝堂与江湖中历险成长的故事。在这个复杂的世界中,范闲需要不断地做出重要的决策,要是范闲是学好算法穿越的话,可以想象能有多强,本文将通过一个情境,展示如何使用Python中的Dijkstra算法来帮助范闲找到在京城内安全抵达目的地的最短路径。
背景
好的,让我们设定一个范闲要到皇宫偷钥匙的情境,并将各个点引用《庆余年》中的真实地名。我们将范府、街市、酒楼、戏院、客栈和皇宫作为节点,并设置相应的路径距离。
地图节点及其关系
- 范府 (起点)
- 街市 (A)
- 酒楼 (B)
- 戏院 (C)
- 客栈 (D)
- 皇宫 (E) (终点)
路径距离
我们假设以下路径距离:
- 范府到街市:2
- 范府到酒楼:5
- 街市到戏院:4
- 街市到客栈:7
- 酒楼到客栈:3
- 戏院到客栈:1
- 戏院到皇宫:3
- 客栈到皇宫:2
情境图解
以下是这个情境的ASCII图解:
范府
/ \
2/ \5
/ \
街市-----酒楼
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈---戏院
1\ 3 /
\ /
皇宫
算法和实现步骤
好的,让我们详细介绍Dijkstra算法的算力和实现步骤,并确保结合《庆余年》的情境,清晰地展示范闲从范府到皇宫的最短路径。
Dijkstra算法简介
Dijkstra算法是一种经典的图搜索算法,用于查找图中节点之间的最短路径。它以贪心的方式逐步扩展最短路径集,直至找到目标节点。该算法适用于加权图,并要求权重为非负数。
算力分析
- 时间复杂度:Dijkstra算法的时间复杂度取决于使用的数据结构。使用优先队列(如二叉堆)时,时间复杂度为O((V + E) log V),其中V是节点数,E是边数。
- 空间复杂度:空间复杂度为O(V),用于存储节点的距离和优先队列。
实现步骤
-
初始化:
- 将起点的最短路径设置为0,其余所有节点的最短路径设置为无穷大(∞)。
- 将所有节点标记为未访问。
- 使用优先队列(最小堆)存储节点及其当前的最短路径。
-
选取当前节点:
- 从优先队列中取出当前最短路径最小的节点,作为当前节点。
-
更新邻居节点的最短路径:
- 对于当前节点的每一个邻居节点,计算从起点到该邻居节点的路径长度。
- 如果计算得到的路径长度小于当前存储的路径长度,则更新该邻居节点的最短路径,并将其重新加入优先队列。
-
标记节点为已访问:
- 将当前节点标记为已访问。
-
重复步骤2-4,直到所有节点都被访问过或优先队列为空。
-
返回结果:
- 返回从起点到所有节点的最短路径。
Python实现Dijkstra算法
我们使用Dijkstra算法计算范闲从范府到皇宫的最短路径。
import heapq
def dijkstra(graph, start):
# 初始化
shortest_paths = {node: float('inf') for node in graph}
shortest_paths[start] = 0
priority_queue = [(0, start)]
visited = set()
while priority_queue:
(current_distance, current_node) = heapq.heappop(priority_queue)
if current_node in visited:
continue
visited.add(current_node)
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
if distance < shortest_paths[neighbor]:
shortest_paths[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return shortest_paths
# 示例图
graph = {
'范府': {'街市': 2, '酒楼': 5},
'街市': {'范府': 2, '戏院': 4, '客栈': 7},
'酒楼': {'范府': 5, '客栈': 3},
'戏院': {'街市': 4, '客栈': 1, '皇宫': 3},
'客栈': {'街市': 7, '酒楼': 3, '戏院': 1, '皇宫': 2},
'皇宫': {'戏院': 3, '客栈': 2}
}
# 计算最短路径
start_node = '范府'
shortest_paths = dijkstra(graph, start_node)
# 输出结果
print(f"从{start_node}出发到各节点的最短路径:")
for node, distance in shortest_paths.items():
print(f"到{node}的最短路径是{distance}")
好的,我们将按照您提供的图进行详细的Dijkstra算法步骤解析。
算法图解
初始状态
每个节点的最短路径都设置为无穷大(∞),除了起点范府,其最短路径为0:
节点 最短路径
范府 0
街市 ∞
酒楼 ∞
戏院 ∞
客栈 ∞
皇宫 ∞
ASCII图解
以下是详细标注的ASCII图解,确保每个路径和距离准确对应:
范府
/ \
2/ \5
/ \
街市-----酒楼
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈---戏院
1\ 3 /
\ /
皇宫
详细步骤图解
步骤1:从范府(距离为0)出发,更新邻居街市和酒楼的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 ∞
客栈 ∞
皇宫 ∞
图解:
范府(0)
/ \
2/ \5
/ \
街市(2) 酒楼(5)
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈(∞)戏院(∞)
1\ 3 /
\ /
皇宫(∞)
步骤2:选择当前距离最小的未访问节点(街市),更新街市的邻居戏院和客栈的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6 (2+4)
客栈 9 (2+7)
皇宫 ∞
图解:
范府(0)
/ \
2/ \5
/ \
街市(2) 酒楼(5)
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈(9)戏院(6)
1\ 3 /
\ /
皇宫(∞)
步骤3:选择当前距离最小的未访问节点(戏院),更新戏院的邻居客栈和皇宫的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6
客栈 7 (6+1)
皇宫 9 (6+3)
图解:
范府(0)
/ \
2/ \5
/ \
街市(2) 酒楼(5)
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈(7)戏院(6)
1\ 3 /
\ /
皇宫(9)
步骤4:选择当前距离最小的未访问节点(客栈),更新客栈的邻居皇宫的距离。
更新后:
节点 最短路径
范府 0
街市 2
酒楼 5
戏院 6
客栈 7
皇宫 9 (7+2)
图解:
范府(0)
/ \
2/ \5
/ \
街市(2) 酒楼(5)
| \ |
| \ |
| 4\ |3
| \ |
| 7 \ |
| \|
客栈(7)戏院(6)
1\ 3 /
\ /
皇宫(9)
最终结果:从范府到各个节点的最短路径为:
从范府出发到各节点的最短路径:
到范府的最短路径是0
到街市的最短路径是2
到酒楼的最短路径是5
到戏院的最短路径是6
到客栈的最短路径是7
到皇宫的最短路径是9
通过这些步骤,范闲最终找到从范府到皇宫的最短路径为9。
结论
通过本文,我们展示了如何利用Python中的Dijkstra算法在《庆余年》中的情境下帮助范闲找到最优路径。虽然这只是一个虚构的例子,但Dijkstra算法在现实世界中的应用广泛,如交通导航、网络路由等。希望本文能帮助读者理解这一强大算法的基本原理和实现方法,并激发出更多的创意,将技术和艺术有机结合。
🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)
❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)