数据结构与算法之数据结构 图遍历 DFS/BFS/ 迭代器

数据结构与算法阿木 发布于 2025-07-11 6 次阅读


摘要:

图是数据结构中的一种,用于表示对象之间的复杂关系。图遍历是图论中的一个基本问题,它指的是访问图中所有顶点的过程。本文将详细介绍图遍历的两种经典算法:深度优先搜索(DFS)和广度优先搜索(BFS),并探讨迭代器在图遍历中的应用。

一、

图遍历是图论中的一个重要问题,它广泛应用于网络爬虫、社交网络分析、路径规划等领域。在图遍历中,深度优先搜索(DFS)和广度优先搜索(BFS)是最常用的两种算法。本文将分别介绍这两种算法的实现,并探讨迭代器在图遍历中的应用。

二、图的表示

在介绍图遍历算法之前,首先需要了解图的表示方法。常见的图表示方法有邻接矩阵和邻接表。

1. 邻接矩阵

邻接矩阵是一种用二维数组表示的图,其中矩阵的行和列分别代表图的顶点,矩阵中的元素表示顶点之间的连接关系。如果顶点i和顶点j之间存在边,则矩阵[i][j]的值为1,否则为0。

2. 邻接表

邻接表是一种用链表表示的图,每个顶点对应一个链表,链表中的节点表示与该顶点相连的其他顶点。

三、深度优先搜索(DFS)

深度优先搜索是一种非破坏性的遍历算法,它从某个顶点开始,沿着一条路径一直走到尽头,然后再回溯到上一个顶点,继续沿着另一条路径进行遍历。

1. 邻接矩阵表示下的DFS实现

python

def dfs_adj_matrix(graph, start):


visited = [False] len(graph)


stack = [start]

while stack:


vertex = stack.pop()


if not visited[vertex]:


visited[vertex] = True


print(vertex, end=' ')


for i in range(len(graph)):


if graph[vertex][i] == 1 and not visited[i]:


stack.append(i)

示例


graph = [


[0, 1, 0, 0, 0],


[1, 0, 1, 1, 0],


[0, 1, 0, 0, 0],


[0, 1, 0, 0, 1],


[0, 0, 0, 1, 0]


]


dfs_adj_matrix(graph, 0)


2. 邻接表表示下的DFS实现

python

def dfs_adj_list(graph, start):


visited = [False] len(graph)


stack = [start]

while stack:


vertex = stack.pop()


if not visited[vertex]:


visited[vertex] = True


print(vertex, end=' ')


for neighbor in graph[vertex]:


if not visited[neighbor]:


stack.append(neighbor)

示例


graph = {


0: [1, 2],


1: [0, 2, 3],


2: [0, 1, 4],


3: [1, 4],


4: [2, 3]


}


dfs_adj_list(graph, 0)


四、广度优先搜索(BFS)

广度优先搜索是一种破坏性的遍历算法,它从某个顶点开始,沿着所有相邻的顶点进行遍历,直到所有顶点都被访问过。

1. 邻接矩阵表示下的BFS实现

python

from collections import deque

def bfs_adj_matrix(graph, start):


visited = [False] len(graph)


queue = deque([start])

while queue:


vertex = queue.popleft()


if not visited[vertex]:


visited[vertex] = True


print(vertex, end=' ')


for i in range(len(graph)):


if graph[vertex][i] == 1 and not visited[i]:


queue.append(i)

示例


bfs_adj_matrix(graph, 0)


2. 邻接表表示下的BFS实现

python

def bfs_adj_list(graph, start):


visited = [False] len(graph)


queue = deque([start])

while queue:


vertex = queue.popleft()


if not visited[vertex]:


visited[vertex] = True


print(vertex, end=' ')


for neighbor in graph[vertex]:


if not visited[neighbor]:


queue.append(neighbor)

示例


bfs_adj_list(graph, 0)


五、迭代器在图遍历中的应用

迭代器是一种可以遍历集合对象的对象,它允许程序员以统一的方式遍历各种数据结构。在图遍历中,可以使用迭代器来简化遍历过程。

1. 邻接矩阵表示下的迭代器实现

python

def iter_adj_matrix(graph, start):


visited = [False] len(graph)


stack = [start]

while stack:


vertex = stack.pop()


if not visited[vertex]:


visited[vertex] = True


yield vertex


for i in range(len(graph)):


if graph[vertex][i] == 1 and not visited[i]:


stack.append(i)

示例


for vertex in iter_adj_matrix(graph, 0):


print(vertex, end=' ')


2. 邻接表表示下的迭代器实现

python

def iter_adj_list(graph, start):


visited = [False] len(graph)


stack = [start]

while stack:


vertex = stack.pop()


if not visited[vertex]:


visited[vertex] = True


yield vertex


for neighbor in graph[vertex]:


if not visited[neighbor]:


stack.append(neighbor)

示例


for vertex in iter_adj_list(graph, 0):


print(vertex, end=' ')


六、总结

本文介绍了图遍历的两种经典算法:深度优先搜索(DFS)和广度优先搜索(BFS),并探讨了迭代器在图遍历中的应用。通过邻接矩阵和邻接表两种图表示方法,展示了DFS和BFS的实现过程。通过迭代器简化了图遍历的代码,提高了代码的可读性和可维护性。

在实际应用中,根据具体问题选择合适的图遍历算法和图表示方法,可以有效地解决各种图相关的问题。希望本文对您在图遍历方面的学习和实践有所帮助。