🤖 Assistant

1
2
3
4
5
6
7
8
# 🧮 第五章:数组与广义表 · 从青铜到王者养成指南

## 🌟 一、数组:整齐划一的「数据方阵」

### 1.1 🧱 数组基础认知
![数组结构示意图](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b28d7c3f7ac4f4a857b1c5c15dcb0a7~tplv-k3u1fbpfcp-zoom-1.image)
```c
int classroom[5] = {85,92,78,90,88}; // 典型的「数组宿舍楼」

📌 核心特点

特点 解读
🔒 同质化 所有「房间」住同类型数据
🚌 连续存储 内存地址连续(门牌号相邻)
🎯 随机访问 通过下标可直接定位到具体元素

1.2 🏗️ 高维数组建模秘籍

🔢 二维数组地址计算(行优先)

公式密码Loc(A[i][j]) = Loc(A[0][0]) + (i*n + j)*size
假设5x4矩阵中每个元素占4字节:

1
2
# 计算A[2][3]地址(起始地址200)
地址 = 200 + (2*4 + 3)*4 = 200 + 11*4 = 244 ✔️

🗺️ 存储策略对比

策略 存储方式 适用场景
行优先存储 按行展开(类似读书顺序) C/C++、Python
列优先存储 先排完一列再下一列 Fortran语言

1.3 🦸♂️ 特殊矩阵的「瘦身术」

🔀 对称矩阵压缩

只需存储对角线及一侧元素:

1
2
3
4
原矩阵:      存储数组:
1 2 3 1
2 4 5 ➔ 2 4
3 5 6 3 5 6

🌲 稀疏矩阵的三元组表示

1
2
3
4
5
6
struct Triple {
int row;
int col;
int value;
};
// 存储非零元素坐标和值

🌌 二、广义表:会「变身术」的数据魔法师

2.1 ✨ 魔法特性

1
(莫比乌斯环, (递归, (套娃)), 42) ; Lisp风格的广义表
  • 🌀 魔法元素:可以是原子(基本数据项)或子表
  • 🎭 形态自由:支持空表、嵌套、递归结构
  • 🕳️ 深度定义:嵌套层数(原子深度为0,空表情深度为1)

2.2 🌀 结构解密

头尾表示法 vs 层次表示法

广义表示例图

终极挑战:计算深度

1
2
3
# 计算广义表 L=(a,(b,(c,d)),e) 的深度
1. a → 深度0(原子)
2. (b,(c,d)) → 分解后得到(c,d),深入一层 → 总深度 2+1=3 ✔️

2.3 🔧 核心操作工具箱

1
2
3
4
5
// 伪代码示例:取表头和表尾
public class GList {
Object head; // 可能是原子或子表
GList tail; // 剩余部分构成的新广义表
}

📊 三、考古现场:数组 vs 广义表

对比维度 数组 广义表 战场解析
🔢 元素类型 严格统一 混合类型自由搭配 广义表更灵活
🧠 存储结构 线性的物理连续 递归的逻辑链接 数组访问更快
🚀 操作效率 删改耗时O(n) 动态操作更高效 各有适用场景
🎮 典型应用 图像处理、矩阵运算 人工智能、语法分析 领域分工明确

🧩 四、思维导图脑暴中心

1
2
3
4
5
6
7
8
9
10
mindmap
root((高阶数据结构))
数组--> 特点["🔑 同质 | 连续 | 随机访问"]
数组--> 分类["📦 一维 → 多维 → 特殊矩阵"]
数组--> 操作["⚡ 查改O(1) | 插删O(n)"]
广义表--> 特性["🌀 递归 | 嵌套 | 灵活结构"]
广义表--> 表示法["🔖 头尾 ↔ 层级"]
广义表--> 魔法操作["🎩 取头/尾 | 求深度"]
应用场景--> 数组应用["📷 图像存储 | 矩阵运算"]
应用场景--> 广义表应用["🤖 AI决策树 | 编译器解析"]

💡 学习效果自测(含答案)

  1. 二维数组A[8][10]采用行优先存储,首地址200,每个元素占4字节,求A[3][5]地址?
    ➔ 展开计算:200 + (310 +5)4 = 200 + 35*4 = 340 ✅

  2. 广义表L=((a,b), (c,(d,e)))的深度是多少?
    ➔ 最深层是(d,e)所在位置:深度为3 ✅

  3. 对对称矩阵进行压缩存储的目的是什么?
    ➔ 节省存储空间 + 提升访问效率 ✅

🌟 提示:尝试用不同编程语言实现广义表的基础操作,能加深理解哦!
```


学习锦囊:建议配合可视化工具(如Data Structure Visualizations网站)观察数组和广义表的动态操作过程,理论结合实践效果更佳!