• 1

  • 1

  • 收藏

从头开始学习->java数据结构(一):物理上的存储结构

2个月前

前言

我们都知道,所谓的数据结构,都是我们在为了更好的对数据的增删改查而创造出来的对数据的结构设计,但是我们要知道的是,这些数据结构都是抽象的逻辑结构,并不是真实的物理上的存储结构,大部分时候,我们对数据结构的讨论,也都是讨论的是逻辑上的数据结构,并不是对真实的存储在硬盘中的数据的存储结构的讨论。

真实的物理上的数据,存储到我们的硬盘上的或者是在内存上的时候,都是有着确切的存储结构的,而不是我们想象中的类似b树,二叉树这种抽象的逻辑结构。

那么,在我们的硬盘上,数据是如何存储的呢?这个问题,是我们去研究逻辑上的数据结构之前,需要搞清楚的问题,也是我们本篇文章的主题。

正文

物理存储结构,是数据的逻辑结构在计算机中的存储形式。

但是在理解物理上的数据存储结构之前,我们要先对硬盘有一个足够的了解。

硬盘是一个实际存在的物品,那么也就是说,这个硬盘不可能如我们想象出的逻辑设计那样,去存储我们的数据。想象一下,如果存一百万条数据,我们在硬盘中随意存储,不按照客观的物理规则来存储,那么我们会发现,硬盘的空间会被很大的浪费掉。

也因此,在硬盘中存储数据的时候,我们必须按照一定的客观规律来。而这种客观规律,在计算机发展的过程中,逐渐形成了现在比较常见的两种规律。

1.顺序存储结构

顺序存储结构,是将我们逻辑上的数据结构中相邻的数据,在物理位置上,也存储在相邻的位置。数据结构中的节点关系由存储单元的邻接关系来体现。

也就是说,数据间的逻辑关系和物理关系是一致的。

一般来说,在我们java语言中,描述这种物理存储结构的话,都是借助我们的 数组 来阐述的。如图所示:

这种存储结构,还是很好理解的,说白了,就是排队而已,每一条数据都是占一小段空间,按照顺序站好,占据着连续的存储空间。

1.1 优点

顺序存储结构的优点还是比较明显的,由于是按照物理上的存储空间的顺序存储数据,那么对存储空间的利用率就会非常高,存储密度比较大。

而且因为是顺序存储数据,那么也就是说,我们的数据,存储在这里的时候,天然在硬盘中的平均寻道时间中,就会快很多。

那么,什么是寻道时间呢? 先看一张关于磁盘的图片,如下:

我们发现,这种传统的硬盘,数据是存储到磁盘中的磁道(磁盘盘片)中,通过磁头(读写磁头)来查找数据。而平均寻道时间就是指磁头移动到数据所在的磁道所使用的时间的平均值。

如果硬盘的寻道速度变快,那么就意味着我们的查找数据能力也在变快。

而在我们的顺序存储结构中,我们的数据是按照磁道的轮转顺序存储到磁道上的,也就是说,当我们进行数据查找的时候,会更快的定位到实际的数据所在,这也就是意味着我们的数据查找速度变快。

小知识;

在现代的计算机进化过程中,数据的存储有了很大的变化,比如说我们现在比较常见的固态硬盘,由于SSD固态硬盘没有磁头,所以几乎不存在寻道时间这一概念,当系统发出指令时,不需要磁头和盘片,而是直接从Flash颗粒上读取,相对传统的机械硬盘的寻道时间来说要快多了。

顺序存储结构的优点总结如下:

  1. 数据存储密度大,存储空间的利用率要大。
  2. 查找速度比较快。

1.2 缺点

首先我们知道的是,顺序存储结构,存储的数据,在存储空间中,是连续的,如下图所示;

那么当我们要插入一条数据的时候,会怎么样呢?如图所示:

从图所示的插入过程中,我们发现,自插入位置起,后面的所有数据元素都往后面移动了一位,想一想,如果数据量上去了,那么等于大量的数据都要移动,而且实际的情况,远远比这个更糟糕,所以这样的插入效率,可想而知。

而删除的过程,虽然和插入恰恰相反,但是造成的后果,都是一样的,都是会导致大量的数据移动位置。

也因此,我们知道的是,顺序存储结构的缺点,就是在插入或者是删除的时候,效率会比较低。

2. 链式存储结构

在实际的数据操作过程中,有的数据结构需要的是查找的时候速度快一点,那么我们的顺序存储结构是符合这种需求的,但是也有很多时候,我们的数据会被多次删除也会被多次的插入,这就引发了一个问题,顺序存储结构不能满足这种需求场景,于是就出现了链式存储结构。

链式存储结构是将数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。

也就是说,在链式存储结构中,数据是可以放到这个存储空间的任意位置,也因此,数据与数据之间物理位置的关系,不能表达出数据之间的逻辑关系。

那么,要如何解决这种逻辑关系呢?

于是在链式存储结构中,会将一个数据单元,分为两个区域,一个数据域,一个指针域。

数据域存储的就是我们实际的数据,而指针域则存储的是关联的其他数据的位置的指针,如果要通过链式存储结构存储数据 [A , B , C , D , E] ,存储的大概模型如图所示:

在这张图的基础上,经过转变后,将图变为如下的样子: 这样可以看的出来,指针域指向了下一个数据节点,也就是说,在连式存储结构中,数据之间的关系,是通过指针域的指向关系来表现的,和数据实际存储的位置没有关系。

2.1 优点

链式存储结构的优点是很好理解的,先看链式存储结构的插入图:

由于链式存储结构中,数据的关系不是由数据的实际存储位置表示的,而是由各个数据节点的指针域来表示的,那么也就是说,在数据插入或者删除的时候,不需要将插入数据后面的数据移动,只需要修改一下指针域的指向性就可以了。

也就是说,链式存储结构的插入或者删除元素很方便,比较灵活。而且我们看到的是,链式存储结构不需要连续的内存来存储,也就是说,对碎片型的内存的利用效率还是相对比较高的。

2.2 缺点

在顺序存储结构中,数据的存储就只需要存储这个数据就行。但是在链式存储结构中,数据的存储,除了存储的是这个数据外,还需要存储和这个数据相关的指针域。

这样,就相比于顺序存储结构外,链式存储结构多存储了一部分其他的数据,所以对存储空间的利用率就会降低。

而且要注意的是,链式存储结构,在物理逻辑上讲,因为实际存储的位置不是顺序的,那么读取的时候,效率会比较低。

总结

3.1 顺序存储结构

优点:

  1. 数据存储密度大,存储空间的利用率要大。
  2. 查找速度比较快。

缺点:

  1. 插入或者是删除的时候,效率会比较低

3.2 链式存储结构

优点:

  1. 插入或者删除的时候,效率比较高
  2. 对碎片型的内存利用率高。

缺点:

  1. 额外新增了指针域的数据,对内存的消耗大
  2. 在读取的时候效率比较低。
免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

java

1

相关文章推荐

未登录头像

暂无评论