【408狂飙·数据结构】核心考点深度复盘:数组地址计算、特殊矩阵压缩存储与树的五大性质解题直觉


📌 前言

在计算机专业基础综合(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=⌈log⁡k\[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\ * *(注意区分:⌈... ⌉\\lceil \\dots \\rceil⌈...⌉ 为向上取整,⌊... ⌋\\lfloor \\dots \\rfloor⌊...⌋ 为向下取整。)* #### 性质 ⑤:具有 nnn 个结点的 kkk 叉树的最大高度 hmax=n−k+1h_{max} = n - k + 1hmax=n−k+1 > **🔥 方法总结:极限状态思维(瘦树原则)** > > * **核心直觉**:想要树的高度最大,就要让树尽可能"瘦"(退化)。 > * **推导逻辑** :为了满足它是一棵"kkk 叉树"的定义,树中**必须且仅能有一个** 结点拥有 kkk 个子女(独占 kkk 个元素),其余所有层每层都只有 111 个结点。此时树拉得最长,高度达到极大值。 *** ** * ** *** ### 🚀 总结与后续复习展望 掌握了**特殊矩阵的现场代入推导法** 和**树的核心性质极限思维**,你就拿下了这部分考题 90% 的分数。把每一次的草稿和方法总结沉淀下来,这就是考研路上的"硬核资产"! **如果觉得有收获,欢迎点赞、收藏、关注,我们下一期线索二叉树大题高发区见!** *** ** * ** ***

相关推荐
小+不通文墨7 小时前
在树莓派中部署emqx
经验分享·笔记·单片机·学习
Fu2067217 小时前
OSPF笔记 OSPF --- 开放式最短路径优先
网络·笔记
William Dawson7 小时前
【软考中级备考日记|系统集成项目管理工程师Day20:终章上岸|最后一页纸必考清单(考场直接默写、零基础必背)】
笔记·系统集成项目管理工程师
玄米乌龙茶1237 小时前
LLM 应用开发学习笔记:System Prompt 设计、注入风险与成本优化
笔记·学习·prompt
青山师7 小时前
HashMap深度解析:哈希冲突、扩容机制与线程安全
算法·安全·哈希算法·java面试·hashmap源码
货拉拉技术7 小时前
私域转化率翻倍的秘密:我们把多模态Agent融进了私域营销
人工智能·算法·设计模式
不是山谷.:.7 小时前
Axios的【接口防抖 + 请求失败重试 + 弱网提示】三合一高阶版封装
前端·javascript·vue.js·笔记·elementui·typescript
WL_Aurora7 小时前
备战蓝桥杯国赛【Day 17】
算法·蓝桥杯
daanpdf7 小时前
历年考研数学一、数学二、数学三真题试卷及答案PDF
考研·pdf