当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
定义
稀疏数组是一种二维数组。当在二维数组中存在较多的无意义的数如0的时候,我们可以考虑采用稀疏数组以节省空间。稀疏数组是一种n行3列的二维数组,arr[i][0]表示行,arr[i][1]表示列,arr[i][2]表示该位置对应的值。在对应的稀疏数组的arr[0][i]中记录的是对应的总数据数。即总行数、总列数、总的记录值数。
举例
稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元,如下上面是原始数组,下面是稀疏数组
0 0 0 0 0 0 00 0 1 0 0 0 00 0 0 2 0 0 00 0 0 0 0 4 00 0 0 0 0 0 05 7 31 2 12 3 23 5 4
稀疏数组行数为原始数组中不为0的元素数目+1,列为3,第一行是用来存放原数组有多少行,多少列,总共多少个有效元素,假设原数组有效元素个数为sum,则稀疏数组可以定义为int[][] sparseArray = new int[sum+1][3]
sparseArray[0][0]表示原数组有多少行
sparseArray[0][1]表示原数组有多少列
sparseArray[0][2]表示原数组有多少个有效元素
sparseArray[i][0],i>0表示第i个元素所在的行
sparseArray[i][1],i>0表示第i个元素所在的列
sparseArray[i][1],i>0表示第i个元素的值
这就是稀疏数组
Java版原始数组和稀疏数组的转换
public class SparseArray {public static void main(String[] args) {//稀疏数组和原数组的互相转化//1、初始化原数组int[][] array = new int[5][7];//2、设置值array[1][2]=1;array[2][3]=2;array[3][5]=4;//打印System.out.println("原始数组如下:");printArray(array);//因为原始数组太稀疏了,浪费空间,所以要转变为稀疏数组,转换步骤如下//我们先来构造第一行的值//1、获取原数组的行int rowSize = array.length;//2、获取原数组的列int columnSize = array[0].length;//3、获取原数组的有效元素个数int sum = 0;for (int i = 0; i < array.length; i++) {int[] a = array[i];for (int j = 0; j < a.length; j++) {if(a[j]!=0) {sum++;}}}//构造稀疏数组int[][] sparseArray = new int[sum+1][3];//第一行第一列表示原始数组的行sparseArray[0][0]=rowSize;//第一行第二列表示原始数组的列sparseArray[0][1]=columnSize;//第一行第三列表示原始数组有效数据的数目sparseArray[0][2]=sum;//设置稀疏数组的值,从第2行开始放元素,每放一个就换行int row = 0;for (int i = 0; i < array.length; i++) {int[] a = array[i];for (int j = 0; j < a.length; j++) {if(a[j]!=0) {row++;//这是一个值,从上到下来遍历sparseArray[row][0] = i;sparseArray[row][1] = j;sparseArray[row][2] = a[j];}}}System.out.println("转换成稀疏数组如下:");printArray(sparseArray);//这里我们再来进行将稀疏数据转为原始数组,其实就是反向推到而已//1、获取数组有多少行int rowSizeBefore = sparseArray[0][0];int columnSizeBefore = sparseArray[0][1];//2、初始化数组int[][] arrayBefore = new int[rowSizeBefore][columnSizeBefore];//3、设置值for (int i = 1; i < sparseArray.length; i++) {arrayBefore[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}//还原后的数组System.out.println("还原后的数组:");printArray(arrayBefore);}/*** 打印数组* @param array*/public static void printArray(int[][] array) {for (int i = 0; i < array.length; i++) {int[] a = array[i];for (int j = 0; j < a.length; j++) {System.out.print(a[j]+" ");}System.out.println();}}}
结果如下
原始数组如下:0 0 0 0 0 0 00 0 1 0 0 0 00 0 0 2 0 0 00 0 0 0 0 4 00 0 0 0 0 0 0转换成稀疏数组如下:5 7 31 2 12 3 23 5 4还原后的数组:0 0 0 0 0 0 00 0 1 0 0 0 00 0 0 2 0 0 00 0 0 0 0 4 00 0 0 0 0 0 0
