稀疏数组
稀疏数组
一,基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
(1)记录数组一共有几行几列,有多少个不同的值;
(2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
二,举例:
如果直接存盘,chess文件很大,尤其是大的二维数组(地图或者棋盘)所以采用稀疏数组进行优化;
三:具体转换思想
二维数组转稀疏数组的思路:
- 遍历原始的二维数组,得到有效数据的个数SUM;
- 根据SUM就可以创建稀疏数组SpareseArr int[SUM+1][3];
- 将二维数组的有效数据存入到稀疏数组;
稀疏数组转为原始的二维数组的思路:
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr=int[11][11];
- 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可;
四:代码实现:
1 package com.boogie.sparseArr; 2 3 public class SparseArr { 4 public static void main(String[] args) { 5 //创建一个原始的二维数组 6 //0:表示没有棋子 1:表示是黑色棋子;2:表示是蓝色棋子; 7 int chess[][]=new int[11][11]; 8 chess[1][2]=1; 9 chess[2][3]=2; 10 //输出原始棋盘 11 System.out.println("原始棋盘为:"); 12 for(int i=0;i<chess.length;i++) { 13 for(int j=0;j<chess.length;j++) { 14 System.out.print(chess[i][j]); 15 } 16 System.out.println(); 17 } 18 //原始数组转二维数组 19 20 //遍历原始数组,得到非零数组的个数 21 int sum=0; 22 for(int i=0;i<chess.length;i++) { 23 for(int j=0;j<chess.length;j++) { 24 if(chess[i][j]!=0) { 25 sum++; 26 } 27 } 28 } 29 //创建对应的稀疏数组 30 int SparseArr[][]=new int[sum+1][3]; 31 //给稀疏数组赋值 32 SparseArr[0][0]=11; 33 SparseArr[0][1]=11; 34 SparseArr[0][2]=sum; 35 //遍历二维数组,将非零的值放入SparseArr数组中 36 int count=0;//用于记录第几个非0数据 37 for(int i=0;i<chess.length;i++) { 38 for(int j=0;j<chess.length;j++) { 39 if(chess[i][j]!=0) { 40 count++; 41 SparseArr[count][0]=i; 42 SparseArr[count][1]=j; 43 SparseArr[count][2]=chess[i][j]; 44 } 45 } 46 } 47 //输出稀疏数组 48 System.out.println(); 49 System.out.println("转成的稀疏数组为:"); 50 for(int i=0;i<SparseArr.length;i++) { 51 System.out.printf("%d\t%d\t%d\t\n",SparseArr[i][0],SparseArr[i][1],SparseArr[i][2]); 52 } 53 System.out.println(); 54 55 56 //将稀疏数组恢复为二维数组 57 //1,先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组 58 int chessArr1[][]=new int[SparseArr[0][0]][SparseArr[0][1]]; 59 //2,再读取稀疏数组后几行的数据,从第二行开始,并赋给原始的二维数组即可 60 for(int i=1;i<SparseArr.length;i++) { 61 chessArr1[SparseArr[i][0]][SparseArr[i][1]]=SparseArr[i][2] ; } 62 //输出恢复后的二维数组 63 System.out.println(); 64 System.out.println("恢复后的二维数组为:"); 65 for(int i=0;i<chessArr1.length;i++) { 66 for(int j=0;j<chessArr1.length;j++) { 67 System.out.print(chess[i][j]); 68 } 69 System.out.println(); 70 } 71 72 73 } 74 }
运行结果: