前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP常见的几种数据结构

PHP常见的几种数据结构

作者头像
句小芒
发布2022-12-29 18:04:13
4700
发布2022-12-29 18:04:13
举报
PHP常见的几种数据结构

1 数组

数组(Array)是一种线性表的数据结构,它用一段连续的内存空间,来存储具有相同类型的值。但是由于在PHP的底层定义中,数组是通过散列表实现的,所以这段定义并不适用。PHP的数组可以存储任意数据类型的数据,所以相对于Java来说效率较高。在Java的数组中,每次定义都要先声明属于组的类型,在查找数组时,效率是O(1),但是在插入和删除时,算法复杂度是O(n),因为在插入操作时,要先找到插入的位置,然后将该位置及往后的元素都往后移一位。删除同理。但是PHP却不受此约束。

2 链表

和数组不同,链表并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,一般节点有两个属性(data和next)。链表有多种类型,最简单的是单链表。

  • 单链表是最原始的链表。单链表有两个节点比较特殊,头结点和尾节点。头结点记录链表的基地址,通过它可以遍历得到整条链表。尾节点的指针不是指向节点,而是指向空地址NUll,表示这是最后一个节点。单向链表插入和删除的时间复杂度是O(1),而查询的时间复杂度是O(n) 疑问:当进行插入和删除操作时要先查询相应节点,查询的时间复杂度是O(n),为什么插入和删除的的复杂度是O(1)呢?可以将插入删除看作是单纯的插入删除,不包含查询在里面。当做两个不同的操作来看待。
  • 在单链表的基础上扩展有了循环链表,循环链表是将尾节点的next指向了头结点,从而实现了收尾相连。可以解决(约瑟夫环)问题。
  • 双向链表:与单向链表的区别是除了有一个指向下一个节点的指针外,还有一个用于指向上一个节点的指针。从而实现通过O(1)复杂度找到上一个节点。使得双向链表在插入删除是比单向链表更高效。以删除为例,在删除节点时,我们还要获取其前驱节点,让前驱节点的指针指向被删除节点的下一个节点。在单向链表中,获取前驱节点的复杂度是O(n),但是双向链表O(1)直接获取前驱节点。所以双向链表插入和删除的时间复杂度才是真正的O(1)。
  • 最后一种就是双向循环链表,就是双向链表和单向链表的结合。

时间复杂度是靠更差的空间复杂度换取的,双向链表始终需要单链表的两倍空间在 Web 应用中,时间效率优先级更高,所以我们通常都是空间换时间来提高性能。

3 栈

限定只能在一端进行插入和删除操作的线性表,并且满足先进后出的特点。我们把允许插入和删除的一端叫做栈顶,另一个端叫做栈底,不含任何数据的栈叫做空栈。栈支持通过数组/链表实现,通过数组实现的通常叫做顺序栈,通过链表实现的叫做链栈。

  • 使用PHP中array_push()和array_pop()来实现。

4 队列

和栈类似,队列也是一种特殊的线性表结构,只不过队列是在一端插入,另一端删除,就跟我们平常排队一样,从队尾入队,在队头出去,所以队列的特性是先入先出,允许插入的一端叫队尾,允许删除的一端叫队头。队列也可以通过数组和链表实现,通过数组实现的叫顺序队列,通过链表实现的叫做链式队列,栈只需要一个栈顶指针就可以了,因为只允许在栈顶插入删除,但是队列需要两个指针,一个指向队头,一个指向队尾。

  • 使用PHP中array_shift()和array_push()来实现。

5 重要的编程技巧:递归

递归,简单来讲就是在函数定义中调用函数自身,将一个大的问题拆分成多个小问题,逐一击破后最后归并结果。判断一个问题是否可以通过递归来解决,主要看它是否满足以下三个条件:

1 一个问题的解可以分解为几个子问题的解 2 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 3 存在递归终止条件

递归一定要有终止条件,否则会导致函数被无限调用最终致使内存溢出

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP常见的几种数据结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档