Python数据结构之图
图(Graph)是一种非常常用的数据结构,它由节点(顶点)和边组成,用来表示各种关系和连接。在计算机科学中,图被广泛应用于网络、社交媒体、路由算法等领域。Python 提供了许多库和模块来操作图,本文将介绍一些常用的图数据结构以及对应的操作方法。
图的表示
在 Python 中,我们可以使用邻接矩阵或邻接表来表示图。邻接矩阵是一个二维数组,其中行表示起始顶点,列表示目标顶点,如果两个顶点之间有边,则对应元素的值为1,否则为0。邻接表则是一个以顶点作为键、以与该顶点相邻的顶点列表作为值的字典。
下面是一个使用邻接矩阵表示的图的示例:
graph_matrix = [
[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 1, 0]
]
下面是一个使用邻接表表示的图的示例:
graph_dict = {
'A': ['B', 'C'],
'B': ['A', 'D'],
'C': ['A', 'D'],
'D': ['B', 'C']
}
图的遍历
图的遍历是指访问图中所有节点的过程。常见的图遍历方法有深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索是一种递归的遍历方法,它从根节点开始,一直遍历到最深处,然后回溯到上一层继续遍历。
下面是一个使用深度优先搜索遍历图的示例:
def dfs(graph, start, visited):
visited.add(start)
print(start, end=" ")
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
dfs(graph_dict, 'A', set())
广度优先搜索是一种迭代的遍历方法,它从根节点开始,按层遍历,先访问邻居节点,再访问邻居的邻居节点。
下面是一个使用广度优先搜索遍历图的示例:
def bfs(graph, start):
visited = set()
queue = [start]
visited.add(start)
while queue:
node = queue.pop(0)
print(node, end=" ")
for neighbor in graph[node]:
if neighbor not in visited:
queue.append(neighbor)
visited.add(neighbor)
bfs(graph_dict, 'A')
图的最短路径
图的最短路径指的是从一个顶点到另一个顶点的最短路径。常用的最短路径算法有 Dijkstra 算法和 Floyd-Warshall 算法。
Dijkstra 算法是一种贪心算法,它通过不断选择当前最短路径的节点来计算最短路径。
下面是一个使用 Dijkstra 算法计算最短路径的示例:
import heapq
def dijkstra(graph, start):
distances = {vertex: float('inf') for vertex in graph}
distances[start] = 0
queue = [(0, start)]
while queue:
current_distance, current_vertex = heapq.heappop(queue)
if current_distance > distances[current_vertex]:
continue
for neighbor, weight in graph[current_vertex].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(queue, (distance, neighbor))
return distances
graph = {
'A': {'B': 7, 'C': 9, 'F': 14},
'B': {'A': 7, 'C': 10, 'D': 15},
'C': {'A': 9, 'B': 10, 'D': 11, 'F': 2},
'D': {'B': 15, 'C': 11, 'E': 6},
'E': {'D': 6, 'F': 9