有向图、无向图相关数据结构

【数据结构:图】 有关图的一些基本概念 阅读详情

有向图、无向图相关数据结构

1. 概述

最近面试的公司是做地图业务相关的,可能在路径规划、路径搜索方面会涉及图相关的知识,因此趁着这个机会把图相关的知识补充整理一下。

如果对图进行大分类的话,主要可以分为有向图和无向图。

所谓有向,指的就是从A点到点B这条路径是成立的,而从点B到点A这条路径不一定成立。而无向图的话,从A可以到B的话,意味着也可以从B到A。

在图里面,使用的数据结构可以有四种:邻接矩阵、邻接表、十字链表、邻接多重表。

这里先给出四种数据结构的优缺点对比:

1. 邻接矩阵来表示图的话比较直观。可以根据每一行来判断每一个顶点出度对应的终点在哪,根据每一列可以判断每一个顶点的入度的起点是谁。如果矩阵里面有比较多的0,那么称为稀疏矩阵。稀疏矩阵里面蕴含的信息太少,需要压缩。

2. 邻接表类似于哈希链表。其中每一个顶点都可以作为一个bucket,然后这个bucket里面是一条链表,链接了以bucket为起点的所有终点的信息。对于有向图来说,这样的一个结构往往只含有一向的信息(出度信息),结点的入度信息需要遍历完整个邻接表才知道,效率太低。对于无向图,则存储的冗余信息太多。比如1->2那么必有2->1,其实只需要一个就行了。

3. 十字链表。十字链表主要是针对于有向图对邻接表的改进。十字链表的思想很简单:对于一个结点,不知道入度信息是吧?那入度信息也给你链接起来!

4. 多重邻接表。多重邻接表主要是针对于无向图对邻接表的改进。多重邻接表的思想很也简单:对于一个结点,重复表示了是吧,那行,结点从顶点变成了边。和这条边有关系的,维度一条链表,把这条边加进去。

1. 邻接矩阵

在这里插入图片描述

以上面的有向图构建的邻接矩阵如图所示。矩阵的构建比较简单,这里不在赘述。

需要注意的是,对于顶点2,对应的行全部是0,表示从顶点2出去的边一条都没有。此时如果把这一行进行删除,要用的时候发现2没有对应的行,就可以推断从结点2无法去到任何结点。因此,可以对邻接矩阵进一步进行压缩,节省空间。

2. 邻接表

在这里插入图片描述

以上面的有向图构建的邻接表如图所示。其实就是STL里面的链式哈希表。

邻接表的构建也比较简单。从图里面看出来的是对于结点2,相对于邻接矩阵,确实不需要额外的"0"来存储它的出度终点的信息。因为本来是没有,所以用0表示有点消耗空间。

但是,对于邻接表,需要思考的事情是:从顶点1出发,我能知道它能到达结点2,顺着链表,我又知道它可以到达结点3。但是我不知道从哪个结点出发可以到达顶点1。那怎么办,只能遍历全部链表,记录谁能到达结点1(时间复杂度高),又或者是加一条链表,存储全部那些终点是1的结点。但是这样消耗空间(空间复杂度高)。那怎么解决呢?使用十字链表!

3. 十字链表

十字链表可以看成是二维版本的邻接表。

相比于邻接表,它的实现就是给每一个结点加一条链表来存储 ’谁能到达这个结点‘。但是,这条链表的结点不是新生成的,而是利用了邻接表的原始结点(在结点里面加了少量信息)。因此,对于十字链表来寻找 ’能到达谁‘、’谁能到达我‘比较高效而且节省空间的。

要使用十字链表,首先要稍微更改一下邻接表中表(一个表有很多bucket)和结点的存储信息:

在这里插入图片描述

这样看十分的抽象,直接上图:

在这里插入图片描述

上面的图显示了构建十字链表的第一步:对于每个节点,使用一条链表来存储以这个节点为起点,所对应终点的节点的信息。

其实就是一个和邻接表相似度达到百分之99相似的链式哈希表。但是这个数据结构里面还是有些区别:

1. 灰色的表示表信息,但是相对于邻接表,这个灰色的格子多了一个空格出来。这个格子在第二步中是有用的:用来存储’哪些节点能到达这个节点‘。

2. 蓝色的表示节点的信息:但是相对于邻接表,这个蓝色的又多了两个格子,其中一个格子用来存储'起点'了。起点是什么意思? 比如,在上面的邻接表中,1->2的话。那么对于顶点1对应的链表,第一个格子只存了一个2,而现在需要存1和2。

在这里插入图片描述

上面的图显示了构建十字链表的第二步(全部画出来太乱,因此把第一步的线全部隐藏了,其实是存在的,而且这个图只画了和节点1有关的"谁能到达节点1"的链表):

在这一步中,第一步中没用到的第二个灰色格子用起来了,指向了一条链表。而且,这条链表的元素代表的都是“谁能到达这个节点”。因此,在上图中,把全部的表中第二个灰色格子补充完整,就是第二步骤所作的事情。

再总结一下:

  1. 第一步完成了我能到达哪个节点。
  2. 第二部完成了哪个节点能到达我。

4. 邻接多重表

前面已经分析了邻接多重表主要是在邻接表上对于无向图的改进(存储双份信息,冗余)。因此,把链表中节点的信息换成下面的边信息可以减少这种冗余:
在这里插入图片描述

由左边无向图构建的邻接多重表如图所示:
在这里插入图片描述
上面的图其实有点像B树(或者B+树)。对于边,一般存储了两个节点的信息,还有两个指针域。

比如,上面1、2形成的边,节点1旁边的指针,其实是指向了从节点1出发可以到达节点几。
顺着这个指针,又可以找到1、3形成的边。这样,使用边信息来代替顶点信息,可以减少信息的冗余表示,节省空间。

数据结构之图:无向图的介绍与功能实现,Python——22 无向图(Undigraph)的介绍 引入 生活中的图,有地图,集成电路板的图,可以看类似的看做是数据结构中的图 数据有"一对一",“一对多”和“多对多”的关系,前两种分别表示线性表和树的存储结构性质,而多对多则可表示图的存储结构性质 定义 图是由有限的(并且可能是可变的)组的顶点(vertices,或称点points,结点nodes),以及一系列由这些每两个顶点之间相连的有向或无向的边(ed... 阅读详情

相关推荐

【数据结构与算法】3.(单向、无向、带权)图,广度、深度优先搜索,贪心算法

单向图、无向图、带权图、广度优先搜索、深度优先搜索、贪心算法

皓亮君的博客 5007

数据结构——图的五种种类【无向图-有向图-简单图-完全无向图-有向完全图】

目录: 一:无向图 1.定义 2.图形化解释 3.结合​表达式介绍 二:有向图 1.定义 2.图形化解释 3.结合​表达式介绍 有向图和无向图区别: 三:简单图 1.定义 2.图形化解释 四:完全无向图 1.定义 2.图形化解释 五:有向完全图 1.定义 2.图形化解释 一:无向图 1.定义 若顶点到之间的边没有方向,则称这条边为无向边(Edge...

刘鑫磊 11万+

(数据结构)图——图、顶点、无向边、无向图、有向边、有向图、简单图、无向完全图、有向完全图、稀疏图、稠密图、权、网、子图的相关概念

图的定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)。 其中:G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 注意:1、线性表中我们把数据元素称为元素;树中将数据元素称为结点;在图中数据元素称为顶点。 2、线性表中可以没有数据元素,称为空表;树中可以没有结点,称为空树;在图中不允许没有顶点。在定义中,若V是顶点的集合,则强调了顶点集合V有穷非空。 3、线性表中,相邻的数据元素之间具有线性关系;树结构中,相邻两层的结点具有层次关系;在图中,任意两个顶点之间都有可能有关

小黄TIMTIM仔的博客 1万+

有向图和无向图的相关概念

图的定义:   图在数据结构中是中一对多的关系,一般分为无向图与无向图   常用 邻接矩阵 或者 邻接链表 来表示图中结点的关系   ⑴图是由顶点集V和顶点间的关系集合E(边的集合)组成的一种数据结构   ⑵用二元组定义为:G=(V,E)。 例如: 对于图7-1所示的无向图G1和有向图G2,它们的数据结构可以描述为:       G1=(V1,E1), 其中 V1={a,b,c,d...

wsen1229的博客 4万+

联想拯救者r7000p在ubuntu20.04未找到wifi适配器,安装rtl8852ae网卡驱动问题解决方案

新买的拯救者r7000p 2021款,装完ubuntu20.04之后显示未找到wifi适配器, 更换N次源之后还是只有一个显卡驱动,在网上找了很多方法,再自己折腾了一段时间后,总算是解决了这个问题。 1.设置bios 打开主板系统,将security boot设置为disenable,因为设计到修改内核配置,必须得关掉安全启动。 2.查询网卡状态 使用命令查询网卡(hardware of Internet)状态 lshw -C network 因为是双系统,在Windows下控制面板-设备管理器中可以

MCZ777的博客 1万+

Matlab使用GitHub的踩坑记录(持续更新)

Matlab使用git的踩坑记录前言Matlab设置Git的官方帮助文档系统配置新建Git两种代码管理方式典型源代码管理SVN分布式源代码管理 Git注意:SVN和Git都可以用GitHub创建新的库 前言 作为Git初学者,对Git的代码版本管理非常非常喜欢,给了我极大的安全感。特别是想到之前的几次Matlab、Latex和python的代码莫名其妙被折腾没了又没法找回的悲剧,决定慢慢的走入gi...

voluntry的博客 7296

【数据结构】无向图与有向图的连通性及相关算法

I. 阅读前你所需的基础知识 了解图 (graph) 的基本知识 (什么是顶点, 什么是边, 什么是路径等等) 了解图的深度优先遍历 (DFT, Depth-first Traversal) 了解有向图 (directed graph) 与 无向图 (undirected graph) II. 连通性(Connectedness) 无向图的连通性 无向图内的顶点连通性: 若有一条路径包含顶点A和顶点B,那么顶点A与顶点B互相连通 无向图的连通性:若图像内,任意取两个顶点都是互相连通的,那么则称此无

qq_44671773的博客 5597

以LAN8720A为例的以太网硬件设计方案

输入时钟(XTAL1/CLKIN,XTAL2):推荐外加25MHz(性价比较高)晶振为PHY芯片提供时钟,PHY芯片内部PLL将其倍频为50MHz来使用,亦可使用直接使用50MHz晶振。三位MODE通过高低电平组合分别对应以上8种模式 ,包含10M半双工,10M全双工,100M半双工,100M全双工,是否启用自协商协议,CRS是否有效等。VDDCR:1.2V电源,可由芯片内部稳压电源提供,亦可由外部电源提供,由外部电源提供可降低芯片功耗。REF_CLK:参考时钟,由MAC或外部时钟晶振向PHY芯片提供。

weixin_46154042的博客 5884

数据结构之邻接表存储有向图或无向图及其相关操作(C++)

#include<iostream> using namespace std; #define maxsize 20 //边表 typedef struct ArcNode{     int adjvex;//结点的数据域,存顶点号     int info;//结点的数据域,保存边的权值     ArcNode *nextarc;//结点的指针域,指向下一条边结点  }ArcNod...

muhehhh的博客 2157

OpenClaw小白安装全攻略:5000字详解,3分钟上手

为什么值得装 OpenClaw?最近科技圈爆火的 OpenClaw(昵称 “小龙虾”),不是普通 AI 聊天工具 —— 它是能本地部署、直接操控电脑的 AI 智能体,相当于给电脑配了个 “全能助手”:整理文件、自动搜资料、写文档、控制浏览器,甚至对接微信 / 飞书发消息,全程不用手动操作。更关键的是:它免费开源、支持全平台,新手不用懂代码,复制粘贴命令就能装,数据存在本地不泄露隐私。截至 2026 年 3 月,GitHub 星标已破 25 万,券商都出研报推荐,上班族、学生党用它提升效率超香!

通俗易懂学IT 1211

k230 +canMV+ LVGL控件 仿手表表盘触摸屏滚动、选中后弹窗效果完整示例程序

现在智能手表用的越来越多,其交互方式比较有特点,现在k230开发板上,基于LVGL(Light and Versatile Graphics Library)编写一个嵌入式GUI应用程序,使用LVGL配合触摸屏实现模仿智能手表的表盘滚动效果,实际效果如下:程序使用LVGL图形库和MediaManager程序,创建带有触摸屏交互的GUI应用。程序主要功能包括显示初始化、LVGL初始化、创建GUI界面(包含一个可滚动的按钮列表,每个按钮点击会弹出消息框),以及处理触摸屏输入。

weixin_47446386的博客 1175

【数据结构和算法笔记】图的相关概念(有向图,无向图......)

原创作者: u_16969274 转载于: https://blog.51cto.com/u_1696927...

weixin_41077523的博客 63

华为OD机试双机位C卷-简单的解压缩算法(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【简单的解压缩算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD真题【简单的解压缩算法】。

qq_45776114的博客 474

数据结构(五)——有向图

1.1 术语 有向图是由一组顶点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。 有向图中,一个顶点的出度为由该顶点指出的边的总数;一个顶点的入度为指向该顶点的边的总数。 有向图中,有向路径由一系列顶点组成,对于其中的每个顶点都存在一条有向边从它指向序列中的下一个顶点。有向环为一条至少含有一条边且起点和终点相同的有向路径。简单有向环是一条(除了起点和终点)不含重复顶点和边的环。...

wuqingdeqing的博客 7749

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

Android13无重力感应系统修改触摸屏跟随屏幕显示旋转方向旋转

在实际产品中设计时会移除重力传感器。当设备缺少重力传感器时,系统无法使用该传感器提供的方向数据来确定屏幕旋转的方向。Android 系统中由于移除重力传感器导致的默认显示方向旋转引起触摸屏与屏幕显示不一致问题,主要是由于缺乏方向检测和触摸坐标的正确转换。通过使用替代传感器(如陀螺仪)、手动配置方向、调整触摸事件坐标和 UI 布局,可以解决这个问题。开发者需要确保在设备没有重力传感器的情况下,能够通过其他方法推测方向,并确保触摸事件和 UI 动作能够正确响应设备的旋转。

weixin_35723192的博客 803

数据结构第七章——图

一、图的定义和术语 (1)无向图、有向图 (2)顶点、边、弧、弧头、弧尾:数据元素vi称为顶点(vertex );(vi, vj)表示在顶点vi和顶点vj之间有一条直接连线。 在无向图中,则称这条连线为边;边用顶点的无序偶对(vi, vj)来表示,称顶点vi和顶点vj互为邻接点,边(vi, vj)依附于顶点vi与顶点vj; 在有向图中,一般称这条连线为弧。弧用顶点的有序偶对<vi, vj>来表示,有序偶对的第一个结点vi被称为始点(或弧尾),在图中就是不带箭头的一端;有序偶对的第二个结点vj

weixin_45876739的博客 1303

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构与算法————无向图

数据结构与算法————无向图图的邻接表存储表示 图的定义及分类 图是由一组顶点和一组能够将两个顶点相连的边组成的 我们需要定义三种结构、邻接表的构建 步骤: ①输入总顶点数,总边数 ②输入各顶点的值 ③输入各边所依附的两个顶点 ④构建新的边节点(使用头插法)

qq_26952443的博客 7258

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

有向图数据结构_数据结构复习——图

一、基本概念定义:图:{{顶点集},{边(弧)集}}1.无向图2.有向图3.顶点、边、弧、弧头(终端点)、弧尾(初始点)4.无向完全图5.有向完全图6.稠密图和稀疏图7.邻接点8.顶点的度、入度、出度9.路径、路径的长度10.回路、简单路径、简单回路11.子图12.连通13.连通图14.连通分量15.强连通图、强连通分量16.生成树17.生成森林18.网二、图的基本操作结构的建立和销毁对...

weixin_39537977的博客 501

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

图算法系列之无向图的数据结构

吐血整理程序员必读书单:https://github.com/silently9527/ProgrammerBooks 微信公众号:贝塔学Java 前言 从本篇开始我们将会一起来学习图相关的算法,图算有很多相当实用算法,比如:垃圾回收器的标记清除算法、地图上求路径的最短距离、拓扑排序等。在开始学习这些算法之前我们需要先来了解下图的基本定义,以及使用哪种数据结构来表示一张图,本篇我们先从无向图开始学习。 图的定义 图:是有一组顶点和一组能够将两个订单相连组成的。连接两个顶点的边没有方向,这种图称之为无向图.

Silently9527’s Blog 1017

数据结构之图(2-2)【邻接多重表】适用于无向图

邻接多重表(Adjacency Multilist)主要用于存储无向图。因为,如果用邻接表存储无向图,每条边的两个边结点分别在以该边 所依附的两个顶点为头结点的链表中,这给图的某些操作带来不便。例如,对已访问过的边做标记,或者要删除图中某一条边等, 都需要找到表示同一条边的两个结点。因此,在进行这一类操作的无向图的问题中采用邻接多重表作存储结构更为适宜。 邻...

weixin_34413065的博客 714

数据结构入门6-1(图)

图的定义 图的基本术语 图的类型定义 图的存储结构 邻接矩阵 1. 邻接矩阵表示法 2. 使用邻接矩阵表示法创建无向网 3. 邻接矩阵表示法的优缺点 邻接表 1. 邻接表表示法 2. 通过邻接表表示法创建无向图 3. 邻接表表示法的优缺点 十字链表(有向图) 邻接多重表(无向图) 图的遍历 深度优先搜索(DFS) 广度优先搜索

w_pab的博客 6619

数据结构之图(2-1)【十字链表】适用于有向图

邻接表固然优秀,但也有不足,例如对有向图的处理上,有时候需要再建立一个逆邻接表~ 那我们思考了:有没有可能把邻接表和逆邻接表结合起来呢? 答案是肯定的,这就是我们现在要谈的十字链表(Orthogonal List) 为此我们重新定义顶点表结点结构: 接着重新定义边表结点结构 十字链表的好处就是因为把邻接表和逆邻接表整合在了一起,这样既容易找到以Vi为尾的弧,也容易找到以...

weixin_33921089的博客 369

大厂必备技能:数据结构图之无向图

比如我们设当前二维数组引用为adjacency_ matrix,如图所示:adjacency_matrix[0][1]=1,则表示0和1号顶点之间存在一条边,同时又因为当前咱们的图为无向图,所以这个时候为了表示边的无方向性,这个时候咱们的adjacency_matrix[1][0]=1,则表示1到0之间的边。所以说,咱们的边一定是依赖顶点衍生出来的,不存在没有顶点却有边的情况。顶点在图中起着至关重要的作用,它主要是构成图的主要骨架,有了顶点以后,咱们将其按照相应的规则连接起来,也就形成了咱们最终的图。

zjjcchina的博客 1104

图----无向图、有向图

无向图,深度优先搜索,广度优先搜索,连通分量,寻找路径

Sid小杰的博客 1万+

数据结构之图的基本概念及应用(超详细)

图是一种非常常用的一类数据结构,但同时它也是最为复杂的,几乎涉及到之前所有学过的数据结构,学习该数据结构不光需要对之前的知识都有所了解,还需要付出大量的时间和耐心。

m0_74140776的博客 2517
上一篇: C++ 优先级队列(运用绑定器实现大小根堆)
下一篇: web服务器改进:迷你线程池+CAS自旋锁(Demo)
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值