- 图的表示和遍历:用于处理社交网络、推荐系统等结构化数据。
图论是研究图(Graph)结构的数学分支,在处理网络、关系和结构化数据时起着至关重要的作用。本文将从图的基本表示、遍历算法及其在实际应用中的使用展开讨论,并配以代码和可视化示例。
1. 图的基本表示
1.1 定义
图由节点(顶点)和边组成。
- 无向图:边没有方向,如 (u, v) 表示节点 u 和 v 之间的连接。
- 有向图:边有方向,如 (u, v) 表示从节点 u 到 v 的连接。
1.2 表示方法
- 邻接矩阵:用 n × n 的矩阵表示,矩阵的元素表示节点之间是否有边。
- 邻接表:每个节点对应一个列表,存储与该节点相连的所有节点。
节点 1: [2, 3] 节点 2: [1, 4] 节点 3: [1]
1.3 Python 实现
import numpy as np
# 邻接矩阵
graph = np.array([
[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 0],
[0, 1, 0, 0]
])
print("邻接矩阵:")
print(graph)
2. 图的遍历
2.1 深度优先搜索 (DFS)
DFS 按照深度优先的策略遍历节点,适用于寻找路径或检查连通性。
2.1.1 定义
深度优先搜索按照递归深入的方式访问节点,尽可能向深层的节点探索,直到无法继续,再回溯到上一层节点。
2.1.2 算法流程
- 从起始节点出发,标记为已访问。
- 访问其一个未访问的邻居节点。
- 对该邻居节点重复步骤 1 和 2。
- 如果当前节点的所有邻居都已访问,则回溯到上一个节点。
- 重复直到所有节点访问完毕。
2.1.3 Python 实现
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=" ") # 输出当前节点
for neighbor in graph[start]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
# 示例图:邻接表表示
graph = {
1: [2, 3],
2: [4],
3: [5],
4: [],
5: []
}
print("深度优先搜索结果:")
dfs(graph, 1)
深度优先搜索结果:
1 2 4 3 5
2.1.4 应用案例
- 连通性检查:检查图是否是一个连通图。
- 路径探索:用于迷宫或网络中的路径查找。
2.1.5 可视化
import networkx as nx
import matplotlib.pyplot as plt
# 构建图
G = nx.Graph()
edges = [(1, 2), (1, 3), (2, 4), (3, 5)]
G.add_edges_from(edges)
# DFS 遍历
visited = []
def dfs_vis(graph, node):
if node not in visited:
visited.append(node)
for neighbor in list(graph.neighbors(node)):
dfs_vis(graph, neighbor)
dfs_vis(G, 1)
# 可视化
plt.figure(figs