稀疏数组
思想 :
如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。
一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模
一个正常的二维数组转换为稀疏数组
稀疏数组只有三列分别表示 行 列 数值 , 行数取决于不同数值的个数 ,第一行保存的是二维数组的 行 列 和不同值的总数
实现二维转稀疏:
首先需要遍历非 0值的总数,二维数组长度已知
二次遍历数组保证不同 值的 行 列 值
还原二维就很简单了只需要读取 第一行信息 创建 二维数组,在一 一遍历稀疏数组还原对应坐标的值就可以
模拟实现 棋盘棋子的保存
代码实现二维数组转稀疏数组:
public class SparseArray { public static void main(String[] args) { //创建一个原始的二维数据11*11 // 0 表示没有棋子,1 表示 黑子,2 表示白子 int chessArray[][] = new int[11][11]; chessArray[1][2] = 1; chessArray[2][4] = 2; // 输出查看 for ( int[] row : chessArray){ for (int data : row){ System.out.printf("%d\t",data); } System.out.println(); } // 二维数组 转 稀疏数组 // 记录非 0 值的地址 和个数 int sum = 0; for(int i = 0 ;i< 11;i++){ for ( int j = 0 ; j<11; j++){ if(chessArray[i][j] != 0){ sum++; } } } System.out.println(sum); // 创建对应的稀疏数组 int spareArr[][] = new int[sum+1][3]; // 稀疏数组第一行记录整个数组的行列 以及不同值的数量 //剩下每一行都 记录了每一个值的行列位置 和值 spareArr[0][0] = 11; spareArr[0][1] = 11; spareArr[0][2] = sum; // 遍历位置 int count =0; for(int i = 0 ;i< 11;i++){ for ( int j = 0 ; j<11; j++){ if(chessArray[i][j] != 0){ count++; spareArr[count][0] = i ; spareArr[count][1] = j ; spareArr[count][2] =chessArray[i][j] ; } } } //输出稀疏数组 System.out.println(); System.out.println("得到的稀疏数组"); for (int i =0;i<3;i++){ System.out.printf("%d\t%d\t%d\t\n",spareArr[i][0] ,spareArr[i][1],spareArr[i][2]) ; } // 稀疏还原二维 int Back[][] = new int [spareArr[0][0]][spareArr[0][1]]; for (int i =1 ; i<spareArr.length;i++){ Back[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2]; } System.out.println("恢复二维数组"); for (int[] row : Back){ for (int data : row){ System.out.printf("%d\t", data); } System.out.println(); } } }
稀疏数组的应用场景
- 用于压缩数据
- 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)。
- 把稀疏数组存盘,并且可以从新恢复原来的二维数组数。