📌 前言
在计算机专业基础综合(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 个元素。
🗜️ 第二部分:特殊矩阵的压缩存储(核心痛点)
为了节省空间,常将对称矩阵、三角矩阵等特殊矩阵压缩存入一维数组 BmBmBm 中。
1. 经典例题复盘:对称矩阵 ⇒\Rightarrow⇒ 下三角矩阵
【例题】 设有一个 3×33 \times 33×3 的对称矩阵,只需存储其下三角部分(含主对角线):
145426563\begin{bmatrix} 1 & 4 & 5 \\ 4 & 2 & 6 \\ 5 & 6 & 3 \end{bmatrix} 145426563
若按行优先 原则,将其压缩存储到一维数组 BBB 中,则对应关系为:
- Bm=(1,4,2,5,6,3)Bm = (1, 4, 2, 5, 6, 3)Bm=(1,4,2,5,6,3)
🔍 元素映射一维数组轨迹分析:
- 第一行:a11→B0=1a_{11} \rightarrow B0 = 1a11→B0=1
- 第二行:a21→B1=4a_{21} \rightarrow B1 = 4a21→B1=4, a22→B2=2a_{22} \rightarrow B2 = 2a22→B2=2
- 第三行:a31→B3=5a_{31} \rightarrow B3 = 5a31→B3=5, a32→B4=6a_{32} \rightarrow B4 = 6a32→B4=6, a33→B5=3a_{33} \rightarrow B5 = 3a33→B5=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。核对 B4=6B4 = 6B4=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)去验证选项公式,直接秒杀选择题!这就是**"请自行推导"**的最高境界。
🌳 第三部分:树的核心概念精准辨析
- 度与结点:
- 树的度 :树中所有结点的度的最大值。
- 结点的度 :该结点拥有的子树个数。
- 叶子结点 :度 =0= 0=0 的结点(终端结点)。
- 分支结点 :度 >0> 0>0 的结点(非终端结点)。
- 层次、深度与高度:
- 层次 :从根开始算起,根结点位于第一层。
- 结点的深度 :从根结点自顶向下逐层累加(结点的深度 === 它的层次)。
- 树的高度 :从叶子结点自底向上数。整个树的深度 === 高度(最大层次)。
- 有序树 vs 无序树:子树的位置是否可以调换(若调换后含义改变则为有序树)。
- 森林 :所有树的结合(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=⌈logkn(k−1)+1⌉h_{min} = \lceil \log_k n(k-1) + 1 \rceilhmin=⌈logkn(k−1)+1⌉
🔥 方法总结:极限状态思维(胖树原则)
- 核心直觉 :"可以理解为每个子树都是最大度"。
- 推导逻辑 :想要树的高度最小,就要让树尽可能"胖"。也就是让它在前 h−1h-1h−1 层全部填满(达到满 kkk 叉树状态),第 hhh 层可以不填满。满足不等式:kh−1−1k−1<n≤kh−1k−1\frac{k^{h-1} - 1}{k - 1} < n \le \frac{k^h - 1}{k - 1}k−1kh−1−1<n≤k−1kh−1,从而反推出高度 hhh,在此必须使用 ⌈... ⌉\lceil \dots \rceil⌈...⌉ 向上取整 符号。
- (注意区分:⌈... ⌉\lceil \dots \rceil⌈...⌉ 为向上取整,⌊... ⌋\lfloor \dots \rfloor⌊...⌋ 为向下取整。)
性质 ⑤:具有 nnn 个结点的 kkk 叉树的最大高度
hmax=n−k+1h_{max} = n - k + 1hmax=n−k+1
🔥 方法总结:极限状态思维(瘦树原则)
- 核心直觉:想要树的高度最大,就要让树尽可能"瘦"(退化)。
- 推导逻辑 :为了满足它是一棵"kkk 叉树"的定义,树中必须且仅能有一个 结点拥有 kkk 个子女(独占 kkk 个元素),其余所有层每层都只有 111 个结点。此时树拉得最长,高度达到极大值。
🚀 总结与后续复习展望
掌握了特殊矩阵的现场代入推导法 和树的核心性质极限思维,你就拿下了这部分考题 90% 的分数。把每一次的草稿和方法总结沉淀下来,这就是考研路上的"硬核资产"!
如果觉得有收获,欢迎点赞、收藏、关注,我们下一期线索二叉树大题高发区见!