❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!
- 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
- 导航:
- 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算法在现实世界中的应用广泛,如交通导航、网络路由等。希望本文能帮助读者理解这一强大算法的基本原理和实现方法,并激发出更多的创意,将技术和艺术有机结合。
🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)
❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
欢迎关注微信公众号 数据分析螺丝钉