所谓稀疏数组到底是什么呢?其实也是一个二维数组,为什么要叫稀疏数组?不重要。要它干嘛用呢?用来保存一个二维数组。用二维数组保存二维数组?是的,它保存的二维数组是一个重复数据比较多的二维数组,就理解成压缩吧,就是将一个较大的二维数组缩小一下,这样就可以节省内存空间了。如下一个二维数组:
0 0 0 0
0 1 0 0
0 0 3 0
0 0 0 0
转换为稀疏数组:
行 列 数值
4 4 2
1 1 1
2 2 3
如何转换过来的呢?
原始的二维数组是一个4行4列的二维数组,不为0的数有两个,所以稀疏数组第一行保存的就是原始数组的行和列,以及不为0的数据的个数,第二行的三个数据又代表什么意义呢?它代表的是第一行的第一列有一个有效数据一,第三行的三个数代表什么我想你已经想到了吧。
这样就可以保存下原来4行4列的值了。节省了不少内存空间。
第一行记录了原来二维数组的大小,4行4列。除了有效数据就都是0。
第二行记录了一行一列的地方有一个有效数值1。下面的以此类推。
下面给大家看一看演示代码。
1,创建二维数组
//首先模拟实际场景,创建一个二维数组
int BigArr[][] = new int[8][8];
//填充几个有效元素
BigArr[1][1] = 3;
BigArr[2][3] = 4;
2,转换为稀疏数组
首先是获取数组中有效数据的个数(也就是不为0的数),目的是为了得到稀疏数组的行数。获取到就创建稀疏数组,行是有效数据的个数加一,因为稀疏数组的第一行我们是用来保存原始数组的大小以及有效数据的个数。然后遍历原始数组,将不为零的数(即有效数据)依次存入到稀疏数组。
public static int[][] TransForXiShu(int[][] arr,int l ,int w ){
//获取数组有效元素的个数
int sum = 0;
for(int row[] : arr){
for(int colum : row){
if(colum != 0){
sum++;
}
}
}
//将原数组转换为稀疏数组
int clow = 1;
int[][] Xishu = new int [sum+1][3];
Xishu[0][0] = l;
Xishu[0][1] = w;
Xishu[0][2] = sum;
for(int i = 0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
if(arr[i][j] != 0){
Xishu[clow][0] = i;
Xishu[clow][1] = j;
Xishu[clow][2] = arr[i][j];
clow++;
}
}
}
return Xishu;
}
3,将稀疏数组转换为原来的数组,
因为我们稀疏数组第一行第一列存的是原数组的大小,所以直接读取第一行数据就可以把原来的数组大小确定了。
然后我们取出下一行的数组,存的就是第一个有效数据的行和列,以及有效数据了。依次重复,就可以恢复原来的数据。
public static int[][] TransToStart(int[][] xishu){
int BigArr[][] = new int[xishu[0][0]][xishu[0][1]];
for(int i=1;i<xishu.length;i++){
BigArr[xishu[i][0]][xishu[i][1]] = xishu[i][2];
}
return BigArr;
}