mirror of
https://github.com/krahets/hello-algo.git
synced 2025-07-24 18:55:36 +08:00
build
This commit is contained in:
@ -4,7 +4,7 @@ comments: true
|
||||
|
||||
# 4.1 数组
|
||||
|
||||
「数组 array」是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的「索引 index」。图 4-1 展示了数组的主要概念和存储方式。
|
||||
<u>数组(array)</u>是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的<u>索引(index)</u>。图 4-1 展示了数组的主要概念和存储方式。
|
||||
|
||||
{ class="animation-figure" }
|
||||
|
||||
|
@ -6,7 +6,7 @@ comments: true
|
||||
|
||||
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。
|
||||
|
||||
「链表 linked list」是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。
|
||||
<u>链表(linked list)</u>是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。
|
||||
|
||||
链表的设计使得各个节点可以分散存储在内存各处,它们的内存地址无须连续。
|
||||
|
||||
@ -14,7 +14,7 @@ comments: true
|
||||
|
||||
<p align="center"> 图 4-5 链表定义与存储方式 </p>
|
||||
|
||||
观察图 4-5 ,链表的组成单位是「节点 node」对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“引用”。
|
||||
观察图 4-5 ,链表的组成单位是<u>节点(node)</u>对象。每个节点都包含两项数据:节点的“值”和指向下一节点的“引用”。
|
||||
|
||||
- 链表的首个节点被称为“头节点”,最后一个节点被称为“尾节点”。
|
||||
- 尾节点指向的是“空”,它在 Java、C++ 和 Python 中分别被记为 `null`、`nullptr` 和 `None` 。
|
||||
|
@ -4,14 +4,14 @@ comments: true
|
||||
|
||||
# 4.3 列表
|
||||
|
||||
「列表 list」是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。
|
||||
<u>列表(list)</u>是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。
|
||||
|
||||
- 链表天然可以看作一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。
|
||||
- 数组也支持元素增删查改,但由于其长度不可变,因此只能看作一个具有长度限制的列表。
|
||||
|
||||
当使用数组实现列表时,**长度不可变的性质会导致列表的实用性降低**。这是因为我们通常无法事先确定需要存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则会造成内存空间浪费。
|
||||
|
||||
为解决此问题,我们可以使用「动态数组 dynamic array」来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。
|
||||
为解决此问题,我们可以使用<u>动态数组(dynamic array)</u>来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。
|
||||
|
||||
实际上,**许多编程语言中的标准库提供的列表是基于动态数组实现的**,例如 Python 中的 `list` 、Java 中的 `ArrayList` 、C++ 中的 `vector` 和 C# 中的 `List` 等。在接下来的讨论中,我们将把“列表”和“动态数组”视为等同的概念。
|
||||
|
||||
|
@ -11,7 +11,7 @@ status: new
|
||||
|
||||
## 4.4.1 计算机存储设备
|
||||
|
||||
计算机中包括三种类型的存储设备:「硬盘 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 计算机的存储设备 </p>
|
||||
|
||||
@ -58,9 +58,9 @@ status: new
|
||||
|
||||
## 4.4.3 数据结构的缓存效率
|
||||
|
||||
缓存虽然在空间容量上远小于内存,但它比内存快得多,在程序执行速度上起着至关重要的作用。由于缓存的容量有限,只能存储一小部分频繁访问的数据,因此当 CPU 尝试访问的数据不在缓存中时,就会发生「缓存未命中 cache miss」,此时 CPU 不得不从速度较慢的内存中加载所需数据。
|
||||
缓存虽然在空间容量上远小于内存,但它比内存快得多,在程序执行速度上起着至关重要的作用。由于缓存的容量有限,只能存储一小部分频繁访问的数据,因此当 CPU 尝试访问的数据不在缓存中时,就会发生<u>缓存未命中(cache miss)</u>,此时 CPU 不得不从速度较慢的内存中加载所需数据。
|
||||
|
||||
显然,**“缓存未命中”越少,CPU 读写数据的效率就越高**,程序性能也就越好。我们将 CPU 从缓存中成功获取数据的比例称为「缓存命中率 cache hit rate」,这个指标通常用来衡量缓存效率。
|
||||
显然,**“缓存未命中”越少,CPU 读写数据的效率就越高**,程序性能也就越好。我们将 CPU 从缓存中成功获取数据的比例称为<u>缓存命中率(cache hit rate)</u>,这个指标通常用来衡量缓存效率。
|
||||
|
||||
为了尽可能达到更高的效率,缓存会采取以下数据加载机制。
|
||||
|
||||
|
Reference in New Issue
Block a user