图论(1):图数据结构

目录

一、图的定义

[1.1 图的基本概念](#1.1 图的基本概念)

[1.2 图的分类](#1.2 图的分类)

(1)按边的方向:

(2)按边的权值:

(3)按边的数量和类型:

(4)按连通性:

[1.3 图的基本术语](#1.3 图的基本术语)

二、图的表示方法

[2.1 邻接矩阵(Adjacency Matrix)](#2.1 邻接矩阵(Adjacency Matrix))

[2.2 邻接表(Adjacency List)](#2.2 邻接表(Adjacency List))

[2.3 边列表(Edge List)](#2.3 边列表(Edge List))

[2.4 关联矩阵(Incidence Matrix)](#2.4 关联矩阵(Incidence Matrix))

三、图的关系建模

[3.1 建模基本思路](#3.1 建模基本思路)

[3.2 表结构设计](#3.2 表结构设计)

(1)顶点表设计

(2)边表设计(适用于有向图)

(3)标签元数据表设计

(4)无向图处理方法

[1 图的基本结构相关概念](#1 图的基本结构相关概念)

2图的类型和性质

[3 图的遍历与算法相关概念](#3 图的遍历与算法相关概念)

[4 图的矩阵表示与运算](#4 图的矩阵表示与运算)

[5 高阶图模型与扩展概念](#5 高阶图模型与扩展概念)


图论(Graph Theory)是计算机科学中研究"对象之间关系"的重要分支,它以"图"作为基本结构来建模现实世界中各种"点"和"连接"。本篇文章将系统介绍图的基础概念------图的定义图的表示方法,帮助读者构建图论学习的核心框架。

一、图的定义

1.1 图的基本概念

一个图(Graph) 是由一组顶点(Vertices) 和一组**边(Edges)**构成的集合结构。用数学符号表示为:

G = (V, E)

其中:

  • V 是图中顶点的集合,通常记作 V = \{v_1, v_2, \ldots, v_n\};

  • E 是图中边的集合,每条边连接两个顶点。

边可以是无向的,也可以是有向的。

1.2 图的分类

图根据其结构特性可以细分为多种类型:

(1)按边的方向:
  • 无向图(Undirected Graph):边不具备方向性,(u, v) 与 (v, u) 等价;

  • 有向图(Directed Graph):边具有方向性,(u, v) 表示从 u 指向 v。

(2)按边的权值:
  • 非加权图(Unweighted Graph):所有边等价;

  • 加权图(Weighted Graph):每条边都有一个权值(如距离、代价等),表示边的"强度"或"成本"。

(3)按边的数量和类型:
  • 简单图(Simple Graph):不含重边和自环;

  • 多重图(Multigraph):允许两个顶点之间存在多条边(重边);

  • 伪图(Pseudograph):允许自环和重边。

(4)按连通性:
  • 连通图(Connected Graph):无向图中任意两个顶点之间至少存在一条路径;

  • 强连通图(Strongly Connected Graph):有向图中任意两点之间都可互达;

  • 弱连通图(Weakly Connected Graph):有向图在忽略方向后是连通的。

1.3 图的基本术语

  • 顶点(Vertex):图中的基本单位;

  • 边(Edge):连接两个顶点的线段,表示关系;

  • 度(Degree)

    • 无向图中:一个顶点的度是连接该顶点的边数;

    • 有向图中:包括入度(In-degree)**和**出度(Out-degree)

  • 路径(Path):由一系列连续边组成的顶点序列;

  • 简单路径(Simple Path):路径中顶点不重复;

  • 环(Cycle):起点和终点相同的简单路径;

  • 自环(Loop):起点和终点为同一顶点的边;

  • 重边(Multiple Edge):连接同一对顶点的多条边;

  • 稀疏图与稠密图

    • 稀疏图:边的数量远小于顶点对的数量;

    • 稠密图:边的数量接近最大边数(例如 n(n-1)/2)。

二、图的表示方法

在计算机中使用图时,必须选择合适的数据结构对其进行编码。常见的图表示方式包括:

2.1 邻接矩阵(Adjacency Matrix)

邻接矩阵是一种二维数组 A[n][n],用来表示顶点之间是否相连。

  • 若 i 与 j 之间有边,则 A[i][j] = 1(或等于权重);

  • 否则 A[i][j] = 0;

  • 无向图的邻接矩阵是对称的;

  • 有向图不一定对称。

示例:

设图 G 有 3 个顶点,边为 (0, 1), (1, 2),邻接矩阵为:

复制代码
  0 1 2
0 0 1 0
1 1 0 1
2 0 1 0

优点:

  • 查询任意两点是否连接只需 O(1) 时间;

  • 结构简单,适用于稠密图。

缺点:

  • 空间复杂度为 O(n^2),不适用于稀疏图。

2.2 邻接表(Adjacency List)

邻接表用一个数组加多个链表来表示图:

  • 每个顶点拥有一个链表,链表中记录与该顶点相邻的顶点;

  • 对于无向图,每条边需在两个顶点的链表中都出现;

  • 对于有向图,只记录出边。

示例:

复制代码
0: 1  
1: 0 → 2  
2: 1

优点:

  • 空间复杂度为 O(n + m),适合稀疏图;

  • 遍历某一顶点的邻接点效率高。

缺点:

  • 查询两点之间是否有边需遍历链表,最坏为 O(n)。

2.3 边列表(Edge List)

边列表使用一个列表来记录图中所有边:

  • 每条边表示为一个二元组 (u, v) 或三元组 (u, v, w)(带权);

  • 通常用于图算法中。

示例:

复制代码
[(0, 1), (1, 2)]

优点:

  • 简单直接,节省空间;

  • 适合用于边排序、生成树等算法。

缺点:

  • 查询效率低,不利于邻接点快速访问。

2.4 关联矩阵(Incidence Matrix)

关联矩阵是一个 n \times m 的矩阵(n 是顶点数,m 是边数):

  • 无向图中,若边 e_j 与顶点 v_i 相连,则 M[i][j] = 1;

  • 有向图中,若 v_i 是起点则 M[i][j] = 1,若 v_i 是终点则 M[i][j] = -1。

优点:

  • 可用于代数图理论分析;

  • 明确表示顶点与边的连接关系。

缺点:

  • 在实际编程中使用不多,空间浪费较大。

表示方法对比:

表示方法 空间复杂度 查询边是否存在 枚举邻接点 适用场景
邻接矩阵 O(n^2) O(1) O(n) 稠密图
邻接表 O(n + m) 最坏 O(n) O(k) 稀疏图
边列表 O(m) O(m) 不适用 构建/排序
关联矩阵 O(n \times m) O(m) 不适用 理论研究

三、图的关系建模

虽然图结构在本质上是非关系型的,但在没有图数据库(如 Neo4j、JanusGraph)可用的场景下,我们仍可以通过**关系型数据库(RDBMS)**来表达图的数据结构与连接关系。

3.1 建模基本思路

图在 RDBMS 中建模的核心思想是将顶点和边分别表示为关系表(Relation)

  • 顶点表(Vertex Table):存储图中的所有节点;

  • 边表(Edge Table):存储图中所有的边(连接关系)。

3.2 表结构设计

(1)顶点表设计
复制代码
CREATE TABLE vertex (
    id INT PRIMARY KEY,         -- 顶点唯一标识
    label_id INT NOT NULL,      -- 顶点类型
    properties JSON,            -- 顶点属性
    FOREIGN KEY (label_id) REFERENCES label(id)
);

properties 字段可以灵活地以 JSON 形式存储各类属性,适合属性异构的图场景。如果属性固定,也可将其展开为单独的列。

(2)边表设计(适用于有向图)
复制代码
CREATE TABLE edge (
    id INT PRIMARY KEY,              -- 边的唯一标识
    from_vertex INT NOT NULL,        -- 起点
    to_vertex INT NOT NULL,          -- 终点
    label_id INT NOT NULL,           -- 边的类型
    weight DECIMAL(10,2),            -- 权重
    properties JSON,                 -- 边的属性
    FOREIGN KEY (from_vertex) REFERENCES vertex(id),
    FOREIGN KEY (to_vertex) REFERENCES vertex(id),
    FOREIGN KEY (label_id) REFERENCES label(id)
);
  • 该结构适用于有向图(Directed Graph)

  • 支持为每条边添加类型、权重或其他灵活的属性;

  • 使用外键约束维护边和顶点之间的完整性。

(3)标签元数据表设计
复制代码
CREATE TABLE label (
    id INT PRIMARY KEY,            -- 标签唯一标识
    label VARCHAR(100),            -- 标签名称
    category INT NOT NULL          -- 标签分类:标识顶点标签还是边标签(例如:1=顶点,2=边)
);
(4)无向图处理方法

对于无向图(Undirected Graph),可使用以下两种策略之一:

  1. 对称存储 :每条边存储两次,分别是 (u → v)(v → u)

  2. 约束存储顺序 :强制存储一次,并约定 from_vertex < to_vertex,查询时统一处理对称性。


1 图的基本结构相关概念

概念 简要说明
顶点(Vertex) 图中的节点,代表事物
边(Edge) 顶点之间的连接,代表关系
度(Degree) 顶点的连接数目(有向图分入度、出度)
权值(weight cost) 顶点或边的附加属性
自环(Loop) 一条连接自身的边,如 (v, v)
重边(Multiple Edge) 多条连接同一对顶点的边
邻接(Adjacency) 两顶点之间有边连接称为邻接
路径(Path) 一组连接顶点的边序列
简单路径 路径中无重复顶点
环(Cycle) 起点和终点相同的简单路径
简单图(Simple Graph) 无自环、无重边的图
多重图(Multigraph) 允许重边和/或自环
子图(Subgraph) 图的顶点和边的子集组成的图
完全图(Complete Graph) 任意两顶点之间都存在一条边
稀疏图/稠密图 边的数量相对少/多
平面图(Planar Graph) 可以画在平面上不相交的图
伪图(Pseudograph) 允许重边和自环的图

2图的类型和性质

概念 简要说明
有向图(Directed Graph) 边有方向,表示从 u → v
无向图(Undirected Graph) 边无方向,(u, v) 与 (v, u) 等价
加权图(Weighted Graph) 边带有权值,代表代价、距离等
非加权图 边权相同或无权
连通图(Connected Graph) 任意两顶点之间都有路径(无向图)
强连通图(Strongly Connected) 有向图中任意两顶点可达
弱连通图 有向图忽略方向后连通
二分图(Bipartite Graph) 顶点集可分为两部分,边仅连接不同集合
森林(Forest) 不含环的无向图
树(Tree) 连通的无环无向图
DAG(有向无环图) 没有有向环的有向图(常用于任务调度)
欧拉图(Eulerian Graph) 存在一条路径遍历每条边恰好一次
哈密顿图(Hamiltonian Graph) 存在一条路径遍历每个顶点恰好一次

3 图的遍历与算法相关概念

概念 简要说明
深度优先遍历(DFS) 类似树的先序遍历
广度优先遍历(BFS) 层次搜索方式
拓扑排序(Topological Sort) DAG 的顶点线性排序
连通分量(Connected Component) 最大的连通子图
割点(Articulation Point) 删除该点会使图不连通
桥(Bridge) 删除这条边会使图不连通
图染色(Graph Coloring) 给图的顶点上色,使相邻点颜色不同
最小生成树(Minimum Spanning Tree) 覆盖所有顶点、权值最小的树
最短路径(Shortest Path) 顶点之间路径权值最小
网络流(Network Flow) 求最大流/最小割等问题
匹配(Matching) 二分图中点之间的配对关系
图同构(Graph Isomorphism) 判断两个图是否结构一致
图压缩(Graph Compression) 将多个顶点合并成一个顶点

4 图的矩阵表示与运算

概念 简要说明
邻接矩阵(Adjacency Matrix) 顶点对之间的连接关系
邻接表(Adjacency List) 每个顶点的邻接顶点列表
关联矩阵(Incidence Matrix) 顶点和边的对应关系
距离矩阵(Distance Matrix) 所有顶点对之间的最短路径长度
拉普拉斯矩阵(Laplacian Matrix) 用于谱图理论分析
权重矩阵(Weight Matrix) 记录边权重
幂矩阵(A^k) 表示顶点之间的 k 步路径数量

5 高阶图模型与扩展概念

概念 简要说明
超图(Hypergraph) 一条边可以连接多个顶点
动态图(Dynamic Graph) 图结构随时间变化
随机场(Random Graph) 边的生成遵循概率模型(如 Erdős--Rényi)
社区结构(Community) 图中顶点聚类成的子结构
小世界图(Small-world) 局部聚集 + 全局稀疏的图模型
无标度图(Scale-free) 顶点度数满足幂律分布
相关推荐
Vesan,22 分钟前
无人机开发分享——基于行为树的无人机集群机载自主决策算法框架搭建及开发
c++·算法·决策树·无人机
爱coding的橙子1 小时前
每日算法刷题Day58:8.7:leetcode 单调栈5道题,用时2h
算法·leetcode·职场和发展
董莉影1 小时前
学习嵌入式第二十二天
数据结构·学习·算法·链表
Lukeding2 小时前
Magnetic-UI源码解析
算法
chirrupy_hamal2 小时前
排序算法详解
算法
落羽的落羽2 小时前
【C++】哈希表原理与实现详解
数据结构·c++
csdn_aspnet2 小时前
四边形面积
算法·四边形
爱coding的橙子2 小时前
每日算法刷题Day57:8.6:leetcode 单调栈6道题,用时2h
算法·leetcode·职场和发展
皮蛋瘦肉粥_1213 小时前
代码随想录day57图论7
图论·最小生成树