目录
什么是稀疏数组?
当一个二维数组中存在大量的0时,数组中仅有少部分的空间可以使用,造成了空间内存的浪费,为了节省空间,来去压缩二维数组,只去记录相关内容。
处理方法,用一个二维数组去记录原始二维数组的长、宽,和有效值的个数;和一个值所在的位置。如图:
0 | 原始长:11 | 原始宽:11 | 有效值个数:2 |
---|---|---|---|
1 | 值1长:2 | 值1宽:2 | value:6 |
2 | 值1长:2 | 值1宽:3 | value:7 |
原始二维数组转为稀疏数组思路
1.遍历。得到原始二维数组的长、宽和 有效值sum 的个数。
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j<chessArr1.length;j++){
if (chessArr1[i][j]!=0){
sum++;
}
}
2.根据有效数据来创建稀疏数组。
`int sparseArr[][] = new int[sum+1][3];
// 给稀疏数组第一组数据赋值
sparseArr[0][0] =11;
sparseArr[0][1] =11;
sparseArr[0][2] =sum;`
sum+1 是因为共有sum个值,另外还有一行需要定义原始数据的长宽和有效值。所以需要+1;
3.将二维数组的有效值存入到稀疏数组中。
int count = 0 ; //count 用于记录是第几个非0的数据
for (int i = 0; i < chessArr1.length; i++) {
for (int j = 0; j<11;j++){
if (chessArr1[i][j]!=0){
count++;
sparseArr[count][0] = i ;
sparseArr[count][1] = j ;
sparseArr[count][2] = chessArr1[i][j] ;
}
}
}
稀疏数组转原始二维数组思路
1.先读取稀疏数组的第一行,根据第一行的数据来创建二维数组。
int chessAr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//重新定义一个数组chessAr2,用来存稀疏数组转回来的二维数组。 可以直接将sparseArr数组元素赋给ar2 .直接获得长宽。
2.在读取稀疏数组的数据后,赋值给原来的二维数组即可。
for (int i = 1 ; i<sparseArr.length;i++){ //i0 寸的是行 ,i1存的列 i2 寸的是值。 在上面已经赋值。这里直接从第1行开始取值。
chessAr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
for (int [] row:chessAr2 ) {
for (int data: row) {
System.out.print("\t" + data);
}
System.out.println(" ");
}