概述
在一个数组里有多个同值的单元时,可以用稀疏数组进行压缩,只保留有效数字。也就是说在数据稀少的情况下才有优势。
举个栗子
下图二维数组里,大多数都是0,真正有意义的数字只有5个。存那么多零岂不是浪费空间?
因此我们可以根据对应的行列,只存储有效数值。
注意:第一部分存储总行列数和有效值个数,以便于复原时创建数组。
二维转稀数思路
1.遍历二维数组,得到有效值数量sum
2.根据sum创建稀数组,spareArr int[sum+1][列]
3.将有效数值存入稀数组
稀数转二维思路
1.读取第一行数据后创建二维数组
2.继续读取数据,存入二维数组
造轮子!!
我们可以来看一下稀数数组在五子棋的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
int chessArr1[][] = new int[11][11]; chessArr1[1][2] = 1; chessArr1[2][3] = 2;
System.out.println("棋盘"); for(int[] row : chessArr1){ for(int data : row){ System.out.printf("%d\t",data); } System.out.println(); }
int sum = 0; for(int i = 0;i < 11;i++){ for(int j = 0;j < 11;j++){ if(chessArr1[i][j] != 0){ sum++; } } }
int sparseArr[][] = new int[sum+1][3]; sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum;
int count = 0; for(int i = 0;i < 11;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]; } } }
System.out.println("稀疏数组"); for(int i = 0;i<sparseArr.length;i++){ System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); }
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i =1;i<sparseArr.length;i++){ chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; }
System.out.println("棋盘"); for(int[] row : chessArr1){ for(int data : row){ System.out.printf("%d\t",data); } System.out.println(); }
|
最后输出的效果图是这样的

