2023-02-08 15:20:18 +08:00
|
|
|
|
---
|
|
|
|
|
comments: true
|
|
|
|
|
---
|
|
|
|
|
|
2023-02-24 18:45:27 +08:00
|
|
|
|
# 4.4. 小结
|
2023-02-08 15:20:18 +08:00
|
|
|
|
|
|
|
|
|
- 数组和链表是两种基本数据结构,代表了数据在计算机内存中的两种存储方式,即连续空间存储和离散空间存储。两者的优点与缺点呈现出此消彼长的关系。
|
|
|
|
|
- 数组支持随机访问、内存空间占用小;但插入与删除元素效率低,且初始化后长度不可变。
|
|
|
|
|
- 链表可通过更改指针实现高效的结点插入与删除,并且可以灵活地修改长度;但结点访问效率低、占用内存多。常见的链表类型有单向链表、循环链表、双向链表。
|
|
|
|
|
- 列表又称动态数组,是基于数组实现的一种数据结构,其保存了数组的优势,且可以灵活改变长度。列表的出现大大提升了数组的实用性,但副作用是会造成部分内存空间浪费。
|
2023-02-26 22:45:39 +08:00
|
|
|
|
- 下表总结对比了数组与链表的各项特性。
|
2023-02-08 15:20:18 +08:00
|
|
|
|
|
|
|
|
|
<div class="center-table" markdown>
|
|
|
|
|
|
|
|
|
|
| | 数组 | 链表 |
|
|
|
|
|
| ------------ | ------------------------ | ------------ |
|
|
|
|
|
| 存储方式 | 连续内存空间 | 离散内存空间 |
|
|
|
|
|
| 数据结构长度 | 长度不可变 | 长度可变 |
|
|
|
|
|
| 内存使用率 | 占用内存少、缓存局部性好 | 占用内存多 |
|
|
|
|
|
| 优势操作 | 随机访问 | 插入、删除 |
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
2023-02-26 22:45:39 +08:00
|
|
|
|
!!! question "缓存局部性的简单解释"
|
|
|
|
|
|
|
|
|
|
在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。
|
2023-02-08 15:20:18 +08:00
|
|
|
|
|
2023-02-26 22:45:39 +08:00
|
|
|
|
- 下表对比了数组与链表的各种操作效率。
|
2023-02-08 15:20:18 +08:00
|
|
|
|
|
|
|
|
|
<div class="center-table" markdown>
|
|
|
|
|
|
|
|
|
|
| 操作 | 数组 | 链表 |
|
|
|
|
|
| ------- | ------ | ------ |
|
|
|
|
|
| 访问元素 | $O(1)$ | $O(N)$ |
|
|
|
|
|
| 添加元素 | $O(N)$ | $O(1)$ |
|
|
|
|
|
| 删除元素 | $O(N)$ | $O(1)$ |
|
|
|
|
|
|
|
|
|
|
</div>
|