详解稀疏数组
由于数据对数组空间利用率低,为了避免不必要的空间浪费引入—稀疏数组
int sum = 0;
int count = 0;
//假如以这个二维数组为例,有效数据只有2,5,3;
int[][] arr = new int[10][10];
arr[7][3] = 2;
arr[2][3] = 5;
arr[5][4] = 3;
第一步:
遍历原始的二维数组,得到有效数据的个数sum(因为我们接下来要创建稀疏数组
用来'压缩这个二维数组',而稀疏数组的创建列是固定的为3,行是根据
原来二维数组有效个数来创建的sum+1
解释: 所谓列固定为3:第一列储存有效数据的行标 第二列储存有效数据的列标,第三列就是有效数据的值)
for(int i=0;i<arr.length;++i) {
for(int j=0;j<arr[i].length;++j) {
if(arr[i][j]!=0) {
sum++;
}
}
}
第二步:
根据刚才的来的有效数据个数sum创建稀疏数组
int[][] sparesArray = new int[sum+1][3];
第三步:将二维数组的大小信息(以便从稀疏数组恢复到二维数组使用)
"以及二维数组的有效数据"储存到稀疏数组里;
sparesArray[0][0] = arr.length;//二维数组的大小
sparesArray[0][1] = arr[0].length;//二维数组的每一个一维数组的大小
sparesArray[0][2] = 2;//2是是数组的维度
for(int i=0;i<arr.length;++i) {
for(int j=0;j<arr[i].length;++j) {
if(arr[i][j]!=0) {
++count;
稀疏数组的第一列储存有效数据的行标
sparesArray[count][0] = i;
稀疏数组的第一列储存有效数据的列标
sparesArray[count][1] = j;
稀疏数组的第一列储存有效数据的值
sparesArray[count][2] = arr[i][j];
}
}
}
复原二维数组:
根据稀疏数组第一行储存的二维数组信息,将二维数组创建出来
int[][] arr2 = new int[sparesArray[0][0]][sparesArray[0][1]];
在根据其他行,给二维数组赋值
for(int i=1;i<sparesArray.length;++i) {
arr2[sparesArray[i][0]][sparesArray[i][1]] = sparesArray[i][2];
}