数据结构与算法之深度优先 图遍历 邻接表 / 邻接矩阵 实现指南

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


图遍历:深度优先搜索(DFS)实现指南

在数据结构与算法领域,图是一种非常重要的数据结构,它由节点(也称为顶点)和边组成,用于表示实体之间的关系。图遍历是图论中的一个基本问题,它指的是访问图中的所有节点。深度优先搜索(Depth-First Search,DFS)是图遍历的一种常用算法,它通过递归或栈的方式遍历图中的节点。本文将围绕深度优先搜索,详细介绍其在邻接表和邻接矩阵两种图表示方式下的实现方法。

深度优先搜索概述

深度优先搜索是一种非确定性图遍历算法,它从起始节点开始,沿着一条路径一直走到头,然后回溯,再寻找新的路径。DFS算法的基本思想是:在访问一个节点后,将其标记为已访问,然后访问它的所有未访问的邻接节点。这个过程会一直重复,直到所有节点都被访问过。

DFS算法有两种实现方式:递归和非递归。递归实现较为直观,但非递归实现可以避免递归带来的栈溢出问题。

邻接表实现深度优先搜索

邻接表是一种图的数据表示方法,它使用链表来存储图中的节点和边。在邻接表中,每个节点都有一个链表,链表中存储了与该节点相连的所有节点。

以下是一个使用邻接表实现DFS的Python代码示例:

python

class Graph:


def __init__(self):


self.graph = {}

def add_edge(self, u, v):


if u in self.graph:


self.graph[u].append(v)


else:


self.graph[u] = [v]

def dfs_recursive(self, start):


visited = set()

def dfs(node):


if node not in visited:


print(node, end=' ')


visited.add(node)


for neighbor in self.graph.get(node, []):


dfs(neighbor)

dfs(start)

创建图实例


g = Graph()


g.add_edge(0, 1)


g.add_edge(0, 2)


g.add_edge(1, 2)


g.add_edge(2, 0)


g.add_edge(2, 3)


g.add_edge(3, 3)

执行DFS


print("DFS (Recursive):")


g.dfs_recursive(0)


邻接矩阵实现深度优先搜索

邻接矩阵是一种图的数据表示方法,它使用二维数组来存储图中的节点和边。在邻接矩阵中,如果节点i和节点j之间存在边,则矩阵的第i行第j列的值为1,否则为0。

以下是一个使用邻接矩阵实现DFS的Python代码示例:

python

class Graph:


def __init__(self, vertices):


self.V = vertices


self.graph = [[0 for column in range(vertices)] for row in range(vertices)]

def add_edge(self, v, w):


self.graph[v][w] = 1

def dfs_recursive(self, start):


visited = [False] self.V

def dfs(node):


visited[node] = True


print(node, end=' ')


for i in range(self.V):


if self.graph[node][i] == 1 and not visited[i]:


dfs(i)

dfs(start)

创建图实例


g = Graph(4)


g.add_edge(0, 1)


g.add_edge(0, 2)


g.add_edge(1, 2)


g.add_edge(2, 0)


g.add_edge(2, 3)


g.add_edge(3, 3)

执行DFS


print("DFS (Recursive):")


g.dfs_recursive(0)


非递归实现深度优先搜索

非递归实现DFS通常使用栈来模拟递归过程。以下是一个使用栈实现DFS的Python代码示例:

python

class Graph:


def __init__(self, vertices):


self.V = vertices


self.graph = [[0 for column in range(vertices)] for row in range(vertices)]

def add_edge(self, v, w):


self.graph[v][w] = 1

def dfs_iterative(self, start):


stack = []


visited = [False] self.V

stack.append(start)


while stack:


node = stack.pop()


if not visited[node]:


print(node, end=' ')


visited[node] = True


for i in range(self.V - 1, -1, -1):


if self.graph[node][i] == 1 and not visited[i]:


stack.append(i)

创建图实例


g = Graph(4)


g.add_edge(0, 1)


g.add_edge(0, 2)


g.add_edge(1, 2)


g.add_edge(2, 0)


g.add_edge(2, 3)


g.add_edge(3, 3)

执行DFS


print("DFS (Iterative):")


g.dfs_iterative(0)


总结

本文详细介绍了深度优先搜索在邻接表和邻接矩阵两种图表示方式下的实现方法。DFS算法是图论中一个基本且重要的算法,它广泛应用于图的遍历、拓扑排序、最小生成树等领域。通过本文的学习,读者可以更好地理解DFS算法的原理和实现方法,为后续学习图论相关算法打下坚实的基础。