【计算机科学】数据结构——绪论


数据结构绪论

数据结构是计算机科学中最重要也是最基础的一门学科,当我们考虑计算机中数据的存储方式的时候,都需要使用数据结构。该门课程将由浅入深的详细讲解数据结构的原理和运用。

什么是数据结构

数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。直白地说,就是研究数据的存储方式。

首先,既然是研究数据的存储方式,我们就要知道,数据在内存或者硬盘空间中,绝不是随意胡乱的存储,一定是有一套遵循的原则的。数据结构就是寻找一个合理的存储方式去存储我们的数据。

例如我们需要存储形如 “1,“Hello World”,2.3” 等类型的数据,我们可以使用int,string,double等数据类型进行存储,倘若需要存储一份家族图谱,如下图所示:

我们不仅仅需要存储各个成员的基础属性,还需要存储数据之间的关系。我们尽可以使用数组去存储这些数据,但是就无法体现数据之间的关系了。此时我们的基础数据类型就无法实现这些功能了。

按着我个人的理解,学习数据结构就是学习在日后开发的过程中选择更优的方式存储数据,使得后期对数据的再利用时更加方便高效。

几种常见的简单数据结构

为了给读者留下一个基本的印象,这里对几种基础的数据结构作一个简单的介绍。

两种简单线性表

线性表常用于处理一对一的关系,简单的理解就是所有数据用一根“绳子”串在一起。

例如下图就是线性表中的顺序表的结构图

下图为单链表

我们可以很轻松的发现,单链表的数据存储并不是连续的,而是通过指针作为绳子串在一起。

栈是一种需要符合特定规则的数据结构,也就是FILO规则(先进后出)。就类似我们的水桶一样,我们往桶里依次叠放我们的物品,当我们需要取出里面的数据的时候,就需要从顶部开始向下取,也就是先放进去的反而是最后取出的。

队列

队列和栈恰恰相反,队列就和我们朴素理解的队伍是一个性质,队列更像是一个管道,遵循FIFO规则(先入先出),在管道中塞入物品,最先进入管道的最先从管道另一侧出来。

以上介绍的几种数据都是线性存储方式,适合处理一对一关系,倘若如前文所述,我们需要存储一份家族图谱,那么,我们就需要使用树进行处理。树是一种一对多关系的非线性存储关系。对于树而言,有父节点和子节点之分,如下图所示:

图结构常常用于处理多对多的关系,例如我们常常使用的地图软件就经常使用图结构进行存储,存储各个地点之间的对应关系和里程等等。图结构又常分为有向图和无向图,具体如下图所示。

无向图就是没有指明节点路径方向的,有一些类似我们的没有划分分界线的道路,你怎么走都行,如图:

有向图就像是指定了方向的道路,你需要按着路线的方向走,这个图中有一些小瑕疵,有向图一般有入度和出度,这里没有体现。

逻辑结构和物理结构

一组数据成功存储到计算机的衡量标准是要能将其完整的复原。例如图或树,如果所存储的数据能将此成员关系图彻底复原,则说明数据存储成功。我们知道,数据结构分为物理结构和逻辑结构组成,这里我们对两种都做一个简单的描述讲解。

逻辑结构

简单地理解,就是指的数据之间的逻辑关系。假设我们要存储一棵树、图等,数据之间的逻辑关系是必不可缺。

逻辑结构大体可分为以下几种:

  • 一对一:每个数据的左侧有且仅有一个数据与其相邻(除0外);同样,每个数据的右侧也只有一个数据与其相邻(除n外),所有的数据都是如此,就说数据之间是“一对一”的逻辑关系;
  • 一对多:类似于树结构,每一个节点都可以对应多个节点
  • 多对多:形如上述的图结构,每一个节点之间都可能有多条路径前往。

一般而言,线性结构适用于存储一对一关系的存储,树结构适用一对多关系的存储,图结构适用多对多关系的存储。但是在选择链式离散存储方式或是集中存储方式则需要通过物理结构进行分析。

物理结构

数据的存储结构,也就是物理结构,指的是数据在物理存储空间上选择集中存放还是分散存放。如果选择集中存储,就使用顺序存储结构;反之,就使用链式存储。至于如何选择,主要取决于存储设备的状态以及数据的用途。

我们知道,集中存储(底层实现使用的是数组)需要使用一大块连续的物理空间,假设要存储大小为 1G 的数据,若存储设备上没有整块大小超过 1G
的空间,就无法使用顺序存储,此时就要选择链式存储,因为链式存储是随机存储数据,占用的都是存储设备中比较小的存储空间,因此有一定几率
可以存储成功。

举一个简单的例子,假如说有一个3L的水壶和一个4L的水壶需要装6L的水,集中存储就像是你存在执念,你非要将所有的水装在同一个水壶,显然这是不能实现的,但是当你分散在两个水壶时,就成功了。这和我们物理结构的方式是一样的。

并且,数据的用途不同,选择的存储结构也不同。将数据进行集中存储有利于后期对数据进行遍历操作,而分散存储更有利于后期增加或删除数据。
因此,如果后期需要对数据进行大量的检索(遍历),就选择集中存储;反之,若后期需要对数据做进一步更新(增加或删除),则选择分散存储。

下图为集中存储

下图为离散存储

Reference & Contact

《数据结构》

我的BiliBili:SteveEco

本节内容对应视频教程:数据结构

我的博客园:WarrenRyan

我的GitHub:StevenEco