数据结构与算法之数据结构 图遍历 DFS/BFS 算法实现

数据结构与算法阿木 发布于 5 天前 1 次阅读


摘要:

图作为一种重要的数据结构,在计算机科学和实际应用中扮演着重要角色。图遍历是图论中的一个基本问题,它指的是访问图中所有顶点的过程。本文将深入解析两种常见的图遍历算法:深度优先搜索(DFS)和广度优先搜索(BFS),并分别给出它们的Python实现。通过对比分析,读者可以更好地理解这两种算法的原理和适用场景。

一、

图是由顶点(节点)和边组成的集合,它描述了顶点之间的连接关系。图遍历是图论中的一个基本问题,它指的是按照一定的顺序访问图中的所有顶点。在图遍历过程中,每个顶点可能处于以下三种状态之一:未访问、正在访问、已访问。深度优先搜索(DFS)和广度优先搜索(BFS)是两种常见的图遍历算法,它们在算法设计和实际应用中有着广泛的应用。

二、深度优先搜索(DFS)

深度优先搜索是一种非确定性算法,它从图的某个顶点开始,沿着一条路径一直走到尽头,然后回溯到上一个顶点,再选择另一条路径继续搜索。DFS算法的基本思想是:从起始顶点出发,访问该顶点,并将其标记为已访问,然后递归地访问它的所有未访问的邻接顶点。

1. DFS算法的基本步骤:

(1)初始化一个访问标记数组,用于记录顶点的访问状态;

(2)从起始顶点开始,访问该顶点,并将其标记为已访问;

(3)递归地访问该顶点的所有未访问的邻接顶点;

(4)重复步骤(2)和(3),直到所有顶点都被访问过。

2. DFS算法的Python实现:

python

def dfs(graph, start_vertex):


visited = [False] len(graph)


stack = [start_vertex]

while stack:


vertex = stack.pop()


if not visited[vertex]:


print(vertex)


visited[vertex] = True


for neighbor in graph[vertex]:


if not visited[neighbor]:


stack.append(neighbor)

示例图


graph = {


0: [1, 2],


1: [2],


2: [0, 3],


3: [3]


}

dfs(graph, 0)


三、广度优先搜索(BFS)

广度优先搜索是一种确定性算法,它从图的某个顶点开始,按照顶点的邻接顺序访问顶点。BFS算法的基本思想是:从起始顶点出发,访问该顶点,并将其标记为已访问,然后将其所有未访问的邻接顶点加入队列,接着依次访问队列中的顶点。

1. BFS算法的基本步骤:

(1)初始化一个访问标记数组,用于记录顶点的访问状态;

(2)从起始顶点开始,访问该顶点,并将其标记为已访问;

(3)将起始顶点的所有未访问的邻接顶点加入队列;

(4)依次从队列中取出顶点,访问该顶点,并将其所有未访问的邻接顶点加入队列;

(5)重复步骤(4),直到队列为空。

2. BFS算法的Python实现:

python

from collections import deque

def bfs(graph, start_vertex):


visited = [False] len(graph)


queue = deque([start_vertex])

while queue:


vertex = queue.popleft()


if not visited[vertex]:


print(vertex)


visited[vertex] = True


for neighbor in graph[vertex]:


if not visited[neighbor]:


queue.append(neighbor)

示例图


graph = {


0: [1, 2],


1: [2],


2: [0, 3],


3: [3]


}

bfs(graph, 0)


四、DFS与BFS的对比分析

1. 时间复杂度:DFS和BFS的时间复杂度均为O(V+E),其中V为顶点数,E为边数。

2. 空间复杂度:DFS的空间复杂度为O(V),因为它需要存储访问标记数组和递归调用栈;BFS的空间复杂度也为O(V),因为它需要存储访问标记数组和队列。

3. 遍历顺序:DFS按照深度优先的顺序遍历顶点,而BFS按照广度优先的顺序遍历顶点。

4. 适用场景:DFS适用于需要遍历所有顶点的场景,如拓扑排序、最小生成树等;BFS适用于需要按照层次遍历顶点的场景,如最短路径搜索等。

五、总结

本文深入解析了两种常见的图遍历算法:DFS和BFS,并分别给出了它们的Python实现。通过对比分析,读者可以更好地理解这两种算法的原理和适用场景。在实际应用中,根据具体问题选择合适的图遍历算法,可以提高算法的效率和准确性。