链式结构和数组
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
函数用于在未访问的顶点中找到距离最小的顶点。
请注意,这个实现假设图中没有负权重的边,因为迪杰斯特拉算法不适用于包含负权重边的图。此外,这个实现也没有处理图中可能存在的孤立顶点。在实际应用中,可能需要对这些情况进行额外的处理。
全部评论