在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。
如上图所示把原始数据根据数学中的定义,为稀疏数组,把该稀疏数组进行压缩存储之后变为上图右侧矩阵。
如图把一个五子棋棋盘看作是一个矩阵,高效的存储上图中的棋子位置,其中黑色代表数字1,蓝色代表数字2。
目标:
参考代码如下:
package datastructureexamples; public class SparseArray { public static void main(String[] args) { // 创建一个原始的二维数组 11*11 //0:表示没有妻子,1:表示黑子 2:表示蓝子 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(); } //将二维数组转化成稀疏数组 //1.先遍历二维数组,得到非零数据的个数 int sum = 0; for(int i = 0;i < 11;i++){ for(int j = 0;j < 11;j++){ if(chessArr1[i][j] !=0){ sum++; } } } //2.创建对应的稀疏数组 int sparseArr[][] = new int [sum + 1][3]; //给稀疏数组赋值 sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum; // 遍历二维数组,将非0的值存到 sparseArr中 int count = 0;//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(); 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]); } System.out.println(); //将稀疏数组恢复成原始数组 /* * 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。 * * 2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可 * */ //1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; //2.再读取稀疏数组后几行的数据(从第二行开始),并 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\t",data); } System.out.println(); } } }
运行结果如下所示:
原始的二维数组 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 得到的稀疏数组的形式为 11 11 2 1 2 1 2 3 2 恢复后的二维数组 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0