算法与Python 知识量:10 - 40 - 100
迪可斯特朗算法(Dijkstra's algorithm)是一种非常有效的求解最短路径问题的算法,它适用于有向图和无向图。该算法的基本思想是从起始节点开始,逐步扩展到相邻节点,然后继续扩展到更远的节点,直到找到目标节点或所有节点都被访问过。
算法步骤如下:
初始化:设置源节点的距离为0,所有其他节点的距离设置为无穷大(表示尚未访问)。
找到距离最小的节点,将其标记为已访问。
对于已访问的节点,检查其所有相邻节点。如果通过当前节点到达相邻节点能够获得更短的路径,则更新相邻节点的距离。
重复步骤2和3,直到所有节点都被访问过或找到目标节点。
在实现上,可以使用优先队列(如堆)来快速找到距离最小的节点。另外,可以使用邻接矩阵或邻接表来存储图的拓扑结构。
迪可斯特朗算法的时间复杂度取决于图的大小和稀疏程度。在最坏情况下,时间复杂度为O((E+V)logV),其中E是边的数量,V是顶点的数量。但在实际应用中,由于算法采用了优先队列来优化查找最小距离节点的过程,因此通常具有较好的实际性能。
下面是一个Python实现迪可斯特朗算法的示例代码:
import heapq def dijkstra(graph, start): # 初始化距离字典,将所有节点距离设置为无穷大,将起点距离设置为0 distances = {node: float('inf') for node in graph} distances[start] = 0 # 使用最小堆存储节点和对应的距离 nodes = [(0, start)] while nodes: # 取出距离最小的节点 current_distance, current_node = heapq.heappop(nodes) # 如果当前节点已经被访问过,跳过 if current_distance > distances[current_node]: continue # 遍历当前节点的相邻节点 for neighbor, weight in graph[current_node].items(): distance = current_distance + weight # 如果通过当前节点到达相邻节点能够获得更短的路径,则更新距离字典和最小堆 if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(nodes, (distance, neighbor)) return distances
其中,graph是一个字典,表示图的拓扑结构。字典的键表示节点,值表示与该节点相邻的节点及其权重的字典。例如,对于有向图{'A': {'B': 1, 'C': 3}, 'B': {'A': 1, 'C': 2}, 'C': {'A': 3, 'B': 2}},表示从A到B的距离为1,从A到C的距离为3,从B到A的距离为1,从B到C的距离为2,从C到A的距离为3,从C到B的距离为2。start表示起点节点。函数返回一个字典,表示从起点到各个节点的最短距离。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6