当非零元素占比低于5%时宜用稀疏矩阵压缩存储,典型场景包括棋盘程序、图的邻接矩阵和科学计算矩阵;三元组表以(行,列,值)记录非零元,首行存维度与总数,后续按行优先排列;转换需显式扫描重构,还原时须校验行列范围;压缩后随机访问降为o(n),适合批量运算而非频繁单点查询。

二维数组直接存储时,只要矩阵里零元素占绝大多数,就会浪费大量内存。稀疏矩阵不是替代二维数组,而是用更紧凑的方式记录“真正有用的数据”,核心是省空间、减冗余。
什么时候该转成稀疏矩阵
判断依据很实际:非零元素占比低于 5%(即稀疏因子 δ ≤ 0.05)就值得压缩。典型场景包括:
- 棋盘类程序(如11×11五子棋,仅存2–3个落子位置)
- 图的邻接矩阵(尤其社交网络或网页链接图,节点多但连接稀疏)
- 科学计算中的大型系数矩阵(如有限元分析中大部分区域无作用力)
三元组是基础存储形式
最常用、最易理解的稀疏表示法是三元组表:每个非零元用 (行索引, 列索引, 值) 记录。整个结构通常组织为一个 (n+1) × 3 的二维数组:
- 第 0 行存原矩阵维度和非零元总数:[总行数, 总列数, 非零个数]
- 后续每行对应一个非零元素,顺序可按行优先排列(便于后续遍历与运算)
- 注意:下标默认从 0 开始,代码中需统一,避免越界或错位
转换过程要分两步走
从二维数组到稀疏矩阵不是自动的,需显式扫描与重构:
- 先完整遍历原数组,统计非零元素个数 sum
- 创建 sparseArr[sum + 1][3],填入维度信息和所有非零元坐标值
- 还原时,先读 sparseArr[0] 创建目标二维数组,再逐行赋值 sparseArr[1..sum]
- 关键细节:还原过程中必须严格校验行列范围,防止写入越界
压缩后会失去随机访问能力
这是重要取舍——稀疏存储节省了空间,但代价是访问效率下降:
- 查 a[i][j] 不再是 O(1),而需在三元组中线性查找匹配 (i,j),最坏 O(n)
- 若频繁按坐标查值,应评估是否真适合稀疏化;若主要做整体遍历或批量运算,则优势明显
- 进阶方案如 CSR(压缩行存储)可提升行遍历效率,但实现复杂度上升











