随机存取与顺序存取深度剖析

目录

前言

存取结构和存储结构

两种存取结构

四种存储结构

顺序表的随机存取

链表的顺序存取


前言

在数据结构中的线性表这一章节中,我们学习了线性表的顺序存储和链式存储,以及两种存储方式的特点,比如链式存储方式增删元素可以直接修改指针,但是顺序存储方式增删查改却需要移动大量的元素等等,在此不再一一赘述。今天,我想和大家谈一谈什么是存取结构还有顺序表和链表的存取结构在计算机中怎么实现

存取结构和存储结构

有些同学在第一次接触存取结构这个概念的时候,经常把存取结构和存储结构混淆在一起。在这里,我为大家介绍一下什么是存取结构,什么又是存储结构,以方便大家明确区分存取结构和存储结构。

两种存取结构

存取结构定义:在某种数据结构上对查找操作时间性能的描述,存取结构有随机存取顺序存取两种存取方式。

随机存取:随机存取就是直接存取,可以通过下标直接访问任何数据,即存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作。

顺序存取:也叫非随机存取,就是指存取第N个数据时,必须先访问前(N-1)个数据。

四种存储结构

存储结构定义:数据及其逻辑结构(数据之间的关系)在计算机中的表示方法,存储结构有顺序存储结构链式存储结构索引存储结构散列(Hash)存储结构

顺序存储结构:把逻辑上相邻的结点存储到物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。

链式存储结构:不要求逻辑上相邻的结点在物理位置上也相邻,节点间的逻辑关系是由附加的指针字段表示的。

索引存储结构:在存储结点信息时除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

散列存储结构:根据结点的关键字通过散列函数直接计算出结点的存储地址。

顺序表的随机存取

众所周知,顺序表(本质是数组)通过数组下标,就可以直接读取某个元素,它的时间复杂度为O(1),这就是顺序表的随机存取特性。那么同学们考虑过没有,为什么数组通过下标就可以直接访问数据?是通过数组下标我们从第一个元素地址向后快速偏移得到目的元素的地址吗?

笔者第一次接触随机存取时,认为通过数组下标找元素就是从第一个元素地址往后推移数据空间找元素,比如说找第i个元素,我们需要从第一个元素向后依次并快速推移(i-1)个数据元素空间(不读取空间内的存储内容),这样就找到了第i个元素的地址。虽然往后推移数据元素空间找元素对于计算机来说是秒杀,但是后来才发现,这种根据数组下标往后推移空间的思想大错特错。

实际上,我们通过数组下标找元素本质上是通过公式直接计算出目的元素的地址,从而实现随机访问

在顺序表的学习中,我们知道顺序表通过物理相邻实现逻辑相邻,所以以下几个公式成立:

线性表中第i个元素地址:

LOC(ai)=LOC(L)+(i-1)*sizeof(ElemType)

LOC(ai)=LOC(a1)+(i-1)*sizeof(ElemType)

LOC(ai) = LOC(ai-1)+sizeof(ElemType)

首先我们一定知道数组第一个元素的地址【LOC(L)或LOC(a1)】,不妨数组的地址为0x0012ff40(假设在32位机器上,有32根地址线,8个16进制可以表示一个地址编号,可以管理1byte空间大小),我们假设顺序表的数据元素类型为int整型,并且想读取顺序表中第10个元素。 

我们将10代入到上面的公式中,就可以得到目的元素位置相对于初始位置的偏移量为i-1=9,那么LOC(a10)=LOC(a1)+9*sizeof(int)。9*sizeof(int)的计算结果为9*4=36,36转化为16进制为24,最终计算出a10的地址为LOC(a10)=0x0012ff64。由于0x0012ff64是一个地址编号,我们可以通过地址编号在内存中快速找到目的地址,而不是。。。从数组第一个元素依次向后快速偏移元素空间得到的。

所以对于顺序表,我们只要知道第一个元素的位置,通过相对于初始位置的偏移量(目的元素的位序或数组下标计算得来)和公式计算出目的元素的地址编号,就可以马上找到任何一个目的地址的位置,不用访问前N-1个元素。

注意顺序表既可以随机存取,也可以顺序存取(比如说找某个值在数组中的下标就只能顺序存取)。

链表的顺序存取

我们再看链表,由于链表中的每个结点散落在内存中的任意位置,不是连续存储,因此我们需要额外存储指针。即链表中当前结点的位置是由其前驱结点中的地址信息所指示的,而不是由相对于初始位置的偏移量来确定。

所以对于链表,如果想访问第i个元素,就必须从第一个元素开始,依次走过前i-1个元素才能来到目的元素的位置,而不能直接找出目的元素的位置。这就是顺序存取。

  • 25
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aspect of Twilight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值