目录
[1.1 图的基本概念](#1.1 图的基本概念)
[1.2 图的分类](#1.2 图的分类)
[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 图的基本结构相关概念](#1 图的基本结构相关概念)
[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),可使用以下两种策略之一:
-
对称存储 :每条边存储两次,分别是
(u → v)
和(v → u)
; -
约束存储顺序 :强制存储一次,并约定
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) | 顶点度数满足幂律分布 |