当二维数组中非默认值占比低于30%时,应使用稀疏数组;其以三元组格式存储,首行存原行列数和有效元素个数,后续每行存有效元素的行列索引及值,构建与还原均高效且需注意边界校验和存储格式。

当二维数组中超过70%的元素是同一默认值(比如0)时,直接存储会浪费大量空间。稀疏数组不存重复默认值,只记录有效数据的位置和值,压缩率高、读写轻量。
判断是否该用稀疏数组
不是所有二维数组都适合转稀疏形式。关键看数据分布:
- 棋盘类场景:11×11数组通常只有几枚棋子,其余全为0
- 用户行为矩阵:1000×1000的点击表,99%以上为空
- 地图或网格数据:大面积空白区域远多于实体标记点
只要非默认值占比低于30%,就值得转——这是空间与逻辑复杂度之间的合理平衡点。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
构建三元组格式的稀疏数组
核心结构是一个 (sum + 1) × 3 的二维数组:
- 第0行存元信息:原数组行数、列数、有效元素个数 sum
- 第1行到第sum行,每行存一个有效元素:行索引、列索引、值
- 遍历原数组一次即可完成,时间复杂度 O(m×n),无额外开销
还原回原始二维数组
还原过程简洁可靠:
- 读第0行,申请大小为 [row][col] 的新数组(自动初始化为0)
- 从第1行开始,逐行取出 (i, j, val),直接赋值到新数组的 [i][j]
- 只写 sum 次,避免全量遍历大数组,效率明显优于复制
落地时注意几个细节
实际工程中容易忽略但影响稳定性:
- 存盘建议用文本格式,如每行 “i j val”,易读、跨语言、方便调试
- 若需高频随机查值,可额外维护 HashMap
, Integer> 做索引加速 - Java 中可封装 SparseArray 类,隐藏转换逻辑;Python 推荐用 list of tuples 或 scipy.sparse
- 还原时务必校验索引边界,防止 i ≥ row 或 j ≥ col 导致 ArrayIndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










