This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions

View File

@@ -2,7 +2,7 @@
comments: true
---
# 4.1.   数组
# 4.1   数组
「数组 Array」是一种线性数据结构其将相同类型元素存储在连续的内存空间中。我们将某个元素在数组中的位置称为该元素的「索引 Index」。
@@ -10,7 +10,7 @@ comments: true
<p align="center"> 图:数组定义与存储方式 </p>
## 4.1.1. &nbsp; 数组常用操作
## 4.1.1 &nbsp; 数组常用操作
### 初始化数组
@@ -1204,7 +1204,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex
}
```
## 4.1.2. &nbsp; 数组优点与局限性
## 4.1.2 &nbsp; 数组优点与局限性
数组存储在连续的内存空间内,且元素类型相同。这包含丰富的先验信息,系统可以利用这些信息来优化操作和运行效率,包括:
@@ -1218,7 +1218,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex
- **长度不可变**: 数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。
- **空间浪费**: 如果数组分配的大小超过了实际所需,那么多余的空间就被浪费了。
## 4.1.3. &nbsp; 数组典型应用
## 4.1.3 &nbsp; 数组典型应用
数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构,主要包括:

View File

@@ -3,7 +3,7 @@ comments: true
icon: material/view-list-outline
---
# 4. &nbsp; 数组与链表
# 第 4 章 &nbsp; 数组与链表
<div class="center-table" markdown>

View File

@@ -2,7 +2,7 @@
comments: true
---
# 4.2. &nbsp; 链表
# 4.2 &nbsp; 链表
内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。此时链表的灵活性优势就体现出来了。
@@ -188,7 +188,7 @@ comments: true
}
```
## 4.2.1. &nbsp; 链表常用操作
## 4.2.1 &nbsp; 链表常用操作
### 初始化链表
@@ -1098,7 +1098,7 @@ comments: true
}
```
## 4.2.2. &nbsp; 数组 VS 链表
## 4.2.2 &nbsp; 数组 VS 链表
下表总结对比了数组和链表的各项特点与操作效率。由于它们采用两种相反的存储策略,因此各种性质和操作效率也呈现对立的特点。
@@ -1118,7 +1118,7 @@ comments: true
</div>
## 4.2.3. &nbsp; 常见链表类型
## 4.2.3 &nbsp; 常见链表类型
**单向链表**。即上述介绍的普通链表。单向链表的节点包含值和指向下一节点的引用两项数据。我们将首个节点称为头节点,将最后一个节点成为尾节点,尾节点指向空 $\text{None}$ 。
@@ -1327,7 +1327,7 @@ comments: true
<p align="center"> 图:常见链表种类 </p>
## 4.2.4. &nbsp; 链表典型应用
## 4.2.4 &nbsp; 链表典型应用
单向链表通常用于实现栈、队列、散列表和图等数据结构。

View File

@@ -2,13 +2,13 @@
comments: true
---
# 4.3. &nbsp; 列表
# 4.3 &nbsp; 列表
**数组长度不可变导致实用性降低**。在实际中,我们可能事先无法确定需要存储多少数据,这使数组长度的选择变得困难。若长度过小,需要在持续添加数据时频繁扩容数组;若长度过大,则会造成内存空间的浪费。
为解决此问题,出现了一种被称为「动态数组 Dynamic Array」的数据结构即长度可变的数组也常被称为「列表 List」。列表基于数组实现继承了数组的优点并且可以在程序运行过程中动态扩容。我们可以在列表中自由地添加元素而无需担心超过容量限制。
## 4.3.1. &nbsp; 列表常用操作
## 4.3.1 &nbsp; 列表常用操作
### 初始化列表
@@ -854,7 +854,7 @@ comments: true
list.sort(); // 排序后,列表元素从小到大排列
```
## 4.3.2. &nbsp; 列表实现
## 4.3.2 &nbsp; 列表实现
许多编程语言都提供内置的列表,例如 Java, C++, Python 等。它们的实现比较复杂,各个参数的设定也非常有考究,例如初始容量、扩容倍数等。感兴趣的读者可以查阅源码进行学习。

View File

@@ -2,14 +2,14 @@
comments: true
---
# 4.4. &nbsp; 小结
# 4.4 &nbsp; 小结
- 数组和链表是两种基本的数据结构,分别代表数据在计算机内存中的两种存储方式:连续空间存储和离散空间存储。两者的特点呈现出互补的特性。
- 数组支持随机访问、占用内存较少;但插入和删除元素效率低,且初始化后长度不可变。
- 链表通过更改引用(指针)实现高效的节点插入与删除,且可以灵活调整长度;但节点访问效率低、占用内存较多。常见的链表类型包括单向链表、循环链表、双向链表。
- 动态数组,又称列表,是基于数组实现的一种数据结构。它保留了数组的优势,同时可以灵活调整长度。列表的出现极大地提高了数组的易用性,但可能导致部分内存空间浪费。
## 4.4.1. &nbsp; Q & A
## 4.4.1 &nbsp; Q & A
!!! question "数组存储在栈上和存储在堆上,对时间效率和空间效率是否有影响?"