数据结构-图

前言:简单介绍数据结构-图

图(Graph)数据结构详解

一、图的定义与基本概念

是一种用于表示 ** 对象(节点)及其之间关系(边)** 的非线性数据结构,由两部分组成:

节点(Vertex/Node):表示具体对象(如城市、用户、任务等)。

边(Edge):表示节点之间的关系(如道路、关注、依赖等)。

核心术语

有向图(Directed Graph):边有方向(如 A→B 表示 A 指向 B,单向关系)。

无向图(Undirected Graph):边无方向(A-B 表示 A 和 B 互相连通)。

权重(Weight):边可以带有数值权重(如距离、成本、时间等)。

环(Cycle):存在从某个节点出发,经过若干边后回到自身的路径(有向图中称为有向环)。

连通图:无向图中任意两节点之间存在路径;有向图中需区分 "强连通"(任意两节点可互相到达)和 "弱连通"(忽略方向后连通)。

二、图的存储方式

图的存储需兼顾空间效率和操作便捷性,常见方式有两种:

1. 邻接矩阵(Adjacency Matrix)

结构 :用一个二维数组 matrix[N][N] 表示节点间的连接关系,其中 N 为节点数。

无向图中,若节点 ij 连通,则 matrix[i][j] = matrix[j][i] = 1(无权图)或权重值(带权图)。

有向图中,matrix[i][j] 表示从 ij 的边。

优缺点

优点 :查询边是否存在的时间复杂度为 O(1),适合稠密图(边数接近 \(N^2\))。

缺点 :空间复杂度为 O(N²),存储稀疏图(边数远小于 \(N^2\))时浪费空间.

示例(无向无权图)

复制代码
节点:A(0)、B(1)、C(2)、D(3)  
边:A-B,A-C,B-D  
邻接矩阵:  
[
 [0, 1, 1, 0],  // A的连接  
 [1, 0, 0, 1],  // B的连接  
 [1, 0, 0, 0],  // C的连接  
 [0, 1, 0, 0]   // D的连接  
]
2. 邻接表(Adjacency List)

结构:用数组或链表存储每个节点的相邻节点列表。

数组索引表示节点,对应的值为该节点的邻接节点集合(或带权重的边列表)。

优缺点

优点 :空间复杂度为 O(N+E)(E 为边数),适合稀疏图。

缺点 :查询边是否存在需遍历邻接表,时间复杂度为 O(E)

示例(有向带权图:A→B (5),B→C (3))

复制代码
邻接表:  
A: [(B, 5)]  
B: [(C, 3)]  
C: []  
三、图的遍历算法

遍历图的目的是访问每个节点一次,常见算法有两种:

1. 深度优先搜索(DFS, Depth-First Search)

思想:从起点出发,尽可能深入遍历每条路径,直到无法继续后回溯,类似树的前序遍历。

实现 :用递归 记录访问路径。需标记已访问节点(visited数组),避免重复访问或环导致死循环。

时复杂度O(N+E) (邻接表存储)或 O(N²)(邻接矩阵存储)。

示例(无向图遍历起点 A)

复制代码
访问顺序:A → B → D → C(可能因邻接表顺序不同而变化
2. 广度优先搜索(BFS, Breadth-First Search)

思想:从起点出发,按层次逐层访问所有相邻节点,类似树的层序遍历。

实现 :用队列按顺序存储待访问节点,先入队的节点先处理。

时间复杂度:同 DFS。

示例(无向图遍历起点 A)

复制代码
访问顺序:A → B → C → D(按层次扩展) 
四、图的应用场景

社交网络:用户为节点,关注 / 好友关系为边,分析社群结构(如连通分量)。

交通网络:城市为节点,道路为边,计算最短路线(Dijkstra 算法)。

计算机网络:路由器为节点,连接为边,检测网络连通性(BFS / 并查集)。

推荐系统:用户与物品为节点,交互行为为边,用图算法挖掘关联关系(如协同过滤)。

编译器:表达式树优化、函数调用图的拓扑排序。

五、图的扩展与变种

带权图:边带有权重,适用于成本、距离等场景。

二分图:节点可分为两部分,所有边仅存在于两部分之间(如任务分配问题)。

超图:边可连接两个以上节点(传统图的边仅连接两个节点)。

动态图:节点和边可动态添加或删除(如实时社交网络)。

相关推荐
蒙奇D索大2 分钟前
【数据结构】考研408 | 伪随机探测与双重散列精讲:散列的艺术与均衡之道
数据结构·笔记·学习·考研
我不是小upper9 分钟前
从理论到代码:随机森林 + GBDT+LightGBM 融合建模解决回归问题
人工智能·深度学习·算法·随机森林·机器学习·回归
budingxiaomoli21 分钟前
分治算法-快排
数据结构·算法
dragoooon3431 分钟前
[C++——lesson30.数据结构进阶——「红黑树」]
开发语言·数据结构·c++
云泽80831 分钟前
C++ STL 栈与队列完全指南:从容器使用到算法实现
开发语言·c++·算法
前端小白在前进1 小时前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
yaoh.wang1 小时前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽
Evand J1 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
xu_yule1 小时前
算法基础(背包问题)—分组背包和混合背包
c++·算法·动态规划·分组背包·混合背包
蓝色汪洋2 小时前
数码串和oj
数据结构·算法