稀疏数组
基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
稀疏数组的处理方式是:
- 记录一个数组一共有几行几列,有多少个不同的值
- 把具有不同值得元素的行列及值记录到一个小规模的数组中,从而缩小程序的规模
二维数组:
0 0 0 0
0 1 0 0
0 0 2 0
0 0 0 0
稀疏数组:
COL | ROW | VALUE | |
---|---|---|---|
[0] | 总行 | 总列 | 有效数据 |
[1] | 1 | 1 | 1 |
[2] | 2 | 2 | 2 |
应用实例
- 使用稀疏数组,来保存二维数组
- 把稀疏数组存储,并且可以重新恢复原来的二维数组
- 整体思路:
二维数组↔稀疏数组↔文件
二维数组转稀疏数组的思路
> 1. 遍历原始的二维数组,得到有效数据的个数sum
> 2. 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
> 3. 将二维数组的有效数据存入到稀疏数组
稀疏数组转原始的二维数组的思路
> 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
> 2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
代码实现
/**
* @author huangqh
* @create 2020/11/16 17:48
* @Notes 稀疏数组->1.原数组中存储大量无效数据 占用大量存储空间2.稀疏数组可以避免资源占用,提高I/O效率
*/
public class SparseArr {
public static void main(String[] args) throws IOException {
/**
* <p>
* 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 0
* </p>
*/
//创建原始二维数组11*11,0为无效数据
int[][] initialArray =new int[11][11];
initialArray[1][1]=1;
initialArray[2][2]=2;
SparseArr.ergodic(initialArray);
/**
* <p>
* 11 11 2
* 1 1 1
* 2 2 2
* </p>
*/
//sum 获取全部非0数据个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (initialArray[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int[][] sparseArr= new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//count当前第几个非0数据
int count=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (initialArray[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = initialArray[i][j];
}
}
}
SparseArr.ergodic(sparseArr);
SparseArr.sparse2txt(sparseArr);
int[][] arr = SparseArr.txt2sparse();
//将稀疏数组转为二维数组
// int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i <= count; i++) {
arr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
SparseArr.ergodic(arr);
}
/**
* 遍历数组并打印到控制台
* @param initialArray
*/
private static void ergodic(int[][] initialArray) {
for (int[] ints : initialArray) {
for (int anInt : ints) {
System.out.printf("%d\t", anInt);
}
System.out.println();
}
}
/**
* 稀疏数组持久化到磁盘
* @param arr
* @throws IOException
*/
private static void sparse2txt(int[][] arr) throws IOException {
File file = new File("sparse.txt");
if (!file.exists()) {
file.createNewFile();
}
FileWriter writer = new FileWriter(file);
for(int i =0; i < arr.length; i++) {
if (i==arr.length-1){
writer.append(arr[i][0]+","+arr[i][1]+","+arr[i][2]);
}else {
writer.append(arr[i][0]+","+arr[i][1]+","+arr[i][2]+",");
}
}
writer.flush();
}
/**
* 磁盘读取文件,转为稀疏数组
* @return
* @throws IOException
*/
private static int[][] txt2sparse() throws IOException {
File file = new File("sparse.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
StringBuffer sb = new StringBuffer();
while (reader.ready()){
sb.append((char) reader.read());
}
System.out.println(sb.toString());
reader.close();// 关闭读取流
fis.close();// 关闭输入流,释放系统资源
String[] str = sb.toString().split(",");
int[][] sparseArrHf = new int[str.length / 3][3];
// 给稀疏数组赋值
int i = 0;
for (String s : str) {
sparseArrHf[(i - (i % 3)) / 3][i % 3] = Integer.parseInt(s);
i++;
}
return sparseArrHf;
}
}