数据结构与算法之数据结构 图存储 稀疏图 / 稠密图 选择

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


摘要:

图数据结构是计算机科学中用于表示实体及其之间关系的一种重要数据结构。根据图中边与顶点数量的比例,图可以分为稀疏图和稠密图。本文将探讨稀疏图和稠密图的存储策略,分析各自的优缺点,并给出相应的代码实现。

一、

图是一种由顶点(节点)和边(连接顶点的线段)组成的数据结构。在现实世界中,图广泛应用于社交网络、交通网络、通信网络等领域。根据图中边与顶点数量的比例,图可以分为稀疏图和稠密图。本文将分别介绍稀疏图和稠密图的存储策略,并给出相应的代码实现。

二、稀疏图存储策略

稀疏图是指边与顶点数量比例较小的图。在稀疏图中,边的数量相对较少,因此存储稀疏图时,可以采用以下几种策略:

1. 邻接表

邻接表是一种常用的稀疏图存储方式,它使用一个数组来存储所有顶点,每个顶点对应一个链表,链表中存储与该顶点相连的所有顶点。

python

class SparseGraph:


def __init__(self, vertices):


self.vertices = vertices


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

def add_edge(self, u, v):


self.adj_list[u].append(v)


self.adj_list[v].append(u)

def display(self):


for i in range(self.vertices):


print(f"Vertex {i}: {self.adj_list[i]}")


2. 邻接矩阵

虽然邻接矩阵在稀疏图中会浪费大量空间,但在某些情况下,如需要频繁进行顶点对之间的距离查询时,邻接矩阵仍然是一种可行的存储方式。

python

class SparseGraph:


def __init__(self, vertices):


self.vertices = vertices


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

def add_edge(self, u, v):


self.adj_matrix[u][v] = 1


self.adj_matrix[v][u] = 1

def display(self):


for i in range(self.vertices):


print(f"Vertex {i}: {self.adj_matrix[i]}")


3. 哈希表

哈希表可以用于存储稀疏图中的边,其中键为顶点对,值为边的权重。

python

class SparseGraph:


def __init__(self, vertices):


self.vertices = vertices


self.adj_hash = {}

def add_edge(self, u, v, weight=1):


if u not in self.adj_hash:


self.adj_hash[u] = []


self.adj_hash[u].append((v, weight))

if v not in self.adj_hash:


self.adj_hash[v] = []


self.adj_hash[v].append((u, weight))

def display(self):


for u in self.adj_hash:


print(f"Vertex {u}: {self.adj_hash[u]}")


三、稠密图存储策略

稠密图是指边与顶点数量比例较大的图。在稠密图中,边的数量相对较多,因此存储稠密图时,可以采用以下几种策略:

1. 邻接矩阵

邻接矩阵是一种常用的稠密图存储方式,它使用一个二维数组来存储所有顶点之间的边,其中值为边的权重。

python

class DenseGraph:


def __init__(self, vertices):


self.vertices = vertices


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

def add_edge(self, u, v, weight=1):


self.adj_matrix[u][v] = weight


self.adj_matrix[v][u] = weight

def display(self):


for i in range(self.vertices):


print(f"Vertex {i}: {self.adj_matrix[i]}")


2. 邻接表

虽然邻接表在稠密图中不如邻接矩阵高效,但在某些情况下,如需要频繁进行顶点对之间的距离查询时,邻接表仍然是一种可行的存储方式。

python

class DenseGraph:


def __init__(self, vertices):


self.vertices = vertices


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

def add_edge(self, u, v, weight=1):


self.adj_list[u].append((v, weight))


self.adj_list[v].append((u, weight))

def display(self):


for i in range(self.vertices):


print(f"Vertex {i}: {self.adj_list[i]}")


四、总结

本文介绍了稀疏图和稠密图的存储策略,分析了各自的优缺点,并给出了相应的代码实现。在实际应用中,应根据具体需求和场景选择合适的存储策略,以达到最佳的性能表现。