Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅

简介: Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

引言

《庆余年》是一部引人入胜的古装剧,讲述了范闲在风云变幻的朝堂与江湖中历险成长的故事。在这个复杂的世界中,范闲需要不断地做出重要的决策,要是范闲是学好算法穿越的话,可以想象能有多强,本文将通过一个情境,展示如何使用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),用于存储节点的距离和优先队列。

实现步骤

  1. 初始化
  • 将起点的最短路径设置为0,其余所有节点的最短路径设置为无穷大(∞)。
  • 将所有节点标记为未访问。
  • 使用优先队列(最小堆)存储节点及其当前的最短路径。
  1. 选取当前节点
  • 从优先队列中取出当前最短路径最小的节点,作为当前节点。
  1. 更新邻居节点的最短路径
  • 对于当前节点的每一个邻居节点,计算从起点到该邻居节点的路径长度。
  • 如果计算得到的路径长度小于当前存储的路径长度,则更新该邻居节点的最短路径,并将其重新加入优先队列。
  1. 标记节点为已访问
  • 将当前节点标记为已访问。
  1. 重复步骤2-4,直到所有节点都被访问过或优先队列为空。
  2. 返回结果
  • 返回从起点到所有节点的最短路径。

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算法在现实世界中的应用广泛,如交通导航、网络路由等。希望本文能帮助读者理解这一强大算法的基本原理和实现方法,并激发出更多的创意,将技术和艺术有机结合。

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的自适应学习算法研究与应用
在深度学习领域,传统的静态模型在处理动态环境和非平稳数据时面临挑战。本文探讨了自适应学习算法在深度学习中的重要性及其应用。通过分析自适应学习算法在模型参数、损失函数和数据分布上的应用,展示了其在提升模型鲁棒性和泛化能力方面的潜力。具体讨论了几种代表性的自适应学习方法,并探索了它们在现实世界中的应用案例,从而展示了其在处理复杂问题和动态数据中的效果。
16 0
|
5天前
|
存储 算法
贪心算法的高逼格应用——Huffman编码
贪心算法的高逼格应用——Huffman编码
25 8
|
1天前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
10 1
|
4天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
10天前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
26 7
|
6天前
|
存储 安全 算法
三种常见的加密算法:MD5、对称加密与非对称加密的比较与应用
网络安全聚焦加密算法:MD5用于数据完整性校验,易受碰撞攻击;对称加密如AES快速高效,密钥管理关键;非对称加密如RSA提供身份验证,速度慢但安全。三种算法各有所长,适用场景各异,安全与效率需权衡。【6月更文挑战第17天】
17 2
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
20 1
|
8天前
|
机器学习/深度学习 算法 Python
【算法】深入浅出爬山算法:原理、实现与应用
【算法】深入浅出爬山算法:原理、实现与应用
16 3
|
7天前
|
传感器 人工智能 运维
智慧电厂转动设备的“非停监测”及算法应用
转动设备故障预测技术在智慧电厂中至关重要,防止非计划停机能避免经济损失和安全风险。结合传统数学模型与AI大数据分析,通过高精度传感器实时监测设备参数,利用智能算法精准预测异常,提前预警潜在故障。AI驱动的模型不仅能识别已知故障,还能预测未知问题,优化维护决策,减少停机时间,降低成本,增强可再生能源设施的运维效率,推动绿色能源转型。
|
8天前
|
机器学习/深度学习 算法 Python
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。