什么是稀疏数组?
稀疏数组可以看作是普通数组的压缩,当普通数组只有少量有效数据时,可以使用稀疏数组的方式存储,从而达到节省空间的目的。
为什么要用稀疏数组?
因普通数组中只有少量有效数据,即会有大量无用数据占用空间,故使用稀疏数组以节省空间。
例如:int array[][] = new int[5][5];
array[1][1] = 1;
array[1][2] = 2;
0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
如上定义5*5的二维数组array,只有两个有效数据1,2。其他均为默认值0,如果直接存储array,则会浪费5*5-2个空间。
这时候就可以使用稀疏数组的方式存储,先展示使用稀疏数组存储的数据结构
行 列 值 5 5 2 1 1 1 1 2 2
稀疏数组有(n+1)行3列,n=有效数据个数,其中第一行固定表示原二维数组有5行5列有效值有2个。后面n行依次表示原二维数组中的有效数据分别在第几行第几列及对应值
使用稀疏数组只保存有效数据,因此适用于原二维数组只有少量有效数据的情况,而如果原数组大部分数据为有效数据,再转为稀疏数组反而占用更多的空间(m行*n列*3)
如何实现稀疏数组?
1.将二维数组转为稀疏数组方法
-
1 public static int[][] arrayToSparseArray(int[][] array) { 2 //统计有多少个非0数据 3 int sum = 0; 4 for(int i=0;i<array.length;i++){ 5 for(int j=0;j<array[i].length;j++){ 6 if(array[i][j] != 0){ 7 sum ++; 8 } 9 System.out.printf("%d\t",array[i][j]); 10 } 11 System.out.println(); 12 } 13 14 System.out.println("有效数据个数="+sum); 15 16 //二维数组转稀疏数组 17 /** 18 * 思路:1.得到二维数组的有效数据个数sum 19 * 2.根据sum创建稀疏数组 20 * 3.将二维数组的有效数据存入稀疏数组中 21 */ 22 int sparseArray[][] = new int [sum+1][3]; 23 sparseArray[0][0] = array.length; 24 sparseArray[0][1] = array[0].length; 25 sparseArray[0][2] = sum; 26 //遍历二维数组,并将有效数据存入稀疏数组中 27 int count = 0; 28 for(int i=0;i<array.length;i++){ 29 for(int j=0;j<array[i].length;j++){ 30 if(array[i][j] != 0){ 31 count ++; 32 sparseArray[count][0] = i; 33 sparseArray[count][1] = j; 34 sparseArray[count][2] = array[i][j]; 35 } 36 } 37 } 38 39 //打印稀疏数组 40 for(int []row :sparseArray){ 41 for(int data: row){ 42 System.out.printf("%d\t",data); 43 } 44 System.out.println(); 45 } 46 return sparseArray; 47 }
调用方法
1 public static void main(String []args){ 2 /** 3 * 先初始化一个5*5的二维数组,包含两个值 4 */ 5 int array[][] = new int [5][5]; 6 array[1][2] = 1; 7 array[2][3] = 2; 8 int[][] sparseArray = arrayToSparseArray(array); 9 10 }
调用结果:
打印原数组 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 有效数据个数=2 打印稀疏数组 5 5 2 1 1 1 1 2 2
2.将稀疏数组转给数组
1 public static void sparseArrayToArray(int[][] sparseArray) { 2 /** 3 * 将稀疏数组转为二维数组 4 * 思路:1.先取出稀疏数组的第一行,根据第一行数据,创建原始的二维数组 5 * 2.再读取稀疏数组后几行,并赋值给原始的二维数组 6 */ 7 int backArray[][] = new int [sparseArray[0][0]][sparseArray[0][1]]; 8 9 for(int i=1;i<sparseArray.length;i++){ 10 backArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2]; 11 } 12 13 //打印原始二维数据 14 System.out.println("稀疏数组转为二维数组后的数据:"); 15 for(int rows[] : backArray){ 16 for(int data: rows){ 17 System.out.printf("%d\t",data); 18 } 19 System.out.println(); 20 } 21 }
调用方法
1 public static void main(String []args){ 2 /** 3 * 先初始化一个5*5的二维数组,包含两个值 4 */ 5 int array[][] = new int [5][5]; 6 array[1][1] = 1; 7 array[1][2] = 2; 8 int[][] sparseArray = arrayToSparseArray(array); 9 10 sparseArrayToArray(sparseArray); 11 }
调用结果
稀疏数组转为二维数组后的数据: 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
总结
当使用普通数组,且只有少量有效数据存储在数组中时,可以将其转换为稀疏数组的方式进行存储(上述代码没有保存到文件中,后续更新),从而达到节省空间的目的。