📌 前言
在计算机专业基础综合(408)的考研复习中,数据结构的基石地位不可动摇。今天将复习时记录的两页核心笔记进行深度数字化整理。
这两页笔记涵盖了高频考点:数组与特殊矩阵的压缩存储 、树的核心概念与五大核心性质 。重点不在于死记硬背公式,而在于建立"现场推导"与"极限状态思维"的解题直觉。
🧱 第一部分:数组的顺序存储与地址计算
1. 基础前置条件
- 默认前提 :在 408 考研及标准 C 语言中,数组下标默认从 0 开始。
- 基本数据类型内存大小:
int------ 4B (字节)double------ 8B (字节)
2. 数组存储地址计算公式
设基地址为 Addr(a0)Addr(a_0)Addr(a0) 或 Addr(a00)Addr(a_{00})Addr(a00),每个数据元素占用 LLL 个存储单元。
① 一维数组
Addr(ai)=Addr(a0)+i×LAddr(a_i) = Addr(a_0) + i \times LAddr(ai)=Addr(a0)+i×L
② 二维 Matrix (m×nm \times nm×n)
对于一个 mmm 行 nnn 列的二维数组,其在物理内存的线性映射有两种经典方式:
| 映射方式 | 核心逻辑 | 物理地址计算公式 |
|---|---|---|
| 行优先 (Row-major) | 先存完一行,再存下一行 | Addr(aij)=Addr(a00)+(i×n+j)×LAddr(a_{ij}) = Addr(a_{00}) + (i \times n + j) \times LAddr(aij)=Addr(a00)+(i×n+j)×L |
| 列优先 (Column-major) | 先存完一列,再存下一列 | Addr(aij)=Addr(a00)+(j×m+i)×LAddr(a_{ij}) = Addr(a_{00}) + (j \times m + i) \times LAddr(aij)=Addr(a00)+(j×m+i)×L |
💡 图解辅助直觉 :
设有笔记中的 2×32 \times 32×3 矩阵:
a00a01a02a10a11a12\]\\begin{bmatrix} a_{00} \& a_{01} \& a_{02} \\\\ a_{10} \& a_{11} \& a_{12} \\end{bmatrix}\[a00a10a01a11a02a12
- 行优先时,a11a_{11}a11 前面有 111 整行(共 333 个元素)和当前行的 111 个元素(a10a_{10}a10),故跨越了 1×3+1=41 \times 3 + 1 = 41×3+1=4 个元素。
🗜️ 第二部分:特殊矩阵的压缩存储(核心痛点)
为了节省空间,常将对称矩阵、三角矩阵等特殊矩阵压缩存入一维数组 B[m]B[m]B[m] 中。
1. 经典例题复盘:对称矩阵 ⇒\Rightarrow⇒ 下三角矩阵
【例题】 设有一个 3×33 \times 33×3 的对称矩阵,只需存储其下三角部分(含主对角线):
145426563\]\\begin{bmatrix} 1 \& 4 \& 5 \\\\ 4 \& 2 \& 6 \\\\ 5 \& 6 \& 3 \\end{bmatrix} 145426563
若按**行优先** 原则,将其压缩存储到一维数组 BBB 中,则对应关系为:
* B\[m\]=(1,4,2,5,6,3)B\[m\] = (1, 4, 2, 5, 6, 3)B\[m\]=(1,4,2,5,6,3)
##### 🔍 元素映射一维数组轨迹分析:
* 第一行:a11→B\[0\]=1a_{11} \\rightarrow B\[0\] = 1a11→B\[0\]=1
* 第二行:a21→B\[1\]=4a_{21} \\rightarrow B\[1\] = 4a21→B\[1\]=4, a22→B\[2\]=2a_{22} \\rightarrow B\[2\] = 2a22→B\[2\]=2
* 第三行:a31→B\[3\]=5a_{31} \\rightarrow B\[3\] = 5a31→B\[3\]=5, a32→B\[4\]=6a_{32} \\rightarrow B\[4\] = 6a32→B\[4\]=6, a33→B\[5\]=3a_{33} \\rightarrow B\[5\] = 3a33→B\[5\]=3
#### 2. 🔥 方法总结:下标变换的"致命陷阱"与现场推导法
408 真题最喜欢在"下标从 0 开始"**还是** "从 1 开始"**上做文章。死记硬背极易翻车,强烈建议采用**"现场代入法"自行推导。
##### 情况 A:矩阵下标从 1 开始,一维数组 BBB 从 0 开始
当 i≥ji \\ge ji≥j(下三角区域)时,aija_{ij}aij 前面有 i−1i-1i−1 行。
* 第 1 行有 1 个元素,第 2 行有 2 个......第 i−1i-1i−1 行有 i−1i-1i−1 个。
* 前 i−1i-1i−1 行总元素个数为:(1+i−1)×(i−1)2=i(i−1)2\\frac{(1 + i - 1) \\times (i - 1)}{2} = \\frac{i(i-1)}{2}2(1+i−1)×(i−1)=2i(i−1)。
* 在当前第 iii 行中,aija_{ij}aij 是第 jjj 个元素。因为数组 BBB 从 0 开始,所以最终下标 mmm 需减 1:
m=i(i−1)2+j−1m = \\frac{i(i-1)}{2} + j - 1m=2i(i−1)+j−1
* **代入验证** :求 a32a_{32}a32 的存储位置。i=3,j=2⇒m=3×22+2−1=4i=3, j=2 \\Rightarrow m = \\frac{3 \\times 2}{2} + 2 - 1 = 4i=3,j=2⇒m=23×2+2−1=4。核对 B\[4\]=6B\[4\] = 6B\[4\]=6,完全正确!
##### 情况 B:矩阵下标从 0 开始,一维数组 BBB 从 0 开始
当 i≥ji \\ge ji≥j 时,前 iii 行(第 0 行到第 i−1i-1i−1 行)共有 1+2+⋯+i=i(i+1)21 + 2 + \\dots + i = \\frac{i(i+1)}{2}1+2+⋯+i=2i(i+1) 个元素。当前行前面有 jjj 个元素。由于都从 0 开始,无需额外减 1:
m=i(i+1)2+jm = \\frac{i(i+1)}{2} + jm=2i(i+1)+j
> **📌 考场防丢分秘籍** :不论题目怎么变,花 30 秒在草稿纸上画一个如上所示的 3×33 \\times 33×3 矩阵,随便带入一个元素(如 a32a_{32}a32 或 a21a_{21}a21)去验证选项公式,直接秒杀选择题!这就是\*\*"请自行推导"\*\*的最高境界。
*** ** * ** ***
### 🌳 第三部分:树的核心概念精准辨析
1. **度与结点**:
* **树的度** :树中所有结点的度的**最大值**。
* **结点的度** :该结点拥有的**子树个数**。
* **叶子结点** :度 =0= 0=0 的结点(终端结点)。
* **分支结点** :度 \>0\> 0\>0 的结点(非终端结点)。
2. **层次、深度与高度**:
* **层次** :从根开始算起,根结点位于**第一层**。
* **结点的深度** :从根结点自顶向下逐层累加(结点的深度 === 它的层次)。
* **树的高度** :从叶子结点自底向上数。整个树的深度 === 高度(最大层次)。
3. **有序树 vs 无序树**:子树的位置是否可以调换(若调换后含义改变则为有序树)。
4. **森林** :所有树的结合(m (m≥0)m \\,(m \\ge 0)m(m≥0) 棵互不相交的树的集合)。
*** ** * ** ***
### 📐 第四部分:kkk 叉树的五大核心性质与解题直觉
这里是考研数学与数据结构交汇的高频命题点,必须烂熟于心。
#### 性质 ①:结点总数与度的关系(全考点通用)
n=度的总和+1(根结点)n = 度的总和 + 1 \\text{(根结点)}n=度的总和+1(根结点)
> **解题直觉** :树中除根结点外,每一个结点上方都有一根"树枝"(边)与之相连。因此,总边数 === n−1n - 1n−1。而总边数又等于所有结点的度之和。
#### 性质 ②:第 iii 层最多结点数
在 kkk 叉树的第 iii 层上最多有 **ki−1k\^{i-1}ki−1** 个结点 (i≥1i \\ge 1i≥1)。
#### 性质 ③:高度为 hhh 的 kkk 叉树最多结点数
T 中最多有 kh−1k−1 个结点T \\text{ 中最多有 } \\frac{k\^h - 1}{k - 1} \\text{ 个结点}T 中最多有 k−1kh−1 个结点
> **解题直觉** :本质就是等比数列求和。当每一层都塞满时(等比数列:1+k+k2+⋯+kh−11 + k + k\^2 + \\dots + k\^{h-1}1+k+k2+⋯+kh−1),即可达到最大值。
#### 性质 ④:具有 nnn 个结点的 kkk 叉树的最小高度
hmin=⌈logk\[n(k−1)+1\]⌉h_{min} = \\lceil \\log_k \[n(k-1) + 1\] \\rceilhmin=⌈logk\[n(k−1)+1\]⌉
> **🔥 方法总结:极限状态思维(胖树原则)**
>
> * **核心直觉** :**"可以理解为每个子树都是最大度"**。
> * **推导逻辑** :想要树的高度最小,就要让树尽可能"胖"。也就是让它在前 h−1h-1h−1 层全部填满(达到满 kkk 叉树状态),第 hhh 层可以不填满。满足不等式:kh−1−1k−1\