算法与Python

算法与Python 知识量:10 - 40 - 100

9.1 迪可斯特朗算法><

什么是迪可斯特朗算法- 9.1.1 -

迪可斯特朗算法(Dijkstra's algorithm)是一种非常有效的求解最短路径问题的算法,它适用于有向图和无向图。该算法的基本思想是从起始节点开始,逐步扩展到相邻节点,然后继续扩展到更远的节点,直到找到目标节点或所有节点都被访问过。

算法步骤如下:

  1. 初始化:设置源节点的距离为0,所有其他节点的距离设置为无穷大(表示尚未访问)。

  2. 找到距离最小的节点,将其标记为已访问。

  3. 对于已访问的节点,检查其所有相邻节点。如果通过当前节点到达相邻节点能够获得更短的路径,则更新相邻节点的距离。

  4. 重复步骤2和3,直到所有节点都被访问过或找到目标节点。

在实现上,可以使用优先队列(如堆)来快速找到距离最小的节点。另外,可以使用邻接矩阵或邻接表来存储图的拓扑结构。

迪可斯特朗算法的时间复杂度取决于图的大小和稀疏程度。在最坏情况下,时间复杂度为O((E+V)logV),其中E是边的数量,V是顶点的数量。但在实际应用中,由于算法采用了优先队列来优化查找最小距离节点的过程,因此通常具有较好的实际性能。

算法实现- 9.1.2 -

下面是一个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表示起点节点。函数返回一个字典,表示从起点到各个节点的最短距离。