稀疏(sparsearry)数组(Java)
当一个数组中大部分元素都为0,或为同一个值的数时可用稀疏数组减少定义空间。
稀疏数组
- 记录数组有几行几列,有多少不同元素的值
- 把具有不同元素值的行列及值记录在一个小规模的数组中,从而缩小程序的规模
二维数组与稀疏数组的相互装换
思路
- 二维数组转稀疏数组的思路:
1. 遍历原始二维数组,得到有效数据个数 sum
2. 根据sum创建稀疏数组sparsearry int [sum+1][3] (稀疏数组第一行记录:原二维数组总行数,原二维数组总列数,原二维数组有效数据个数,因此“sum+1”且稀疏数组只有三列,分别记录行,列,值)
3. 将二维数组有效数据存入稀疏数组 - 稀疏数组转二维数组的思路
- 先读取稀疏数据的第一行,根据第一行的数据,创建原始的二维数组
- 在读取稀疏数组的后几行数组,赋给原始的二维数组
代码如下
public class sparsearry {
public static void main(String[] args) {
int chessArr[][]=new int[5][5];
chessArr[0][1]=1;
chessArr[1][2]=2;
chessArr[2][3]=3;//输入原始二维数组
System.out.println("原始的二维数组为:");//输出二维数组
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//1.遍历二维数组得到有效数据的个数
int sum=0;
for(int i=0;i<5;i++) {
for(int j=0;j<5;j++) {
if(chessArr[i][j]!=0) {
sum++;
}
}
}
int sparsearry[][]=new int[sum+1][3];
sparsearry[0][0]=5;//稀疏数组第一行第一列代表 “行”
sparsearry[0][1]=5;//稀疏数组第一行第二列代表 “列”
sparsearry[0][2]=sum;//稀疏数组第一行第三列代表“有效数据个数”
//2.遍历稀疏数组为空白部分填“0”
int count=0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (chessArr[i][j] != 0) {
count++;
sparsearry[count][0] = i;
sparsearry[count][1] = j;
sparsearry[count][2] = chessArr[i][j];
}
}
}
//3.输出稀疏数组
System.out.println();
System.out.println("得到稀疏数组为~~~~");
for (int i = 0; i < sparsearry.length; i++) {
System.out.printf("%d\t%d\t%d\t\n", sparsearry[i][0], sparsearry[i][1], sparsearry[i][2]);
}
System.out.println();
//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
int chessArr1[][] = new int[sparsearry[0][0]][sparsearry[0][1]];
//2. 在读取稀疏数组后几行的数据(从第二行开始),赋值
for(int i = 1; i < sparsearry.length; i++) {
chessArr1[sparsearry[i][0]][sparsearry[i][1]] = sparsearry[i][2];
}
// 输出恢复后的二维数组
System.out.println();
System.out.println("恢复后的二维数组");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
运行结果如下:
原始的二维数组为:
0 1 0 0 0
0 0 2 0 0
0 0 0 3 0
0 0 0 0 0
0 0 0 0 0
转换后的稀疏数组为:
5 5 3
0 1 1
1 2 2
2 3 3
恢复后的二维数组
0 1 0 0 0
0 0 2 0 0
0 0 0 3 0
0 0 0 0 0
0 0 0 0 0