Replace ":" with "。"

This commit is contained in:
krahets
2023-08-27 22:49:47 +08:00
parent 71692af8c4
commit c5a7323817
47 changed files with 159 additions and 165 deletions
+4 -4
View File
@@ -359,7 +359,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex
[class]{}-[func]{remove}
```
总的来看,数组的插入与删除操作有以下缺点
总的来看,数组的插入与删除操作有以下缺点
- **时间复杂度高**:数组的插入和删除的平均时间复杂度均为 $O(n)$ ,其中 $n$ 为数组长度。
- **丢失元素**:由于数组的长度不可变,因此在插入元素后,超出数组长度范围的元素会丢失。
@@ -599,13 +599,13 @@ elementAddr = firtstElementAddr + elementLength * elementIndex
## 数组优点与局限性
数组存储在连续的内存空间内,且元素类型相同。这包含丰富的先验信息,系统可以利用这些信息来优化操作和运行效率,包括:
数组存储在连续的内存空间内,且元素类型相同。这种做法包含丰富的先验信息,系统可以利用这些信息来优化数据结构的操作效率。
- **空间效率高**: 数组为数据分配了连续的内存块,无须额外的结构开销。
- **支持随机访问**: 数组允许在 $O(1)$ 时间内访问任何元素。
- **缓存局部性**: 当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓存来提升后续操作的执行速度。
连续空间存储是一把双刃剑,它导致的缺点有:
连续空间存储是一把双刃剑,其存在以下缺点。
- **插入与删除效率低**:当数组中元素较多时,插入与删除操作需要移动大量的元素。
- **长度不可变**: 数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。
@@ -613,7 +613,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex
## 数组典型应用
数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构,主要包括:
数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构
- **随机访问**:如果我们想要随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实现样本的随机抽取。
- **排序和搜索**:数组是排序和搜索算法最常用的数据结构。快速排序、归并排序、二分查找等都主要在数组上进行。
+1 -1
View File
@@ -854,7 +854,7 @@
许多编程语言都提供内置的列表,例如 Java, C++, Python 等。它们的实现比较复杂,各个参数的设定也非常有考究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。
为了帮助你理解列表工作原理,我们在此提供一个简易版列表实现,重点包括:
为了加深对列表工作原理的理解,我们尝试实现一个简易版列表,包括以下三个重点设计。
- **初始容量**:选取一个合理的数组初始容量。在本示例中,我们选择 10 作为初始容量。
- **数量记录**:声明一个变量 size,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据此变量,我们可以定位列表尾部,以及判断是否需要扩容。
+4 -4
View File
@@ -38,7 +38,7 @@
!!! question "图片“链表定义与存储方式”中,浅蓝色的存储结点指针是占用一块内存地址吗?还是和结点值各占一半呢?"
文中只是一个示意图只是定性表示定量的话需要根据具体情况分析
文中示意图只是定性表示定量表示需要根据具体情况进行分析
- 不同类型的结点值占用的空间是不同的,比如 int, long, double, 或者是类的实例等等。
- 指针变量占用的内存空间大小根据所使用的操作系统及编译环境而定,大多为 8 字节或 4 字节。
@@ -59,9 +59,9 @@
!!! question "C++ STL 里面的 std::list 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?"
一方面,我们往往更青睐使用数组实现算法,而只有在必要时才使用链表。这是因为:
一方面,我们往往更青睐使用数组实现算法,而只有在必要时才使用链表,主要有两个原因
1. 空间开销:由于每个元素需要两个额外的指针(一个用于前一个元素,一个用于后一个元素),所以 `std::list` 通常比 `std::vector` 更占用空间。
2. 缓存不友好:由于数据不是连续存放的,`std::list` 对缓存的利用率较低。一般情况下,`std::vector` 的性能会更好。
- 空间开销:由于每个元素需要两个额外的指针(一个用于前一个元素,一个用于后一个元素),所以 `std::list` 通常比 `std::vector` 更占用空间。
- 缓存不友好:由于数据不是连续存放的,`std::list` 对缓存的利用率较低。一般情况下,`std::vector` 的性能会更好。
另一方面,必要使用链表的情况主要是二叉树和图。栈和队列往往会使用编程语言提供的 `stack` 和 `queue` ,而非链表。