需求:框内是一个12*13的二维数组,现在想将其存储起来。
因为有许多值是0,这就会有许多没有意义的数据。所以用普通的方法存储会很耗空间。
一、基本介绍
- 当数组中大多数元素为零,可以使用稀疏数组来保存该数组,以此来达到节约空间的目的。
二、稀疏数组的结构
稀疏数组的列是固定的,为行(row),列(col),值(value)。
第一部分:原始数组的行数,列数,值(有效的值的个数)
余下的部分:原始数组中元素的行,列,值
如图:
稀疏数组的第0行为原数组的行数,列数,以及原数组的有效值的个数。(12,13,3)
第1行:原数组的行,列,以及值。(即是1行,2列,值是1)
第2行:即是3行,4列,值为2。
第3行:即是5行,4列,值为2。
前情提要
//定义一个原始数组
int sourceArray[][] = new int[12][13];
sourceArray[1][2] = 1;
sourceArray[3][4] = 2;
sourceArray[5][4] = 2;
三、思路分析
1.将原数组转为稀疏数组
1.首先遍历原始数组,得到有效数据的个数sum。(sum+1为稀疏数组的长度)
2.根据sum创建稀疏数组SparseArray[sum+1][3]
3.将数据存入SparseArray[sum+1][3]
(1)将原始数组的行数,列数,有效数据的个数分别存入SparseArray[0][0],SparseArray[0][1],SparseArray[0][2]。
(2)遍历原始数组,将有效数据存入到稀疏数组中。
- 代码实现
//遍历原始二维数组,得到非0的值的个数,
int sum = 0;
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
sum++;
}
}
}
//创建稀疏数组
int sparseArray[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArray[0][0] = sourceArray.length; //原始二维数组的行数
sparseArray[0][1] = sourceArray[0].length; //原始二维数组的列数
sparseArray[0][2] = sum;//原始数组中非0的个数
//用于记录是第几个非0数
int count = 0;
//遍历数组,将非0的值存放到稀疏数组sparseArray中
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = sourceArray[i][j];
}
}
}
2.将稀疏数组转成原始数组
1.首先获取稀疏数组第一行的数据,根据第一行数据来创建原始数组。
2.遍历读取余下的数据,并赋值给原始数组
- 代码实现
//创建原始的二维数组
int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//遍历,将值赋给原始数组
for(int i=1;i<sparseArray.length;i++){
sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
}
四、完整代码
package sparsearray;
public class SparseArray {
public static void main(String[] args) {
//定义一个原始数组
int sourceArray[][] = new int[12][13];
sourceArray[1][2] = 1;
sourceArray[3][4] = 2;
sourceArray[5][4] = 2;
for (int[] row : sourceArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//将原始数组转成稀疏数组
//遍历原始二维数组,得到非0的值的个数,
int sum = 0;
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
sum++;
}
}
}
System.out.println(sum);
System.out.println(sourceArray.length);
//创建稀疏数组
int sparseArray[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArray[0][0] = sourceArray.length; //原始二维数组的行数
sparseArray[0][1] = sourceArray[0].length; //原始二维数组的列数
sparseArray[0][2] = sum;//原始数组中非0的个数
//用于记录是第几个非0数
int count = 0;
//遍历数组,将非0的值存放到稀疏数组sparseArray中
for (int i = 0; i < sourceArray.length; i++) {
for (int j = 0; j < sourceArray[0].length; j++) {
if (sourceArray[i][j] != 0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = sourceArray[i][j];
}
}
}
System.out.println("输出稀疏数组");
for (int[] row : sparseArray) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//将稀疏数组在恢复成原始二维数组
//创建原始的二维数组
int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//遍历,将值赋给原始数组
for(int i=1;i<sparseArray.length;i++){
sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
}
System.out.println("输出原数组");
for (int[] row : sourceArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}