前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从PHP数组实现原理看线性表数据结构

从PHP数组实现原理看线性表数据结构

作者头像
写PHP的老王
发布于 2020-01-21 11:24:03
发布于 2020-01-21 11:24:03
1.5K00
代码可运行
举报
文章被收录于专栏:写PHP的老王写PHP的老王
运行总次数:0
代码可运行

线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线串起来,再存储到物理空间中”。最简单的线性表就是数组了。虽然PHP的数组本身不是由基础的数据结构构成,但是其内部实现方式应用到了大部分的线性表数据结构。今天,借着学习线性表数据结构的机会,重新回顾PHP数组的内部实现原理。

PHP数组的内部实现

数组是PHP中很强大且非常重要的数据类型。它既支持单纯的数字索引数组又支持键值对数组,其中键值对数组类似于 java的 HashMap。由于采用了哈希表实现能够保证基本查找时间复杂度为 O(1),而且还能够保证数据遍历的顺序。

首先看看PHP在内核C语言的数据结构长什么样

看一下在php代码中,给数组插入一个元素会发生什么

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$arr = ['name'=>'admin'];

1.内核首先会创建一个_zend_array数据对象。初始化数组的大小为HT_MIN_SIZE,PHP中定义了HT_MIN_SIZE为8;所以当数组元素小于8的时候,插入数据并不会进行数组扩容。

2.使用Times 33hash算法,将 name转换成一个长整形的数。

3.在arData[nNumUsed++]中保存 Bucket 数据中 key是数组的键名,h中保存key的hash之后的整数(负数),val的u2.next 保存 arData[h]的地址。将转换表存储以 arData 起始指针为起点做镜面映射存储。这样,我们不需要额外的空间存储,在分配 arData 空间的同时也分配了转换表。

查找数组的时候,根据键名直接hash之后,可以直接定位到实际保存键值的Bucket,遍历的时候,因为arData本身是有序的C数组,遍历数组之后可以获取到保存键值的Bucket。因此PHP的数组既能够以O(1)的复杂度查询到数组,又能够顺序的遍历数组元素。

对应源码实现逻辑的主要核心代码如下:

上面的过程省略了hash冲突的情况。但是即使是从上面简单的版本中也可以发现PHP数组的实现运用了很多的数据结构知识。

Bucket *arData;是一个C语言数组,对应数据结构中的有序表。Bucket之间,通过valu2.next又构成了一个链表结构。

同时,PHP在处理hash冲突情况的时候,是将所有的冲突的键名数据退化成一个链表。而这种处理方式,是绝大部分hash处理的方式。

顺序表

顺序表的定义如下:

所谓顺序表就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构。

上面PHP核心代码中 arData就是一个顺序表。

序表的特点:

1. 在线性表中逻辑上相邻的数据元素,在物理存储上也是相邻的。

2. 存储密度高,但要预先分配“足够应用”的存储空间,这可能会造成存储空间的浪费。

3. 便于随机存储。只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。

4. 不便于插入和删除操作,这是因为在顺序表上进行的插入和删除操作会引起大量数据元素的移动。

顺序表存在的问题:

1. 物理上相邻存储,不便于内存利用。例如一个容量为10的数组,需要内存为10字节,但是目前没有连续10个字节空余的内存空间,但是有很多不连续的小于10字节的内存空间,这样也没办法分配;

2. 顺序表的容量很难确定。对于C语言而言,定义一个数组是需要指定数组大小的。这个大小就是为了方便底层用于申请连续内存空间。PHP源码中在初始化一个空数组的时候,也会先创建一个长度为16的arData数组,在需要扩容的时候在进行数组扩容。

3. 插入元素不方便,需要移动整个顺序表元素

链表

链表的数据结构,是针对顺序表的问题而提出的。链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。在PHP的数组的源码中,每个Bucket就是链表中的一个节点。通过Bucket.u2.next指向下一个节点(虽然本身是为了实现hash查找)。

根据链表的链接方式,分为单链表,双链表。

单链表的每一个节点中只有指向下一个结点的指针,不能进行回溯,适用于节点的增加和删除。

双链表的每一个节点中既有指向下一个结点的指针,也有指向上一个结点的指针,可以快速的找到当前节点的前一个节点,适用于需要双向查找节点值的情况

链表的优点:

插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。

内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。

总结

本文以PHP7.4的源码为基础,介绍了PHP内部是如何实现数组的有序同时保证键值查找的O(1)的查询速度。从PHP数组的实现出发,介绍了线性表中有序表,链表的基本内容以及各自的特点。皮毛内容,希望对大家有所帮助。

[1] PHP7 哈希表实现原理 : http://www.sohu.com/a/119748257_464029 [2] 链表: https://blog.csdn.net/Shuffle_Ts/article/details/95055467 [3] 数据结构(C语言版)系列一 线性表: https://www.cnblogs.com/wwf828/p/9503821.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI_第一部分 数据结构与算法(4.线性表之数组相关)
第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:
python编程从入门到实践
2019/10/22
4760
AI_第一部分 数据结构与算法(4.线性表之数组相关)
PHP数据结构-线性表?顺序表?链表?别再傻傻分不清楚
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。
硬核项目经理
2021/04/02
4950
【数据结构】线性表(二)单链表及其基本操作(创建、插入、删除、修改、遍历打印)
按照线性表结点间的逻辑顺序依次将它们存储于一组地址连续的存储单元中的存储方式被称为线性表的顺序存储方式。
Qomolangma
2024/07/30
1440
【数据结构】线性表(二)单链表及其基本操作(创建、插入、删除、修改、遍历打印)
重学数据结构(一、线性表)
线性表是最常见也是最简单的一种数据结构。简言之, 线性表是n个数据元素的有限序列。 其一般描述为:
三分恶
2020/08/21
7520
重学数据结构(一、线性表)
数据结构基础——线性表
数据结构可以按照逻辑结构的不同分为两大类:线性结构和非线性结构。其中非线性结构又可分为树形结构和图结构,而树形结构又可以分为树结构和二叉树结构。
小颜同学
2023/08/21
2460
【数据结构】线性表的链式存储结构
显然,这样的结构如果碰到数据量庞大并且需要频繁进行头插或中间插入的情况时的操作时间复杂度是极其庞大的.那么如何解决这个问题呢?我们先来思考一下导致这个问题的原因:
修修修也
2024/04/01
2320
【数据结构】线性表的链式存储结构
数据结构与算法(二)——线性表
所谓顺序存储,就是开辟一段连续的内存空间来存储。因此,线性表的顺序存储,其逻辑相邻,物理存储地址也相邻。
拉维
2022/03/28
3640
数据结构与算法(二)——线性表
【数据结构】线性表的顺序存储结构
记得大一的时候有个物理老师给我们带大学物理,第一节课刚去的时候,大家都零零散散的坐着,有的想好好听讲的就坐在前三排,有些想摸鱼划水的就坐在后两排,没抢到前面三排也没抢到后面两排的同学就只好委屈坐在了中间几排.
修修修也
2024/04/01
1780
【数据结构】线性表的顺序存储结构
【数据结构】第二章——线性表(4)
大家好,很高兴又和大家见面啦!!! 在前面的内容中我们介绍了线性表的第一种存储方式——顺序存储,相信大家经过前面的学习应该已经掌握了对顺序表的一些基本操作了。今天,我们将开始介绍线性表的第二种存储方式——链式存储。
蒙奇D索隆
2023/12/27
1870
【数据结构】第二章——线性表(4)
【数据结构真不难】线性表——五一专属|向所有热爱分享的“技术劳动者”致敬
目录 1.概述 2.顺序表         2.1定义         2.2地址公式         2.3顺序表特点         2.4算法:插入         2.5算法:删除         2.6算法:查找         2.7顺序表局限性 3.单链表         3.1定义         3.2术语         3.3类定义         3.4算法:【单链表的长度】         3.5算法:按索引号(位序号)查找         3.6算法:按值查找所以号      
陶然同学
2023/02/27
3100
【数据结构真不难】线性表——五一专属|向所有热爱分享的“技术劳动者”致敬
数据结构-线性表(顺序表与链表的基本知识 以及ArrayList 源码分析)
比如:美女和野兽,抽象的事物表示美女:头发长 前凸后翘。。。 可以表示为一个数据单元,野兽也是一个数据单元。
用户3045442
2018/09/11
7890
数据结构-线性表(顺序表与链表的基本知识 以及ArrayList 源码分析)
数据结构--线性表和链表的基础知识
近期准备重新学习一下常用数据结构和基本算法,并计划将这些内容的只是做一个整理和归类,准备慢慢写一个常用数据结构与基本算法的系列博文,博文列表参见:常用数据结构与基本算法博文系列,目前内容还比较少,后续慢慢补充。本文主要内容是介绍 数据结构--线性表和链表的基础知识。
mukekeheart
2020/09/16
9550
数据结构--线性表和链表的基础知识
【数据结构(C语言版)系列一】 线性表
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
闪电gogogo
2018/10/10
2.3K1
【数据结构(C语言版)系列一】 线性表
数据结构基础温故-1.线性表(上)
开篇:线性表是最简单也是在编程当中使用最多的一种数据结构。例如,英文字母表(A,B,C,D...,Z)就是一个线性表,表中的每一个英文字母都是一个数据元素;又如,成绩单也是一个线性表,表中的每一行是一个数据元素,每个数据元素又由学号、姓名、成绩等数据项组成。顺序表和链表作为线性表的两种重要的存在形式,它们是堆栈、队列、树、图等数据结构的实现基础。
Edison Zhou
2018/08/20
5300
数据结构基础温故-1.线性表(上)
数据结构学习笔记——线性表(中)
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。
蜻蜓队长
2018/08/03
4180
数据结构学习笔记——线性表(中)
【自考】数据结构中的线性表,期末不挂科指南,第2篇
首先假定线性表的数据元素的类型为DataType ,这个DataType 可以是自定义的,也可以是默认的int,char等类型
梦想橡皮擦
2019/12/12
5560
【自考】数据结构中的线性表,期末不挂科指南,第2篇
C语言中都有哪些常见的数据结构你都知道几个??
上次在面试时被面试官问到学了哪些数据结构,那时简单答了栈、队列/(ㄒoㄒ)/~~其它就都想不起来了,今天有空整理了一下几种常见的数据结构,原来我们学过的数据结构有这么多~
用户6754675
2020/03/31
4K0
数据结构学习笔记(线性表)
  1.基础概念:   *数据((数据对象(数据元素(数据项)))------包含关系。    *数据结构是互相之间存在一种或多种特定关系的数据元素的集合。   *逻辑结构:集合机构,线性结构,树形结构,图形结构。   *物理结构:顺序储存结果、链接储存结构。   2.算法效率问题:   *判断一个算法的效率时,函数中的常熟和其他次要项常常可以忽略,而更应该关注主项(最高次项)的阶数。 最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。   *常数项:不管这个常数是多少,我们都计作O(1)。
希希里之海
2018/05/16
7740
基础算法 | 数据结构之线性表&顺序表&链表(上)
各位,起床了起床了 小编又来送干货了 今天讲的是数据结构 全文字数:1185字 阅读时间:10分钟 数据结构?啥玩意? * 内容提要: *预备知识 *顺序表(Sequential List) *单链表
用户1621951
2018/04/19
9120
基础算法 | 数据结构之线性表&顺序表&链表(上)
数据结构——线性表(1)
  今天复习数据结构中最常用和最简单的一种结构,线性表。   线性表,从名字上你就能感觉到,是具有像线一样的性质的表。在广场上,有很多人分散在各处,当中有些是小朋友,可也有很多大人,甚至还有不少宠物,这些小朋友的数据对于整个广场人群来说,不能算是线性表的结构。但像刚才提到的那样,一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面一个是谁,他后面一个是谁,这样如同有一根线把他们串联起来了。就可以称之为线性表。
向着百万年薪努力的小赵
2022/12/02
4690
数据结构——线性表(1)
推荐阅读
相关推荐
AI_第一部分 数据结构与算法(4.线性表之数组相关)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档