图论(1):图数据结构

目录

一、图的定义

1.1 图的基本概念

1.2 图的分类

(1)按边的方向:

(2)按边的权值:

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

(4)按连通性:

1.3 图的基本术语

二、图的表示方法

2.1 邻接矩阵(Adjacency Matrix)

2.2 邻接表(Adjacency List)

2.3 边列表(Edge List)

2.4 关联矩阵(Incidence Matrix)

三、图的关系建模

3.1 建模基本思路

3.2 表结构设计

(1)顶点表设计

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

(3)标签元数据表设计

(4)无向图处理方法

1 图的基本结构相关概念

2图的类型和性质

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

4 图的矩阵表示与运算

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)顶点度数满足幂律分布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92252.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

等保测评-Nginx中间件

Nginx *排查有无Nginx中间件&#xff0c;可使用以下命令&#xff1a; ps -ef | grep nginx、netstat -nutlp *确认Nginx中间件有运行&#xff0c;查看其目录&#xff1a; find / -name nginx.conf、ps -ef | grep Nginx *确认好目录后&#xff0c;查看版本&#xff1a; …

Milvus向量数据库版本升级

创建时间&#xff1a;2025-3-11 更新时间&#xff1a;2025-8-8 作者&#xff1a;薄刀刀、散装DBA 联系方式&#xff1a;bulkdba&#xff0c;1511777 背景&#xff1a;当前版本无法使用分组搜索功能&#xff0c;通过升级版本解决&#xff0c;计划将milvus升级到2.4.15&#xf…

若依前后端分离版学习笔记(六)——JWT

在上一节已经提到了传统Session认证和JWT认证内容&#xff0c;这一节对JWT进行更加详细的了解。 一 JWT介绍 1、传统的session认证 1.1 传统session认证流程 1.用户向服务器发送用户名和密码 2.服务器通过验证后&#xff0c;在当前对话&#xff08;session&#xff09;中保存相…

如何永久删除三星手机中的照片?

如果你计划出售你的三星 Galaxy 手机&#xff0c;或者整理其接近满容量的存储空间&#xff0c;你可能会担心如何从设备中移除照片和其他文件。这对于确保你的个人信息保持安全至关重要&#xff0c;即使你选择通过各种平台捐赠或出售旧手机也是如此。在本文中&#xff0c;我们介…

【数字图像处理系列笔记】Ch06:图像压缩

一、基础知识信源编码器&#xff1a;减少或消除输入图像中的编码冗余、像素 间冗余以及心理视觉冗余。 数据的冗余 一、空间冗余&#xff08;Spatial Redundancy&#xff09;1. 定义图像中相邻像素间的强相关性导致的冗余 —— 同一区域内相邻像素的像素值&#xff08;如灰度、…

windows线程基础

Windows线程机制详解 线程的基本概念 在Windows操作系统中&#xff0c;线程是程序执行的最小单位。每个进程至少包含一个线程&#xff08;主线程&#xff09;&#xff0c;但可以创建多个线程来并行执行任务。线程与进程的主要区别在于&#xff1a; 资源分配&#xff1a;进程拥有…

Numpy科学计算与数据分析:Numpy随机数生成入门

Numpy随机数生成实战 学习目标 通过本课程&#xff0c;学员将掌握如何使用Numpy库生成不同类型的随机数&#xff0c;包括随机整数、随机浮点数以及从特定分布中抽样的方法。本课程将通过理论讲解与实践操作相结合的方式&#xff0c;帮助学员深入理解Numpy在随机数生成方面的强…

使用 C# 通过 .NET 框架开发应用程序的安装与环境配置

文章目录1. .NET介绍2. IDE2.1 Rider 安装2.2 Visual Studio 安装3. SDK安装与环境配置3.1 单独下载安装 .NET SDK3.2 Visual Studio 工作负荷安装SDK4. 相关问题4.1 我以前使用 Unity 写 C# 脚本不需要额外的编译器&#xff0c;为什么现在需要&#xff1f;1. .NET介绍 .NET 是…

Scikit-learn - 机器学习库初步了解

目录1. 主要算法分类1.1 监督学习 (Supervised Learning)1.2 非监督学习 (Unsupervised Learning)1.3 半监督学习 (Semi-Supervised Learning)1.4 强化学习 (Reinforcement Learning)1.5 遗传算法 (Genetic Algorithm)2. 选择合适的机器学习模型2.1 分类 (Classification)2.2 回…

关于 idea 里 properties 文件的中文乱码问题

背景 你会发现 properties 文件里的中文可能会出现乱码。 这个因为 properties 规范是使用 iso-8859-1 存储的&#xff0c;不支持中文&#xff08;也不支持西欧里法语、德语里奇怪的字母&#xff09; properties 的标准制定于很早&#xff0c;所以没考虑这么多&#xff0c;prop…

BVH文件 解析 解读的python第三方类库 推荐

我们面临多个第三方库选项用于解析BVH文件&#xff0c;根据您的列表&#xff0c;我将分析几个关键库的特点&#xff0c;并推荐最适合当前任务的库。我们将基于以下标准进行选择&#xff1a; ​​功能性​​&#xff1a;是否能准确解析关节角度数据&#xff0c;支持关键帧操作 ​…

uni-app X能成为下一个Flutter吗?

哈喽&#xff0c;我是老刘 老刘使用Flutter作为客户端主要技术栈的这六七年的时间里&#xff0c;关于跨平台开发的争议和新技术始终没有停过。 “一套代码&#xff0c;多端运行”——这个让无数开发者心动的承诺&#xff0c;究竟是技术革命还是美丽的谎言&#xff1f; 想象一…

Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合

一、为什么需要下一代网关&#xff1f; 传统网关的三大瓶颈&#xff1a; #mermaid-svg-Kdei9Io6KntYGQc4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Kdei9Io6KntYGQc4 .error-icon{fill:#552222;}#mermaid-svg-…

MongoDB数据存储界的瑞士军刀:cpolar内网穿透实验室第513号挑战

软件名称&#xff1a;MongoDB 操作系统支持&#xff1a;Linux、Windows、macOS&#xff08;Docker版全平台通用&#xff01;&#xff09; 软件介绍&#xff1a; MongoDB是一个基于分布式架构的NoSQL数据库&#xff0c;擅长处理复杂数据类型&#xff08;如嵌套对象、数组&…

SPI TFT全彩屏幕驱动开发及调试

简介SPI&#xff08;Serial Peripheral Interface&#xff09;是一种广泛使用的串行通信协议&#xff0c;常用于微控制器&#xff08;MCU&#xff09;与外围设备&#xff08;如传感器、显示屏、存储器等&#xff09;之间的通信。SPI具有全双工传输、主从结构和较高的传输速率&a…

Linux学习—数据结构(链表2)

1.单向链表6.链表的查找在链表中找到指定的第一个元素沿用遍历思想&#xff0c;每次访问一个节点元素判断是否为要找的节点符合条件返回该节点地址到最后没有找到符号条件的节NULLlinknode *find_linklist(linknode *phead, datatype tmpdata) {linknode *ptmpnode NULL;ptmpn…

MySQL 备份利器 Xtrabackup 全解析:从部署到恢复的实战指南

数据库备份恢复是 DBA 的 “保命” 技能&#xff0c;生产业务不仅要保证有合适的备份策略&#xff0c;也要定期验证备份的有效性和恢复演练流程&#xff0c;因为数据恢复和验证可能会涉及多方合作&#xff0c;演练可以让灾难真正发生时&#xff0c;多方配合有条不紊的将数据恢复…

EAGLE-2:通过动态草稿树加速语言模型推理

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" EAGLE-2&#xff1a;通过动态草稿树加速语言模型推理 摘要 现代 Large Language Models&#xff08;LLMs&#xff09;的推理过程既昂贵又耗时&#xff0c;而 speculative sampling 已被证明是一种有效的解决方案…

防水防尘防摔性能很好的智能三防手机,还有22000mAh大电池

在电力巡检的崇山峻岭间&#xff0c;在野外地质勘探的风沙深处&#xff0c;在应急救援的急风骤雨里&#xff0c;传统智能设备因其固有的脆弱性与续航短板往往力不从心&#xff0c;甚至成为保障工作连续性的掣肘。而真正的智能三防手机应是一堵移动的堡垒&#xff0c;集坚不可摧…

Charles中文版抓包工具使用指南 提高API调试和网络优化效率

在现代开发过程中&#xff0c;调试API、捕获HTTP/HTTPS流量和优化应用的网络性能已经成为开发者的常见任务。尤其是在调试复杂的API接口和分析网络请求时&#xff0c;开发者需要一款高效且功能强大的工具。Charles抓包工具凭借其强大的网络调试功能和易用的操作界面&#xff0c…