This commit is contained in:
krahets
2024-04-03 04:41:27 +08:00
parent 20f79f5f32
commit 8591529021
47 changed files with 136 additions and 135 deletions

View File

@ -4,7 +4,7 @@ comments: true
# 4.1   数组
数组 array是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的索引 index。图 4-1 展示了数组的主要概念和存储方式。
<u>数组array</u>是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的<u>索引index</u>。图 4-1 展示了数组的主要概念和存储方式。
![数组定义与存储方式](array.assets/array_definition.png){ class="animation-figure" }

View File

@ -6,7 +6,7 @@ comments: true
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。
链表 linked list是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。
<u>链表linked list</u>是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。
链表的设计使得各个节点可以分散存储在内存各处,它们的内存地址无须连续。
@ -14,7 +14,7 @@ comments: true
<p align="center"> 图 4-5 &nbsp; 链表定义与存储方式 </p>
观察图 4-5 ,链表的组成单位是节点 node对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“引用”。
观察图 4-5 ,链表的组成单位是<u>节点node</u>对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“引用”。
- 链表的首个节点被称为“头节点”,最后一个节点被称为“尾节点”。
- 尾节点指向的是“空”,它在 Java、C++ 和 Python 中分别被记为 `null``nullptr``None`

View File

@ -4,14 +4,14 @@ comments: true
# 4.3 &nbsp; 列表
列表 list是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。
<u>列表list</u>是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。
- 链表天然可以看作一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。
- 数组也支持元素增删查改,但由于其长度不可变,因此只能看作一个具有长度限制的列表。
当使用数组实现列表时,**长度不可变的性质会导致列表的实用性降低**。这是因为我们通常无法事先确定需要存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则会造成内存空间浪费。
为解决此问题,我们可以使用动态数组 dynamic array来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。
为解决此问题,我们可以使用<u>动态数组dynamic array</u>来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。
实际上,**许多编程语言中的标准库提供的列表是基于动态数组实现的**,例如 Python 中的 `list` 、Java 中的 `ArrayList` 、C++ 中的 `vector` 和 C# 中的 `List` 等。在接下来的讨论中,我们将把“列表”和“动态数组”视为等同的概念。

View File

@ -11,7 +11,7 @@ status: new
## 4.4.1 &nbsp; 计算机存储设备
计算机中包括三种类型的存储设备:硬盘 hard disk」、「内存 random-access memory, RAM」、「缓存 cache memory。表 4-2 展示了它们在计算机系统中的不同角色和性能特点。
计算机中包括三种类型的存储设备:<u>硬盘hard disk</u><u>内存random-access memory, RAM</u><u>缓存cache memory</u>。表 4-2 展示了它们在计算机系统中的不同角色和性能特点。
<p align="center"> 表 4-2 &nbsp; 计算机的存储设备 </p>
@ -58,9 +58,9 @@ status: new
## 4.4.3 &nbsp; 数据结构的缓存效率
缓存虽然在空间容量上远小于内存,但它比内存快得多,在程序执行速度上起着至关重要的作用。由于缓存的容量有限,只能存储一小部分频繁访问的数据,因此当 CPU 尝试访问的数据不在缓存中时,就会发生缓存未命中 cache miss,此时 CPU 不得不从速度较慢的内存中加载所需数据。
缓存虽然在空间容量上远小于内存,但它比内存快得多,在程序执行速度上起着至关重要的作用。由于缓存的容量有限,只能存储一小部分频繁访问的数据,因此当 CPU 尝试访问的数据不在缓存中时,就会发生<u>缓存未命中cache miss</u>,此时 CPU 不得不从速度较慢的内存中加载所需数据。
显然,**“缓存未命中”越少CPU 读写数据的效率就越高**,程序性能也就越好。我们将 CPU 从缓存中成功获取数据的比例称为缓存命中率 cache hit rate,这个指标通常用来衡量缓存效率。
显然,**“缓存未命中”越少CPU 读写数据的效率就越高**,程序性能也就越好。我们将 CPU 从缓存中成功获取数据的比例称为<u>缓存命中率cache hit rate</u>,这个指标通常用来衡量缓存效率。
为了尽可能达到更高的效率,缓存会采取以下数据加载机制。