在介绍具体的数据结构之前,有两个我认为区分两个重要的概念(数据结构的逻辑分类和数据的存储方式分类)是关键的,前者有利用能让我们对同一逻辑形式的数据结构形成相似的认识,比如线性结构的查找;后者,则有助于我们理解抽象数据结构(ADT)和具体实现之间的关系。
数据结构的逻辑分类
根据数据对象中数据元素的之间的相互关系。可以将数据结构进行逻辑分类:
- 集合结构
满足数学概念中的集合概念,每个元素的地位相同,无序,互异。
- 线性结构
线性结构:线性结构中的元素之间存在一对一的关系。比如,数组、链表都是线性结构。
- 树形结构
用来模拟有树状结构的数据,元素之间呈现一对多的层次关系。树 就是来描述这样的一种结构。
- 图形结构
图形结构的元素是多对多的关系。图 就是来描述这样的一种结构。
数据的存储方式
数据结构是一个研究 数据如何存储 的命题。当将数据存储在内存中,计算机需要提供存储空间。如果需要存储多项数据时,有两种 基本 的存储方式:
- 以顺序方式存储
- 以链式方式存储
顺序存储
顺序存储,也就是以 数组 的方式进行存储:将数据存储在物理位置上相邻的存储节点。
链式存储
若以 链表 方式进行存储的数据,无需申请一整块连续的数据存储节点,而是每个元素存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
「数组」和「链表」是更基础的数据结构
在算法和数据结构的描述中,「数组」和「链表」有着更为底层的概念:
-
是一种抽象的数据结构: 比如,数组描述了 一个有固定内存空间,数据存储在相邻物理位置上的 的这样一种线性结构;而链表描述的是 数据分散存储于物理内存 的这样一种线性结构。
-
是一种 基础数据结构类型 其他的抽象数据结构的实现上,或多或少使用数组或链表两种数据结构。
理解数据在内存的存储方式非常重要 除数组和链表这两种基础的数据结构意外,其他类型的数据结构的实现大多可以使用这两种存储方式。这有益于警告我们,当我们在学习数据结构实现时,并非只有实现方式,而是可能同时存在数组和链表两种实现方式。而大多数介绍数据结构的书本中,都会直接选择最佳的那种实现方式。
Q: 开头我们说到,抽象数据结构(ADT)与其实现是需要分开来理解的内容,那什么又是抽象数据结构呢?这一问题,我们会在下一章,即 学习 JavaScript 数据结构 - 什么是抽象数据结构 给大家解答。
Q: 请问,JavaScript 中的 Array 和我们常说的、以顺序方式存储的数组含义一致吗?这个问题,会在下下一章,即 学习 JavaScript 数据结构 - 列表 给大家解答。
Yoo, I'm nazha(那吒),和我交流: