稀疏数组
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
意义
一个二维数组中有大量位置是空着的,这样存储会浪费很多内存空间,这时可以采用稀疏数组来存储数据,大量减少内存空间。
二维数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
稀疏数组
11 11 2
1 2 1
2 4 2
使用
遍历二维数组,查找出不是无效数组的元素,已经它的索引,例如上表中的1的存储索引为 arr[1][2],它的值为1。
稀疏数组的第一行是不变的:
[0,0] 代表之前二维数组有多少行
[0,1]代表之前二维数组有多少列
[0,2]代表之前二维数组有多少有效数据
从第二行开始才是存储有效数据的 例如第一个有效数据:
[1,0]代表第一个有效数据存储在二维数组中的行
[1,1]代表第一个有效数据存储在二维数组中的列
[1,2]代表第一个有效数据存储在二维数组中的值
11 11 2
1 2 1
二维数组转稀疏数组
public class SparseArray {
public static void main(String[] args) {
//定义棋盘(二维数组)
int[][] chessArr1 = new int[11][11];
//定义已经下了的棋子
//0代表还没有下棋,1代表是黑子,2代表是蓝子.
chessArr1[1][2] = 1;
chessArr1[2][4] = 2;
//有效棋子数量
int count = 0;
//初始棋盘
System.out.println("初始棋盘");
//遍历棋盘
for(int i = 0 ; i<chessArr1.length;i++){
for(int j = 0 ; j< chessArr1[i].length;j++){
if(chessArr1[i][j]!=0){
count++;
}
System.out.print(chessArr1[i][j]+"\t");
}
System.out.println();
}
//定义稀疏数组
int[][] sparseArr1 = new int[count+1][3];
sparseArr1[0][0] = chessArr1.length;
sparseArr1[0][1] = chessArr1.length;
sparseArr1[0][2] = count;
//将有效数存储到稀疏数组中
//记住这是第几个数了
int sum = 0;
for(int i = 0 ; i<chessArr1.length;i++){
for(int j = 0 ; j< chessArr1[i].length;j++){
if(chessArr1[i][j]!=0){
++sum;
sparseArr1[sum][0] = i;
sparseArr1[sum][1] = j;
sparseArr1[sum][2] = chessArr1[i][j] ;
}
}
}
//稀疏数组
System.out.println("稀疏数组");
for(int i = 0 ; i< sparseArr1.length ; i++){
for(int j = 0 ; j< sparseArr1[i].length ; j++){
System.out.print(sparseArr1[i][j] + "\t");
}
System.out.println();
}
}
}
稀疏数组转二维数组
//稀疏数组转二维数组
//定义一个新的二维数组
int[][] chessArr2 = new int[11][11];
for(int i =1;i<sparseArr1.length ; i++){
chessArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
//遍历新的二维数组
System.out.println("新的二维数组");
for(int i = 0; i< chessArr2.length;i++){
for(int j = 0 ; j< chessArr2[i].length ; j++){
System.out.print(chessArr2[i][j]+"\t");
}
System.out.println();
}