数据结构之线性数据结构(一维数据结构)

234 阅读2分钟

线性数据结构的特性: 线性数据结构强调存储与顺序。

线性数据结构常见的有两种: 数组、链表(本文章讲解的都是单链表)。

image.png

image.png

一、数组的特性:

(1)数组在物理上的存储空间是连续的。

(2)底层数组的长度是不可变的。

之所以可以新增和修改数组里面的内容,是因为数组会有自动扩容的机制。
当数组数据的长度大于底层数组本身的长度时,会给数组分配一定长度的空间。

例子:
let arr = new Array(8);
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
> 这里由于array的长度大于初始化时所给出的长度,就会给数组分配一定长度的空间,这个过程就叫做扩容。

(3)数组的变量指向了数组的第一个元素的位置。

let arr = [1,2,3,4,5,6,7,8,9]
> arr指向数组的第一个元素的位置

优点: 在查询指定的位置,查询性能好(正是因为数组的存储空间是连续的)。

let arr = [1,2,3,4,5,6,7,8,9]
arr[存储地址偏移量] -> arr[1]、arr[2]...
> 通过偏移查询数据性能最好

缺点:

(1)如果数组较大、空间碎片较多的时候,容易存不下。

image.png

> 由于空间碎片的存在,所以会导致50K的内存存不下20K的数据。

(2)因为数组是固定的,所以数组内容难以被添加和删除。

(3)由于数组的存储空间是连续的,所以操作系统会去除空间碎片,使得空间碎片后面的数据的下标都往前移,但正是因为这样,很是消耗性能。

二、链表的特性:

(1)空间上不是连续的。

(2)每存放一个值都需要开销一个引用空间。

image.png (3)链表的添加和删除都非常的容易。

image.png

image.png

优点: 只要内存足够大,就能存得下,不用担心空间碎片的问题。

缺点:

(1)查询速度慢(需要从根节点出发根据引用依次查询)。

(2)每一个节点都需要创建一个next的引用,浪费一些空间,但是如果数据节点数量很多的时候,这部分的多开销影响越少,因为一个链表浪费的next引用是固定的(只有最后一个节点的引用指向null)。

image.png

补充:

(1)image.png

(2) 每一个节点可以看成一个根节点(拆分出来看)。