稀疏数组
1.稀疏数组是一种将二维数组压缩为少量数据后的结果呈现(适用于数据多为空的二维数组),效果如下
原始的二维数组~~
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 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
压缩后得到稀疏数组为~~~~
11 11 3
1 2 1
2 3 2
4 5 2
压缩思路
原始数组array=int[y][x]
1.读取原始数组,其中有效值(非空)个数为c
2.设定二维稀疏数组sparseArr=int[c+1][3]
3.sparseArr[0]存储原始数组属性
sparseArr[0][0]=array.length --数组一维长度
sparseArr[0][1]=array[0].length --数组二维长度
sparseArr[0][2]=c --数组有效值个数
4.sparseArr[1~c]存储array中有效值(c个)及对应一维二维索引
设存在有第l个有效值位于array[n][m]=k,则
sparseArr[l][0]=n --有效值所处一维索引
sparseArr[l][2]=m --有效值所处二维索引
sparseArr[l][3]=k --有效值
还原思路
稀疏数组sparseArr=int[d][3]
1.读取稀疏数组sparseArr[0]={y,x,c}获得原始数组属性
y=原始数组一维长度
x=原始数组二维长度
c=原始数组有效值个数
2.则设定二维原始数组array=int[y][x]
3.便利sparseArr[1~d-1]读取有所有效值及对应原始数组一维二维索引,并存储于原始数组
设如sparseArr[l]={n,m,k},则原始数组赋值
array[n][m]=k
DEMO
package com.lxh.structure.array;
/**
* @author: lxh
* @Date: 2019/8/4 0004 17:46
* @description: 稀疏数组
*/
public class SparseArray
{
/**
* @Description: 稀疏数组转化
* @author lxh
* @date 2019/8/4 0004 18:14
*/
public static void main(String[] args)
{
// 创建一个原始的二维数组 11 * 11
int[][] array = new int[11][11];
array[1][2] = 1;
array[2][3] = 2;
array[4][5] = 2;
// 输出原始的二维数组
System.out.println("原始的二维数组~~");
displayArray(array);
int[][] sparseArr = coverToSparseArray(array);
System.out.println("得到稀疏数组为~~~~");
displayArray(sparseArr);
int[][] ordinaryArray = coverToOrdinaryArray(sparseArr);
System.out.println("恢复后的二维数组~~~~");
displayArray(ordinaryArray);
}
/**
* @param sparseArr 原始数组
* @return int[][] 原始数组
* @desc : 稀疏数组->原始数组
* @author lxh
* @date 2021/5/19 0019 1:19
**/
public static int[][] coverToOrdinaryArray(int[][] sparseArr)
{
//1.声明原始数组
int[][] array = new int[sparseArr[0][0]][sparseArr[0][1]];
//2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可
for (int i = 1; i < sparseArr.length; i++)
{
array[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
return array;
}
/**
* @param array 原始数组
* @return int[][] 稀疏数组
* @desc : 原始数组->稀疏数组
* @author lxh
* @date 2021/5/19 0019 1:19
**/
public static int[][] coverToSparseArray(int[][] array)
{
// 1. 先遍历二维数组 得到非0数据的个数
int sum = 0;
for (int i = 0; i < array.length; i++)
{
int[] row = array[i];
for (int j = 0; j < row.length; j++)
{
if (row[j] != 0)
{
sum++;
}
}
}
// 2. 创建对应的稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = array.length;
sparseArr[0][1] = array[0].length;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的值存放于sparseArr中
//count 用于记录是第几个非0数据
int count = 0;
for (int i = 0; i < array.length; i++)
{
int[] row = array[i];
for (int j = 0; j < row.length; j++)
{
if (row[j] != 0)
{
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = row[j];
}
}
}
return sparseArr;
}
public static void displayArray(int[][] array)
{
for (int[] row : array)
{
for (int data : row)
{
System.out.printf("%d\t", data);
}
System.out.println();
}
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 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
得到稀疏数组为~~~~
11 11 3
1 2 1
2 3 2
4 5 2
恢复后的二维数组~~~~
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 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