数据结构--图(笔记)

文章目录

1. 概念

① 图:在计算机科学中,图(英语:graph)是一种抽象数据类型,用于实现数学中图论的无向图和有向图的概念。-- wiki 图是一种表示关系的数据结构
(树:是一种表示层级的数据结构)

② 遍历一张图时需要同时考虑节点(V)和边(E),时间复杂度最坏的情况O(V+E),后续可以通过一些算法降低时间复杂度。

③ 关于图两个常见的遍历算法(最坏情况下时间复杂度都是O(V+E)):深度优先算法(dfs)、广度优先算法(bfs)。

③ 图中最短路径问题常用算法:Dijkstra算法(时间复杂度 O((V+E)logV))、bellman-ford算法(时间复杂度 O(VE))

2. 分类

补充说明:树是一种特殊的图(堆是一种特殊的树)

(上图来源:wiki)

无向图

无向图:两点之间仅仅是相互连接的关系,表示一种状态(例如:上述节点依次代表一个人abcde,表示a和b互相认识,b和c互相认识等等关系时就可以用无向图)

有向图

有向图:节点之间会有一种指向关系(例如:a喜欢b,b喜欢c,c和d互相喜欢)

循环图

要求:需要有三个及三个以上节点形成闭环

(上图节点之间的关系有向无向都行,即循环图是有向图无向图都行)

节点之间形成闭环的行为被称为:图的循环

连通图

判断图的连通性算法:并查集(也是一种树结构)、深度优先搜索(递归的方式)

3. 应用

  1. 航班信息(例如:此刻只有A到B的单程票、或者B到A的单程票、或者A到B和B到A的票都有)--有向图
    >2. 社交关系模型(例如:A和B互相认识、B和C互相认识、C和D互相认识等关系描述) -- 无向图
  2. 交通网络模型 -- 无向图

4. 操作(CRUD)

操作重点:节点、方向(边或者弧)

实现方式:链表(邻接表)、二维数组(邻接矩阵)

(图片来源:wiki)

5. 图常见的数据结构

邻接表

邻接表就是一种链表,用来存储每个节点的相邻节点信息(每个节点也都有一个与之对应的链表)。
>

(图片来源:wiki)
优点(链表的优势):① 节省空间:对于稀疏图,邻接表可以大大节省存储空间,因为它只存储实际存在的边。② 便于添加和删除边:在动态图的情况下,邻接表更容易进行边的添加和删除操作,时间复杂度相对较低。
应用场景:① 社交网络分析:社交网络通常是非常稀疏的图,每个人作为一个顶点,人与人之间的关系作为边。邻接表非常适合存储这种大规模稀疏图,可以高效地存储和处理社交网络中的人际关系。② 地理信息系统:在地理信息系统中,地图可以抽象为图,地点作为顶点,道路作为边。由于实际的地图中地点之间的连接相对较少,邻接表可以有效地存储地图信息,并且在进行路径规划等操作时,可以快速遍历相邻的地点。

邻接矩阵


(图片来源:wiki)
优点(数组的优势):① 直观:可以直接通过矩阵元素判断两个顶点之间是否有边相连,查询操作简单快速,时间复杂度为O(1) 。② 适合稠密图:当图比较稠密,即边的数量接近顶点数量的平方时,邻接矩阵不会浪费太多空间。
应用场景:① 网络流量分析:在计算机网络中,分析网络节点之间的流量关系时,如果节点之间的连接比较紧密,邻接矩阵可以方便地表示节点间的流量大小,快速查询任意两个节点之间的流量情况。② 有权图且边权变化少:如果图是带权图,且边的权重相对稳定,不经常变化,邻接矩阵可以方便地存储边的权重信息,便于快速查询和处理。

关联矩阵

关联矩阵:元素表示各个节点-边对是否相关

(图片来源:wiki)

关联矩阵与邻接矩阵

定义和元素含义:

① 关联矩阵:是一个n × m的矩阵,其中n是图的顶点数,m 是图的边数。矩阵中的元素表示顶点与边的关联关系。如果顶点 i 与边 j 相关联,则对应元素为特定值(通常为 1 或根据边的方向等有不同取值);若不相关联,则为 0。

② 邻接矩阵:是一个n × n的矩阵,其中n是图的顶点数。矩阵中的元素表示顶点之间的连接关系。如果顶点 i 与顶点 j 之间有边相连,则对应元素为特定值(如 1 或边的权重等);若没有边相连,则为 0。
存储信息:

① 关联矩阵:存储了每个顶点与每条边的关联情况,可以清晰地反映出图的结构细节,包括顶点与边的具体连接方式。对于有向图,可以区分边的起点和终点与顶点的关联关系。

② 邻接矩阵:主要存储顶点之间的直接连接关系,侧重于反映顶点之间的邻接状态。对于有向图,可以区分出边的方向。
适用场景:

① 关联矩阵:在电路分析中非常有用,能够清晰地表示电路中的节点和支路之间的关系,帮助分析电流、电压等;在研究图的生成树等问题时,可以通过关联矩阵的性质进行分析。

② 邻接矩阵:适用于需要快速判断两个顶点之间是否有直接连接的情况,查询操作时间复杂度为O(1)。在网络分析中,当关注网络中节点之间的直接交互关系时,邻接矩阵较为方便。

6. 内容出处

数据结构

相关推荐
静止了所有花开1 小时前
SpringMVC学习笔记(二)
笔记·学习
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
huangkj-henan7 小时前
DA217应用笔记
笔记
Young_202202027 小时前
学习笔记——KMP
笔记·学习
秀儿还能再秀7 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
WCF向光而行7 小时前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
workflower7 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
一个不喜欢and不会代码的码农8 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
Li_0304069 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络