来源:https://www.bilibili.com/video/BV1B4411H76f?p=9
一、稀疏数组的基本介绍
一个二维数组中,如果大部分元素为0,或者是同一个值,可以用一种更简单的方式存储该数组。
1)记录二维数组有几行几列,一共有多少个值;
2)记录这些值所在的位置及值的大小。
这样形成的数组就是稀疏数组。
二、稀疏数组实例
1、原始的二维数组
1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 2 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0
2、对应的稀疏数组
1 11 11 2 2 1 2 1 3 2 3 2
稀疏数组中:
第一行[11,11,2]表示原二维数组有11行11列2个值;
第二行[1,2,1]表示下标为(1,2)的位置有一个值,值为1;
同理,第三行[2,3,2]表示下标为(2,3)的位置有一个值,值为2。
三、应用实例
1、问题描述
1)把上述二维数组存为稀疏数组
2)将存储后的稀疏数组恢复为原始数组
2、思路
1)二维数组→稀疏数组
• 遍历原始数组得到有效数据的个数sum;
• 根据sum创建稀疏数组spareArr [sum+1][3];
• 将有效数据存储到稀疏数组。
2)稀疏数组→二维数组
• 读取稀疏数组第一行,创建原始二维数组;
• 读取稀疏数组后面的行,赋值给二维数组对应的位置。
3、代码实现
1)创建二维数组
1 // 创建原始二维数组 11*11 2 int chessArr1[][] = new int[11][11]; 3 chessArr1[1][2] = 1; 4 chessArr1[2][3] = 2; 5 //输出原始数组 6 for(int[] row : chessArr1) { 7 for(int data : row) { 8 System.out.printf("%d ",data); 9 } 10 System.out.println(); 11 }
2)二维数组→稀疏数组
1 //*************************将二维 转 稀疏 2 //遍历得到非零数据个数 3 int sum = 0; 4 for(int i = 0;i < 11; i++) { 5 for(int j = 0;j < 11; j++) { 6 if(chessArr1[i][j] != 0) { 7 sum++; 8 } 9 } 10 } 11 12 //创建稀疏 13 int sparseArr[][] = new int[sum+1][3]; 14 sparseArr[0][0] = 11; 15 sparseArr[0][1] = 11; 16 sparseArr[0][2] = sum; 17 18 //稀疏赋值 19 int count = 0;//记录是第几个非零数据 20 for(int i = 0;i < 11; i++) { 21 for(int j = 0;j < 11; j++) { 22 if(chessArr1[i][j] != 0) { 23 count++; 24 sparseArr[count][0] = i; 25 sparseArr[count][1] = j; 26 sparseArr[count][2] = chessArr1[i][j]; 27 } 28 } 29 } 30 31 //输出 32 System.out.println(); 33 System.out.println("得到的稀疏数组为:"); 34 for(int i = 0; i < sparseArr.length; i++) { 35 System.out.printf("%d %d %d ",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); 36 } 37 System.out.println();
3)稀疏数组→二维数组
//***********************稀疏恢复 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(); System.out.println("恢复的二维数组为:"); for(int[] row : chessArr2) { for(int data : row) { System.out.printf("%d ",data); } System.out.println(); }