首先从字面意思来理解下这个概念:
SparseArray = Sparse +Array
翻译下就是稀疏数组,也就是说首先它是一个数组,然后它的特性是稀疏
接下来说说为什么会有这种结构的存在?
我们都知道在Java中(这里只讨论Java),数组都是第一时间定义,然后初始化出来,最后才能使用的,也就是说在我们实际使用之前,数组已经在内存中进行内存分配,并进行值得初始化,这样的话,就有一个问题,我们不一定能够实际使用玩这些空间,应该这么说我们一定使用不完这些空间,因为在实际开发中,如果非要使用数组,那么一般情况下,我们会声明一个比我们预想中占空间更大的数组。
问题已经说清楚,而SparseArray 就是来解决数组会出现的空间浪费问题,提高效率。
举个例子
举个比较简单 而且易懂的例子。
五子棋盘基本可以用二维数组来表示。
IntArr[m][n];
在初始阶段,必须就声明去棋盘大小的数组,在绝大多数情况下,这个数组的空间都是浪费状态的,这种时候,我们就可以使用稀疏数组来压缩数组。
这里必须说明的是,稀疏数组是可以在不用数组的时候节省空间,而在要使用数组的时候,必须还原为之前的数组,这也就是说,稀疏数组只是在不用的时候进行压缩,而在实际需要使用数组的时候,稀疏数组做不到代替原数组。为什么?接下来继续看。
稀疏数组的原理
稀疏数组本质上来说,就是比原数组小很多的数组,只不过它只记录原数组中有数据记录的值,以及相关信息,以此来在需要的时候来还原原数组。我们现在以原数组为二维数组来说明。
如果原数组是一个二维数组,那么对应的稀疏数组应该是这么个结构
row | col | value |
---|
也就是说,列数是不变的,当然这针对二维数组而言。但是也可以说它是不变的,因为完全可以用现有数组的值去定义稀疏数组的列数 维数+1即可。
可以形象的对比下,假如我们的原数组是6*6的二维数组:
逻辑结构大概如表格这样。
而对应的稀疏数组:
row | col | value |
---|
跟之前差不多,只是行数没有固定,因为行数是存储原数组中的数据的,所以,稀疏数组的行数肯定是小于原数组的。
这么对比一看,稀疏数组是不是真的可以节省很多空间呢?
之前也强调过了,稀疏数组无法代替原数组,只是在不需要原数组的时候,将其进行压缩,在需要的时候进行还原。