如有错误请指正,谢谢!
什么是稀疏数组?
如图一个二维数组,仅仅只是在某几个位置存储了其他数据.
我们却要使用一个如此之大的数组保存这些数组.略显可惜.
我们可以将其转化为稀疏数组,减少保存这些数据所占用的空间.
转换之后的稀疏数组如上图
* | 每个数据代表的含义 | * |
---|---|---|
原始数组有几行 | 原始数组有几列 | 原始数组的有效数据的个数 |
该值所处原始数组的第几行 | 该数所处原始数据的第几列 | 原始数据中的该数 |
… | … | … |
我们可以看到原始数组为11行11列.共两个有效数组
有效数字1所处的位置是[1,2]
有效数字2所处的位置是[2,3]
所以转化成稀疏数组为上边的那个图片.
思路就是这样的, 自己可以动手实现一下,如果实现不了,可以参考表面的代码实现
能动手就不逼逼!
代码实现
package name.dancer.array;
/**
* 稀疏数组
* @author dancer
* @date 2019-07-12
* @description
* 二维数组转稀疏数组
* 1.遍历原始的二维数组,得到有效数据的个数sum
* 2.根据sum就可以创建稀疏数组sparseArr [sum + 1][3]
* 3.将二维数组的有效数组存入到稀疏数组
*
* 稀疏数组转二维数组
* 1.读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,array[11][11]
* 2.读取稀疏数组后几行的数据,并赋值给原始的二维数组即可.
*
**/
public class SparseArray {
public static void main(String[] args) {
// 创建原始数组
int[][] array = new int[11][11];
array[1][2] = 1;
array[2][3] = 2;
System.out.println("[ + ] 原始数组");
for (int[] row: array) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
// 获取!0值个数
int num = 0;
for (int[] row : array) {
for (int data : row) {
if (data != 0) {
num++;
}
}
}
// 构建稀疏数组
int[][] sparseArray = new int[num + 1][3];
sparseArray[0][0] = array.length;
sparseArray[0][1] = array[0].length;
sparseArray[0][2] = num;
// 填充数据
int line = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if(array[i][j] != 0) {
line++;
sparseArray[line][0] = i;
sparseArray[line][1] = j;
sparseArray[line][2] = array[i][j];
}
}
}
System.out.println("[ + ] 原始数组转稀疏数组");
for (int[] row : sparseArray) {
System.out.printf("%d\t%d\t%d\n", row[0], row[1], row[2]);
}
// 稀疏数组转原始数组
int[][] array2 = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
array2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("[ + ] 稀疏数组转原始数组");
for (int[] rows : array2) {
for (int data : rows) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}