稀疏数组是主流高效方式,当二维数组超70%元素为同一默认值(如0)时应转换;其用(sum+1)×3数组存储:第0行存原行列数及有效个数,后sum行各存一有效元素的行列索引和值;还原时依首行建数组,再逐行赋值即可。

用稀疏数组处理是主流且高效的方式——它不存大量重复的默认值(比如0),只记录有效数据的位置和值,空间占用直降,读写也更轻量。
什么时候该转稀疏数组
当二维数组中超过约70%的元素是同一默认值(常见为0)时,就值得转。比如棋盘、地图、用户行为矩阵等场景:11×11的棋盘可能只有3–5个落子点,其余全是0;1000×1000的用户-商品点击表里99.8%为空。这时原数组占内存大、序列化慢、磁盘IO冗余,稀疏表示能立竿见影压缩体积。
怎么构建稀疏数组(三元组格式)
核心是用一个 (sum+1)×3 的二维数组来存:
- 第0行存三个元信息:原数组行数、列数、有效元素个数(sum)
- 第1行到第sum行,每行存一个有效元素:行索引、列索引、对应值
- 遍历原数组一次即可完成统计与填充,时间复杂度 O(m×n),无额外开销
怎么还原回原始二维数组
还原过程简单可靠:
- 读稀疏数组第0行,申请大小为 [row][col] 的新二维数组(全初始化为默认值)
- 从第1行开始逐行读取,把 (i, j, val) 直接赋值到新数组的 [i][j] 位置
- 无需遍历整个大数组,仅写 sum 次,效率远高于全量复制
进阶建议:落地更稳
实际使用时注意几点:
- 存盘推荐用文本格式(如每行 “i j val”),易读、跨语言、便于调试
- 若需频繁随机查值,可额外用字典(HashMap / dict)做索引加速,键为 (i,j),值为 val
- Python 中可用 list of tuples 或 scipy.sparse 矩阵;Java 可封装 SparseArray 类,隐藏转换逻辑
- 注意索引边界:稀疏数组里存的是原始坐标,还原时别越界











