【数据结构】邻接表

news/2025/3/4 22:12:34/

一、概念

邻接表是一个顺序存储与链式存储相结合的数据结构,用于描述一个图中所有节点之间的关系。

若是一个稠密图,我们可以选择使用邻接矩阵;但当图较稀疏时,邻接矩阵就显得比较浪费空间了,此时我们就可以换成邻接表。

邻接表的逻辑结构有些类似于哈希桶,都是由数组与链表相结合的结构。一维数组存储结构体元素,结构体中需要包含每个节点的编号以及一个指针域,指针指向后续的所有邻接点

下面是邻接表的逻辑结构示意图(无向图):

可以看到,我们只需要顺着每个链表,就可以找到图中所有的边。但是对于无向图而言,还是存在一定的数据冗余情况,每条边都被记录了两次

因为邻接表的数组存放了所有的节点,我们又可以将其称为顶点数组。邻接表的实现方式有很多种,只要能够描述出所有节点与这些节点对应的所有边就是一个邻接表

二、数组实现邻接表

在做题的时候,为了效率,我们常常采用数组来模拟邻接表。但是数组实现邻接表的方式也五花八门,这里以y总同款邻接表和有向图为例

int e[N], ne[N], h[N], idx;void add(int a, int b) // 将a指向b的边加入邻接表
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

起初我看到这种实现邻接表的方式完全摸不着头脑,在一番研究后大致理解了其原理,希望能够对大家有所帮助

首先我们大致了解一下这段代码中不同的数组和变量代表了什么:

  • a:出发点
  • b:边指向的节点 
  • h:下标为节点编号,其中的元素存放对应节点的第一条出边编号,需要被初始化为-1
  • e:存放每条边指向的节点编号
  • ne:存放同一节点的下一条出边的编号
  • idx:边的编号

用数组模拟邻接表的大致思路是,将第i个节点的第一条出边编号放到h[i]中,通过h[i]能够取出其编号,用这个编号访问e[h[i]]就能够得到这条边指向的节点,此时我们就得到了一条完整的边;再用这个编号访问ne[h[i]]就能够得到同一节点的下一条出边编号。顺着这个逻辑我们就可以访问一个节点所有的出边

要使用数组实现的邻接表也很简单,我们只需要选择自己想要访问的节点i,然后得到节点i的第一条出边编号h[i],通过e[h[i]]得到这条出边指向的节点,接着通过ne[h[i]]得到节点i的下一条出边编号

不要忘了数组h一开始被初始化为-1,因此我们通过循环不断访问出边编号,直到当我们访问到-1时就说明节点i的所有出边已经全部访问完毕

因为所有的边都有自己的编号,我们是通过使用编号来访问这条边的尾和下一条边的,在数组模拟实现邻接表中边的编号非常重要!如果不能理解编号的作用就不能很好的理解数组模拟邻接表的原理。

如果看了上面还不是很理解,接下来是详细过程:

第一步,我们按顺序对所有的边进行编号

idx初始值为0,因此我们正好从0开始一个个将边存进邻接表

第0条边指向的节点,我们存进e[idx]中,并将h[a]即节点a的第一条出边编号赋值给ne[idx],然后将h[a]修改为第0条边的编号。此时第0条边变为节点a的第一条出边,最后idx++变成下一条边的编号

也就是说,节点i的第一条出边编号h[i]是一直在被更新的,每有一条新出边存入邻接表,对应节点的h[i]就会被更新为这条边的编号,而原来的h[i]就变为这条新出边的下一条出边编号,存进了ne[h[i]]中

最后idx++变为1,开始存下一条边

到这里相信大家已经明白如何将边存入邻接表了

以上面的例子为例,此时节点0的出边已经全部存入邻接表。我们通过访问h[0]就能得到节点0的第一条出边编号1,然后获取到其指向的节点e[h[0]]即节点2,通过ne[h[0]获取到其下一条出边编号0

最后编号会变为-1,此时说明该节点的所有出边已经遍历完毕

完.


http://www.ppmy.cn/news/1538211.html

相关文章

谷歌浏览器 文件下载提示网络错误

情况描述: 谷歌版本:129.0.6668.90 (正式版本) (64 位) (cohort: Control)其他浏览器,比如火狐没有问题,但是谷歌会下载失败,故推断为谷歌浏览器导致的问题小文件比如1、2M会成功,大…

沉浸式娱乐新纪元,什么是5G+实时云渲染VR大空间解决方案?

近年来,虚拟现实(VR)技术在娱乐、教育、医疗等多个领域展现出巨大的潜力,尤其是VR大空间体验,更是以其沉浸式和互动性的特点,迅速成为市场的新宠。据Statista数据显示,2023年,全球虚…

【花卉识别系统】Python+卷积神经网络算法+人工智能+深度学习+图像识别+算法模型

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…

外包功能测试干了6个月,技术退步太明显了。。。。。

先说一下自己的情况,本科生,23年通过校招进入武汉某软件公司,干了差不多6个月的功能测试,今年中秋,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我就在一个外包企业干了6个月的功…

树莓派应用--AI项目实战篇来啦-9.OpenCV实现汽车检测

1.介绍 该项目使用的汽车检测使用的也是 haar 模型。这是一种基于机器学习的汽车检测算法。它使用了 Haar 特征来检测汽车,可以在图像中快速检测到汽车并输出其位置。采用该方法检测速度较快,但准确率略低。 2.OpenCV 实现汽车检测 可以采用官方自带的汽…

DJN人机交互解决方案

当前,人类社会正处于工业4.0时代。这是一个以智能、网络和定制化为特征的新时代,也是信息时代之后新的科技发展阶段。在工业4.0时代,智能技术贯穿于整个制造领域,生产过程更加自动化和智能化。 触控显示技术是智能化中不可或缺的…

Liunx各系统中间件查询脚本

Centos 6 #!/bin/bashecho "CentOS 6 系统软件信息收集"# 检查操作系统版本 echo "操作系统版本信息:" cat /etc/redhat-release# 检查JDK echo "检查JDK版本..." if command -v java &> /dev/null; thenjava -versionwhich …

特征工程在机器学习中的重要性及实践

文章目录 引言1. 什么是特征工程?2. 特征工程的重要性2.1 提高模型的表现能力2.2 提升模型的泛化能力2.3 减少维度、提高计算效率 3. 特征工程的主要步骤3.1 特征理解3.2 特征处理3.3 特征选择3.4 特征构造 4. 特征工程的常用方法4.1 数据清洗4.2 数据变换4.3 类别编…