数据结构-图结构

一、图的定义与本质

• 由 顶点(Vertex) 和 边(Edge) 组成的非线性结构(记为 G = (V, E),V 是顶点集,E 是边集)

• 核心特点:顶点间可多对多连接,无层级/顺序限制,是树结构的泛化(树是无环连通图)

二、图的分类

• 按边的方向:

◦ 无向图:边无方向(如 (u, v) = (v, u),例:社交网络好友关系)

◦ 有向图(Digraph):边有方向(如 <u, v> 表示从 u 到 v,例:交通单向路)

• 按边的权重:

◦ 无权图:边仅表示连接关系,无数值属性

◦ 带权图(网):边附带权重(如距离、成本,例:地图路线规划)

• 按顶点连接程度:

◦ 连通图(无向):任意两顶点间存在路径;非连通图:存在孤立顶点子集

◦ 强连通图(有向):任意两顶点间双向存在路径;弱连通图:忽略方向后连通

• 其他特殊图:

◦ 完全图:无向图中任意两顶点间都有边(n 个顶点有 n(n-1)/2 条边)

◦ 稀疏图:边数远少于完全图;稠密图:边数接近完全图

◦ 有环图/无环图(DAG:有向无环图,如任务调度依赖图)

三、核心概念

• 顶点的度:

◦ 无向图:与顶点相连的边数(记为 deg(v))

◦ 有向图:入度(指向顶点的边数,in-deg(v))+ 出度(从顶点出发的边数,out-deg(v))

• 路径:顶点序列 v0→v1→...→vk,相邻顶点间存在边;路径长度:边的数量

• 回路(环):起点=终点且长度≥1的路径;简单路径:顶点不重复的路径

• 子图:顶点集和边集均为原图子集的图;生成子图:包含原图所有顶点的子图

• 连通分量(无向图):最大连通子图;强连通分量(有向图):最大强连通子图

四、图的存储方式

• 邻接矩阵(Adjacency Matrix):

◦ 原理:用 n×n 二维数组存储,matrix[i][j] 表示顶点 i 与 j 的关系(0/1 无权,权重值 带权)

◦ 优点:查询两顶点是否相邻、获取度效率高(O(1))

◦ 缺点:空间复杂度 O(n²),稀疏图浪费空间

• 邻接表(Adjacency List):

◦ 原理:顶点用数组存储,每个顶点对应一个链表/数组,存储其邻接顶点(及边权重)

◦ 优点:空间复杂度 O(n+e)(e 为边数),适合稀疏图

◦ 缺点:查询两顶点是否相邻效率低(O(deg(v)))

• 其他存储方式:

◦ 邻接多重表:解决无向图邻接表删除边需遍历两次的问题

◦ 十字链表:优化有向图的入度/出度查询效率

五、图的核心算法

(一)遍历算法

• 深度优先搜索(DFS):

◦ 思路:从起点出发,沿一条路径走到尽头,回溯后继续未遍历路径(类似树的先序遍历)

◦ 实现:递归(简洁)或栈(避免递归栈溢出)

◦ 应用:判断图连通性、查找路径、拓扑排序(DAG)、求强连通分量

• 广度优先搜索(BFS):

◦ 思路:从起点出发,按层级遍历所有邻接顶点(类似树的层序遍历)

◦ 实现:队列

◦ 应用:最短路径(无权图)、迷宫求解、拓扑排序

(二)最短路径算法

• 迪杰斯特拉(Dijkstra)算法:

◦ 适用:带权无负权边的图,求单源最短路径(从一个起点到所有其他顶点)

◦ 核心:贪心策略,每次选当前最短路径顶点,松弛邻接边权重

• 弗洛伊德(Floyd-Warshall)算法:

◦ 适用:任意带权图(可含负权边,不含负权回路),求所有顶点间最短路径

◦ 核心:动态规划,通过中间顶点逐步更新两顶点间最短路径

• 贝尔曼-福特(Bellman-Ford)算法:

◦ 适用:带权图(可含负权边),检测负权回路,求单源最短路径

(三)其他关键算法

• 拓扑排序(Topological Sort):

◦ 适用:有向无环图(DAG),输出顶点序列满足所有边的起点在终点前

◦ 实现:Kahn算法(基于入度)、DFS逆序

◦ 应用:任务调度、课程安排

• 最小生成树(MST):

◦ 适用:连通带权无向图,生成包含所有顶点且边权重和最小的生成子图

◦ 算法:Prim算法(适合稠密图,贪心选邻接最小边)、Kruskal算法(适合稀疏图,按权重选边避环)

◦ 应用:通信网络搭建、道路规划

六、应用场景

• 路径规划:地图导航(最短路径、最小成本)

• 网络相关:社交网络好友推荐(邻接顶点)、网络拓扑分析

• 任务调度:项目管理中任务依赖排序(拓扑排序)

• 其他:电路设计、物流配送优化、舆情传播分析

相关推荐
蓝田生玉1231 天前
BEVFormer论文阅读笔记
论文阅读·笔记
西瓜堆1 天前
提示词工程学习笔记: 工程技术行业提示词推荐
笔记·学习
之歆1 天前
Spring AI入门到实战到原理源码-MCP
java·人工智能·spring
yangminlei1 天前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
qq_318121591 天前
互联网大厂Java面试故事:从Spring Boot到微服务架构的技术挑战与解答
java·spring boot·redis·spring cloud·微服务·面试·内容社区
J_liaty1 天前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
阿蒙Amon1 天前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
daidaidaiyu1 天前
Spring IOC 源码学习 一文学习完整的加载流程
java·spring
666HZ6661 天前
数据结构2.0 线性表
c语言·数据结构·算法
2***d8851 天前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端