Java数据结构与算法-稀疏数组
注:学习心得基于课程Java数据结构与Java算法
简要说明
原因:原始的二维数组存在大量的默认值0,记录了许多无效数据,由此需要用到稀疏数组去缩小程序的规模。
存储方式:转换为稀疏数组,第一行存储原二维数组的行、列、有效数据的个数。之后的行分别存储有效数据的行、列、值。
//创建一个11*11的棋盘,1表示黑子,2表示蓝子
int chessArr[][] =new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
System.out.println();
转换过程分析
- 原二维数组—>稀疏数组
- 遍历的得到有效数据个数sum
- 创建稀疏数组sparseArr
- 将有效数据存入该稀疏数组
//遍历得到有效数据的个数sum
int sum = 0;
for(int i = 0;i<chessArr.length;i++){
for(int j = 0;j<chessArr[i].length;j++){
if(chessArr[i][j]!=0){
sum++;
}
}
}
System.out.println("sum="+sum);
System.out.println();
//创建稀疏数组
int spareArr[][] = new int[sum+1][3];
//将有效数据存入稀疏数组中
spareArr[0][0] = chessArr.length;
spareArr[0][1] = chessArr[0].length;
spareArr[0][2] = sum;
//遍历二维数组
int count = 1;//用于记录是第几个非零数据
for(int i = 0;i<chessArr.length;i++){
for(int j = 0;j<chessArr[i].length;j++){
if(chessArr[i][j]!=0&&count!=sum+1){
spareArr[count][0] = i;
spareArr[count][1] = j;
spareArr[count][2] = chessArr[i][j];
count++;
}
}
}
//输出稀疏数组
System.out.println("得到的稀疏数组:");
for(int i = 0;i<spareArr.length;i++){
System.out.println(spareArr[i][0]+"\t"+spareArr[i][1]+"\t"+spareArr[i][2]);
}
- 稀疏数组还原为二维数组
- 读取稀疏数组的第一行创建二维数组
- 遍历,将有效数据存入。
int chessArr1[][] = new int[spareArr[0][0]][spareArr[0][1]];
for(int i = 1;i<spareArr.length;i++){
chessArr1[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
}