数据结构与算法 —— 图 (Graph)的基本介绍
ps. 本章只介绍有向图和无向图。
目录
图的定义
有向图和无向图
图的概念
图的存储
图的基本操作
图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)
- G 表示一个图,
- V(Vertex)表示顶点的有穷非空集合,
- E 表示图中边(Edge)的集合。
有向图和无向图
如果一个图是由单向链表所连接,即它的边是有顺序的配对,那么该图是一个有向图(directed graph)。反之,则称为无向图(undirected graph)。
下图中(a)为无向图,(b)为有向图。(可以简单的理解为,有箭头指向方向的就是有向图,反之是无向图)
图的概念
1. 路径(Path):从一个顶点Vi到另外一个顶点Vj的边的序列被称为一个路径。
2. 环(Cycles): 一条路径的起始顶点和结束顶点是同一个且通过不重复的路径的组合的话,称为一个环。如果一个图中有环的结构,它就被称为一个有环图(cyclic graph),反之则是无环图(acyclic graph)。
3. 连通(Connected):如果从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通的。
4. 子图 (Subgraphs): 有一个图 G =(V,E), 另外一个 S =(U,F),若 U ∈ V ∧ F ∈ E 且 S ≤ G,S就是G的子图(当S是G的一部分时,S就是G的子图)
5. 顶点的度 (Degree):在有向图中,对于一个顶点v,指向v的边的数量就是这个顶点的入度(in-degree),从v指向其它顶点的边的数量,就是这个顶点的出度(out-degree)。 在无向图中,由于边不存在方向,所以不谈入度和出度,只谈度(degree),也就是包含这个顶点的边的总数量。
6. 权(Weight):有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权。
图的存储
图结构除了要存储本身的顶点数据以外,还得存储不同顶点之间的关系,因此图的存储相对复杂,常用的图的存储结构有邻接矩阵和邻接表等。
1. 邻接矩阵:
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一位数组存储图中顶点信息,一个二维数组(称为领接矩阵)存储图中的边或弧的信息。
对于无向图:
可以看出来V1到V3是不连通的,左边的边数组表示了顶点与顶点之间的关系(1代表两个顶点之间连通,0代表不连通),且不论行的和或者列的和都可以反映出来顶点的度数。(前面提到了无向图不分出入度)
对于有向图:
可以看出来V1和V3也是不连通,且V2和V3也不连通,左边的边数组也反应出来了,但与无向图不同的是,它的列的和代表入度,行的和代表出度。
邻接矩阵的优点:
- 查询边的存在和权重高效:可以直接通过查找矩阵中对应的元素来判断两个顶点之间是否存在边,以及获取边的权重,时间复杂度为O(1)。
- 结构简单:邻接矩阵易于实现,可以使用二维数组来表示。
邻接矩阵的缺点:
- 空间效率较低:邻接矩阵需要为图中每对顶点分配空间,因此在稀疏图(边数相对较少的图)中,邻接矩阵可能会浪费大量空间。对于具有n个顶点的图,邻接矩阵的空间复杂度为O(n^2)。
- 查询相邻顶点效率较低:查找与某个顶点直接相邻的所有顶点需要遍历该顶点所在行或列的所有元素,时间复杂度为O(n)。
2. 邻接表:
邻接表(Adjacency list)由表头节点和表节点两部分组成,图中每个顶点均对应一个存储在数组中的表头节点。如果这个表头节点所对应的顶点存在邻接节点,则把邻接节点依次存放于表头节点所指向的单向链表中。
对于无向图:
对于有向图:
邻接表的优点:
- 空间效率:邻接表只存储图中实际存在的边,因此在稀疏图(边数相对较少的图)中,邻接表比其他表示方法(如邻接矩阵)更节省空间。
- 查询相邻顶点高效:查找与某个顶点直接相邻的所有顶点只需访问该顶点对应的列表,时间复杂度与相邻顶点数成正比。
邻接表的缺点:
- 查询两个顶点之间是否存在边的效率较低,因为需要遍历其中一个顶点的邻接表来查找另一个顶点。
图的基本操作
numVertices():返回图的顶点总数。
numEdges():返回图的边的总数。
getVertex(u):如果存在一个顶点u,则返回这个顶点,否则返回null。
getEdge(u, v):如果存在一条从顶点u到顶点v的边,则返回这条边,否则返回null。
insertVertex(x):创建并返回一个新的顶点且存储在x节点中。
insertEdge(u, v, x):创建并返回一个新的从顶点u到顶点v的边,且存储在x节点中。
removeVertex(v):从图中移除掉顶点v和与其相关的边。
removeEdge(e):从图中移除掉边e。
这篇文章就到这结束了,当然还有许多知识点没有涉及到(等之后慢慢补上),但图的定义,概念,存储方式和基本操作都有讲到,要是有什么错误欢迎各位大佬指出。
下篇文章会讲深度/广度优先搜索。
数据结构与算法 —— 图 (Graph)的基本介绍相关推荐
- 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...
数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...
- 图论算法—图的拓扑排序介绍和Kahn算法原理解析以及Java代码的实现
详细介绍了图的拓扑排序的概念,然后介绍了求拓扑序列的算法:Kahn算法的原理,最后提供了基于邻接矩阵和邻接表的图对该算法的Java实现. 阅读本文需要一定的图的基础,如果对于图不是太明白的可以看看这篇 ...
- js数据结构与算法 图的BFS和DFS
本文为技术学习的笔记-<Learning JavaScript Data Structures and Algorithms, Third Edition> 1.图的相关术语 图是网络结构 ...
- 数据结构与算法--图的表示与常用算法
什么是图? 图(Graph)形结构中,是一种非线性结构,在图中每一个元素都可以有0或多个前驱,也可以有多个后驱.节点之间的关系是任意的,即图中任意两个数据元素之间都有可能相关. 图的术语 顶点:带有数 ...
- Python 数据结构与算法——图(Graph)
图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作诠释成一个图问题的话,那么该问题至少已经接近解决方案了.而我们我们的问题实例可以用**树结构(tr ...
- python【数据结构与算法】Graph(图)的总结
文章目录 1 基本概念 2 图的存储 2.1 邻接矩阵 2.2 邻接表 3 图的遍历 3.1 深搜-stack实现 3.2 广搜-queue实现 4 拓扑排序 5 图的最小生成树 5.1 普利姆算法 ...
- 适合初学者的数据结构_数据结构101:图-初学者的直观介绍
适合初学者的数据结构 了解您每天使用的数据结构 (Get to know the data structures that you use every day) Welcome! Let's Star ...
- java数据结构和算法——图的深度优先(DFS)遍历
目录 一.图的遍历介绍 二.图的深度优先搜索(Depth First Search) 三.图的深度优先遍历算法步骤 四.图的深度优先遍历示例需求 五.图的深度优先遍历代码示例 一.图的遍历介绍 所谓图 ...
- java数据结构和算法——图的广度优先(BFS)遍历
目录 一.图的遍历介绍 二.图的广度优先搜索(Broad First Search) 三.图的广度优先遍历算法步骤 四.图的广度优先遍历示例需求 五.图的广度优先遍历代码示例 一.图的遍历介绍 所谓图 ...
最新文章
- 明星企业内推+BAT面经,长三角的开发者联合起来!
- c mysql显示多条数据_用一条mysql语句插入多条数据
- 通过模拟器看Windows Phone 7
- android系统各种音量的获取与设置
- 课程设计+计算机程序设计,高职计算机程序设计课翻转课堂初探
- Java EE 8安全性API:概述
- 扫地机器人测评云鲸_云鲸科技,J1测评
- React ref的转发
- 巧用FlashPaper 让Word文档变Flash
- 基于JAVA+SpringMVC+Mybatis+MYSQL的实体店会员服务系统
- voip 客户端 android,Android基于OpenSL ES,Speex,RTMP的Voip客户端实现
- IP地址归属地和手机号码归属地批量查询(单次支持500个以内,支持结果导出xls)
- ios客户端发现_华为爱奇艺手机活动开发总结
- CentOS官网下载所需版本的CentOS版本方法
- dBm和dB(纯计数单位)
- 画PCB必备的3D元器件模型下载地址整理
- 静态函数和非静态函数的区别(静态方法和非静态方法)
- 计算机专业英语听说,计算机专业英语听说(二).doc
- linux 渗透 系统,初识Linux渗透:从枚举到内核利用
- i7 13650hx参数 酷睿i713650hx性能怎么样相当于什么水平