数据结构与算法系列——数组和链表
数组的介绍
在每一种编程语言种,基本都有数组这种数据类型,当然它不仅是一种数据类型,还是一种基础、简单的数据结构。
数组的定义是:数组是一种线性表数据结构,他用一组连续的内存空间,来储存一组相同类型的数据
数组的特点
数组是一种线性表,线性表就是数据像一条线一样,排列成一条有序的队,每个数据只有前和后两个方向。数组在内存中的储存是连续的,声明数组的时候会在内存中找一块连续的空间,来依次储存数组的每个数据。数组需要预留储存空间,在使用前需要先申请内存的大小,很有可能会浪费空间。数组随机访问效率高,因为在内存中是连续的,所以可以直接访问该地址的数据。但是数组因为连续这一特点使得它的的插入和删除效率低,因为需要把插入和删除位置后边的所有数据后挪或者前移。数组不利于动态扩展,数组一旦定义,长度是固定的,扩展起来比较麻烦,需要重新定义数组。
数组的优点
- 随机访问性高
- 查找速度快
数组的缺点
- 插入和删除效率低
- 不易于扩展
- 对内存要求高,需要连续的空间
- 有可能造成内存的浪费
链表的介绍
链表也是一种基本的数据结构,它有一系列节点组成,每个节点包括一个数据结构(用来存放各类型的数据),还包括一个指向下一个节点的指针。
链表的特点
链表和数组一样也是线性表,但是链表在内存中的储存是非连续、非顺序的。每一个数据都保存了一个指针,指向下一个数据的内存地址,这样通过这个指针就可以找到下一个数据,也正是因为是非连续的,所以随机访问和数据的查找比较麻烦,每次都要从头开始依次向后直到找到目标数据为止。但是插入和删除操作比较容易,因为不是连续有序的,所以插入的时候,只需要把前一个数据的指针指向新数据,然后新数据的指针指向后一个数据就可以了,删除的时候只需要把后一个数据告诉前一个数据就可以了,其他的数据都不需要做修改。链表还支持动态扩展,可以随意增加和删除数据。
链表的优点
- 插入、删除速度快
- 内存利用率高,不浪费
- 易于扩展
链表的缺点
- 不能随机访问,查找效率低
最后我们用前边学习的时间复杂度来分析数组和链表的操作
\ | 数组 | 链表 |
---|---|---|
读取 | O(1) | O(n) |
插入 | O(n) | O(1) |
删除 | O(n) | O(1) |
总结
对于已知大小,并且对数据操作读取较多,插入、删除较少,可以直接用数组。由于链表在有时候不能直接储存基本数据类型,所以性能会有一点点的损耗。
我们在平时业务逻辑的时候可以直接使用像链表这种容器类,虽然有一点点性能损耗,但影响很小。但如果做底层的开发,对性能要求比较高的时候,直接用数组更为合适。
欢迎关注公众号:「努力给自己看」
![](https://img.haomeiwen.com/i944288/610ecd78a90d550c.jpg)