当前位置: 首页 > 后端技术 > PHP

【PHP数据结构】线性表?序列表?链表?别傻到告诉

时间:2023-03-29 21:43:53 PHP

遵循与各种数据结构相关的所有教科书和书籍。让我们从线性表开始。今天的文章比较概念化,是关于线性表的一个知识点的总结。如上所述,物理结构用于确定数据的存储方式。其他数据结构(树、图)、算法等基本都是基于这样的物理结构。也可以说物理结构是数据结构的基础。在这里,我们首先介绍两种物理结构,它们也是我们以后学习数据结构的基石,它们是时序表和链表。序列表不谈复杂的定义或数学表达式。我们最直观的理解就是序列表是一个数组。是不是很简单,是的,在PHP或者C的世界里,我们把序列表定义为一个数组,同样的名词还包括:序列存储,序列结构等,只要看到这种名词,你马上就能想到数组。当然,在Java中,我们也可以像List一样把集合当作顺序存储结构。但是需要注意的是,Java的HashMap在PHP中是以键值对的形式定义的数组。它们是哈希表(Hash)。形式上,它们不是连续的。这里一定要记住,数组下标递增这样的顺序结构就是顺序存储结构。序列表一般占用连续的内存空间。不仅在逻辑上,而且在物理上也是相邻和连续的。链表链表在C语言中一般被定义为一种结构,它包括数据和指向下一个链表的指针。它不是顺序的。虽然逻辑是顺序的(用指针指向),但是物理上是可以分开的。也就是说链表不需要占用连续的内存空间,也不需要像数组一样在初始化的时候给定长度。在PHP中,我们没有structure的语法形式,所以直接用class来表示链表结构。类节点{公共$数据;publicNode$next;}这是一个简单的链表结构,我们可以称它为“节点”。data存放的是我们要保存的数据,可以是任意类型。接下来是我们的下一个链表节点。如果我们需要简单的遍历链表,就一直调用next直到为空即可。while($n->next){$n=$n->next;echo$n->data,PHP_EOL;}上图是链表的逻辑状态和遍历方向。具体的链表操作相关函数会在后面的文章中进行讲解。链表有多种形式。我们上面定义的是一个简单的单向链表。我们还可以定义一个双向链表(添加一个prev指向前一个节点),一个循环链表(最后一个next指向第一个节点)和一个双向链表(最后一个next指向第一个节点),第一个prev指向最后一个节点)。关于这些内容,我们也会在后面的文章中一一讲解。学完了序列表和链表,最后说一下线性表。实际上,序列表和链表这两种物理结构在默认状态下实现了“序列表”的逻辑数据结构。序列表:由n(n>0)个具有相同数据特征的元素组成的有限序列(闫伟民版)注意几个关键点:有限:数组长度,链表内存大小序列:逻辑顺序(数组既是逻辑的和物理)有序,链表逻辑上有序,物理上无序)数据特性相同:在PHP中不明显,C或Java中的数组是固定类型,同样给定一个初始长度。为什么线性列表如此重要?让我们考虑一下MySQL,它是一种逐行存储数据的关系数据库。数据表不是线性表吗?尤其是作为PHP程序员,我们每天都在和数组打交道(一般都是从数据库中读取的数据放入数据中)(当然我们可能用到的哈希比较多),也就是说我们在做开发的时候接触过天天跟这个东西,你说重要不重要。然而,树和图等数据结构并不是线性表。在实际分类中,它们属于非线性表的范畴。线性表的一大特点是它只有前后关系。无论是链表还是数组,都遵循这种前后关系。关系。虽然它们的基本表现形式仍然是使用数组和链表,但是从严格的角度,或者从考试面试的角度来看,它们确实不属于线性结构,而应该划分为非线性结构。总结今天的文章是学习数据结构基础知识的基础。当然,如果条件允许,最好看看C结构体是如何定义数组和链表的。PHP在底层帮我们解决了太多的问题,所以我们不能再使用这些原始的语法结构了。能够学习C中的数据结构是更推荐的形式。在下一篇文章中,我们将介绍时序表(数组)的线性表相关的逻辑操作。参考资料:《数据结构》第2版闫伟民《数据结构》第2版陈越《数据结构高分笔记》2020年版天琴考研============各媒体平台均可搜索【硬核项目经理】】