数据结构与算法之数据结构 图查找 邻接表 / 邻接矩阵 效率

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


摘要:

图作为一种重要的数据结构,在计算机科学和实际应用中扮演着重要角色。图的查找算法是图论中的基本问题,其中邻接表和邻接矩阵是两种常见的图表示方法。本文将深入探讨这两种方法在图查找效率上的差异,并通过代码实现来验证分析结果。

一、

图是由节点(也称为顶点)和边组成的集合。在图论中,图的查找算法包括深度优先搜索(DFS)和广度优先搜索(BFS)等。图的表示方法主要有邻接表和邻接矩阵两种。本文将比较这两种方法在图查找效率上的差异。

二、邻接表与邻接矩阵

1. 邻接表

邻接表是一种链式存储结构,它由一个数组和一个链表组成。数组中的每个元素是一个链表的头节点,链表中的节点表示与该顶点相邻的顶点。

2. 邻接矩阵

邻接矩阵是一个二维数组,其中矩阵的行和列分别代表图中的顶点。如果顶点i和顶点j之间有边,则矩阵中的元素[i][j]为边的权重,否则为无穷大或0。

三、图查找算法

1. 深度优先搜索(DFS)

DFS是一种非确定性的图遍历算法,它从某个顶点开始,沿着一条路径走到底,然后回溯。

2. 广度优先搜索(BFS)

BFS是一种确定性的图遍历算法,它从某个顶点开始,沿着所有相邻的顶点进行遍历,直到所有顶点都被访问过。

四、代码实现

以下是用Python实现的DFS和BFS算法,分别使用邻接表和邻接矩阵两种图表示方法。

python

class Graph:


def __init__(self, vertices):


self.V = vertices


self.graph_list = [[] for _ in range(vertices)]


self.graph_matrix = [[0] vertices for _ in range(vertices)]

def add_edge_list(self, v, w):


self.graph_list[v].append(w)


self.graph_matrix[v][w] = 1

def add_edge_matrix(self, v, w):


self.graph_matrix[v][w] = 1

def DFS(self, v, visited):


visited[v] = True


print(v, end=' ')


for i in self.graph_list[v]:


if not visited[i]:


self.DFS(i, visited)

def BFS(self, s):


visited = [False] self.V


queue = []


visited[s] = True


queue.append(s)


while queue:


s = queue.pop(0)


print(s, end=' ')


for i in self.graph_list[s]:


if not visited[i]:


visited[i] = True


queue.append(i)

创建图实例


g = Graph(4)


g.add_edge_list(0, 1)


g.add_edge_list(0, 2)


g.add_edge_list(1, 2)


g.add_edge_list(2, 0)


g.add_edge_list(2, 3)


g.add_edge_list(3, 3)

使用邻接表进行DFS和BFS


print("DFS using adjacency list:")


g.DFS(0, [False] g.V)


print("BFS using adjacency list:")


g.BFS(0)

使用邻接矩阵进行DFS和BFS


g.add_edge_matrix(0, 1)


g.add_edge_matrix(0, 2)


g.add_edge_matrix(1, 2)


g.add_edge_matrix(2, 0)


g.add_edge_matrix(2, 3)


g.add_edge_matrix(3, 3)

print("DFS using adjacency matrix:")


g.DFS(0, [False] g.V)


print("BFS using adjacency matrix:")


g.BFS(0)


五、效率比较

1. 邻接表

邻接表在存储稀疏图时比邻接矩阵更节省空间。在DFS和BFS中,邻接表的时间复杂度均为O(V+E),其中V是顶点数,E是边数。

2. 邻接矩阵

邻接矩阵在存储稠密图时比邻接表更节省时间,因为可以直接通过索引访问相邻顶点。在DFS和BFS中,邻接矩阵的时间复杂度也为O(V+E)。

六、结论

本文通过代码实现和效率比较,分析了邻接表和邻接矩阵在图查找算法中的效率差异。在实际应用中,应根据图的稀疏程度和查找需求选择合适的图表示方法。

注意:本文代码仅为示例,实际应用中可能需要根据具体需求进行调整和优化。