链式结构和数组

192 2024-12-05 11:19

计算机擅长遍历。那就是时空,就是数组,而这些都是二维的甚至是一维的生产过程。当遇到图、权重连接的键值对儿的时候,就一下变成了高维的思维方式。那时需要链式结构来作为存储的数据结构。计算能量值表达场的状态。

迪杰斯特拉(Dijkstra)算法是一种用于计算图中单源最短路径问题的算法。以下是该算法的一些关键点:

1. **算法定义**:迪杰斯特拉算法由荷兰计算机科学家艾兹格·迪杰斯特拉于1956年提出,用于计算一个节点到其他节点的最短路径。它是一种贪心算法,每次选择未访问顶点中距离源点最近的顶点,并更新其相邻顶点的距离。

2. **算法原理**:算法从指定的起点开始,逐步选择当前距离起点最近的顶点,将其加入已访问集合中,并更新其相邻顶点到起点的最短路径长度。这个过程重复进行,直到所有顶点都被访问。

3. **算法步骤**:
   - **初始化**:设置一个数组来保存源点到各个顶点的最短距离,并将所有顶点的距离初始化为无穷大,除了源点自身为0。同时,创建一个集合来保存已经找到最短路径的顶点。
   - **选择最近顶点**:从未访问的顶点中选择距离源点最近的顶点,并将其标记为已访问。
   - **更新距离**:更新新访问顶点的相邻顶点到源点的距离。如果通过新访问的顶点到达相邻顶点的路径更短,则更新该路径长度。
   - **重复过程**:重复上述步骤,直到所有顶点都被访问或者目标顶点被访问。

4. **算法特点**:
   - 迪杰斯特拉算法适用于有权图中的单源最短路径问题,且所有边的权重都为非负值。
   - 算法的核心是贪心策略,即在每一步选择当前已知的最短路径。
   - 算法不能处理带有负权边的图。

5. **算法应用**:迪杰斯特拉算法常用于路由算法或者作为其他图算法的一个子模块,解决赋权有向图或无向图的单源最短路径问题。

迪杰斯特拉算法是一种非常有效的算法,广泛应用于网络路由、地图导航等领域。

 

下面是一个简单的 Python 实现迪杰斯特拉算法的代码示例:

import sys

# 定义一个函数来找到未访问顶点中距离源点最近的顶点
def find_min_distance(dist, visited):
    min_distance = sys.maxsize
    min_index = -1
    for v in range(len(dist)):
        if dist[v] < min_distance and not visited[v]:
            min_distance = dist[v]
            min_index = v
    return min_index

# 实现迪杰斯特拉算法
def dijkstra(graph, src):
    num_vertices = len(graph)
    dist = [sys.maxsize] * num_vertices  # 距离数组,初始化为无穷大
    dist[src] = 0  # 源点到自身的距离为0
    visited = [False] * num_vertices  # 访问标记数组

    for _ in range(num_vertices):
        # 找到未访问顶点中距离最小的顶点
        u = find_min_distance(dist, visited)
        # 标记该顶点为已访问
        visited[u] = True

        # 更新相邻顶点的距离
        for v in range(num_vertices):
            if graph[u][v] > 0 and not visited[v] and dist[u] != sys.maxsize and dist[u] + graph[u][v] < dist[v]:
                dist[v] = dist[u] + graph[u][v]

    return dist

# 定义图的邻接矩阵
graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],
         [4, 0, 8, 0, 0, 0, 0, 11, 0],
         [0, 8, 0, 7, 0, 4, 0, 0, 2],
         [0, 0, 7, 0, 9, 14, 0, 0, 0],
         [0, 0, 0, 9, 0, 10, 0, 0, 0],
         [0, 0, 4, 14, 10, 0, 2, 0, 0],
         [0, 0, 0, 0, 0, 2, 0, 1, 6],
         [8, 11, 0, 0, 0, 0, 1, 0, 7],
         [0, 0, 2, 0, 0, 0, 6, 7, 0]]

# 调用迪杰斯特拉算法
src = 0  # 源点为0
print("Vertex \t Distance from Source")
for i in range(len(graph)):
    print(f"{i} \t\t {dijkstra(graph, src)[i]}")

这段代码定义了一个图的邻接矩阵,并使用迪杰斯特拉算法计算从源点(这里假设为顶点0)到其他所有顶点的最短路径。dijkstra 函数接受一个图(以邻接矩阵形式表示)和一个源点作为输入,并返回一个数组,其中包含了源点到每个顶点的最短距离。find_min_distance 函数用于在未访问的顶点中找到距离最小的顶点。

请注意,这个实现假设图中没有负权重的边,因为迪杰斯特拉算法不适用于包含负权重边的图。此外,这个实现也没有处理图中可能存在的孤立顶点。在实际应用中,可能需要对这些情况进行额外的处理。

全部评论

·