1、什么是稀疏数组
- 当一组数中大部分元素为0或者是同一个值,需要压缩存储
- 记录数组有几行几列,多少个不同值
- 将大规模数据变成小规模数据
2、算法思想细节
1、原始数组转到稀疏数组
- 遍历原始数组,得到有效数值:sum 2
- 创建数组:array[sum+1][3]
- 原始数组转存到稀疏数组
2、稀疏数组还原原始数组
- 使用稀疏数组第一行创建原始数组
- 从稀疏数组第二行遍历稀疏数组还原出原始数组
3、代码
package basicdata;
public class SparseArray {
public static void main(String[] args) {
//原始数组
int[][] origArray = {{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},
};
//输出查看转原始数组
System.out.println("***************原始数组转化为稀疏数组***************");
System.out.println("原始数组为:");
for (int i = 0; i < origArray.length; i++) {
for (int j = 0; j < origArray[i].length; j++) {
System.out.print(origArray[i][j]+" ");
}
System.out.println();
}
//遍历数组得到sum
int sum = 0;
for (int i = 0; i < origArray.length; i++) {
for (int j = 0; j < origArray[i].length; j++) {
if (origArray[i][j] != 0) {
sum++;
}
}
}
System.out.println("有数有效数据个数:"+sum);
// 把原始数组转化为稀疏数组
int[][] sparseArray = new int[sum + 1][3];
//行数
sparseArray[0][0] = origArray.length;
//列数
sparseArray[0][1] = origArray[1].length;
//此处用9表示是数值列
sparseArray[0][2] = 9;
int k = 1;
for (int i = 0; i < origArray.length; i++) {
for (int j = 0; j < origArray[i].length; j++) {
if (origArray[i][j] != 0) {
sparseArray[k][0] = i;
sparseArray[k][1] = j;
sparseArray[k][2] = origArray[i][j];
k++;
}
}
}
//输出查看转化后的稀疏数组
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < sparseArray[i].length; j++) {
System.out.printf("%d\t",sparseArray[i][j]);
}
System.out.println();
}
//把稀疏数组转化为原始数组
System.out.println("*************稀疏数组转化为原始数组*************");
int[][] array ={{15,15,9},
{1,2,-4},
{3,3,-5},
{10,2,1},
{11,4,5},
};
System.out.println("输出原始数组");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.printf("%d\t",array[i][j]);
}
System.out.println();
}
int[][] myArray = new int[array[0][0]][array[0][1]];
//原始数组长度
System.out.println("原始数组长度"+myArray.length);
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
myArray[array[i][0]][array[i][1]] = array[i][2];
}
}
//输出查看转化后的稀疏数组
System.out.println("输出原始数组");
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
System.out.printf("%d\t",myArray[i][j]);
}
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
有数有效数据个数:2
11 11 9
1 2 1
2 3 2
*************稀疏数组转化为原始数组*************
输出原始数组
15 15 9
1 2 -4
3 3 -5
10 2 1
11 4 5
原始数组长度15
输出原始数组
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 -4 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 -5 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 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 5 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
Process finished with exit code 0