数据结构之稀疏数组
原理
稀疏数组的基本介绍:就是将一个有很多相同值的数组用更少的空间储存起来的一种数据结构。
简单的来说:就是用一种消耗更小储存空间的方式来存储有很多相同值的数组。
举一个例子:
加入有一个数组11行11列基本上全是0,有两个不一样的,第一个是第二行第二列为1,第二个为第三行第三列为2。我们就可以转化为下列稀疏数组。
稀疏数组的行数 | 有效值的位置的行数 | 有效值的位置的列数 | 值 |
---|---|---|---|
第0行 | 11代表原数组一共有11行 | 11代表原数组一共有11行 | 2代表一共有2个关键值 |
第1行 | 位置都是下标1 | 1 | 1 |
第2行 | 2 | 2 | 2 |
Java实现
转化为稀疏数组并存入磁盘
package DataStructure.稀疏数组;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* @USER: 杨亚鹏
* @DATE: 2021/8/16
* @TIME: 16:36
* @DAY_NAME_FULL: 星期一
*/
public class Main {
public static void main(String[] args) throws IOException {
//首先我们先创建一个原始的二维数组
int[][] array = new int[11][11];
array[1][1] = 1;
array[2][2] = 2;
System.out.println("原始二维数组");
print(array);
//我们开始压缩数组,首先先获得非0数据的个数
int sum=0;
for (int i[] : array){
for (int j : i){
if (j!=0) sum++;
}
}
//验证是否正确
// System.out.println(sum);
//创建稀疏数组
int[][] sparsearray = new int[sum+1][3];
//给稀疏数组赋值
sparsearray[0][0] = array.length;
sparsearray[0][1] = array[0].length;
sparsearray[0][2] = sum;
int count = 1;
//遍历
for (int i =0; i < array.length; i++){
for (int j=0; j < array[0].length; j++){
if (array[i][j] != 0){
sparsearray[count][0] = i;
sparsearray[count][1] = j;
sparsearray[count][2] = array[i][j];
count++;
}
}
}
System.out.println("稀疏数组为:");
print(sparsearray);
//写入磁盘
File file = new File("test.txt");
FileWriter fileWriter = new FileWriter(file);
for (int i[] : sparsearray){
for ( int j : i){
fileWriter.write(j+"\t");
}
fileWriter.write("\n");
}
fileWriter.close();
System.out.println("成功写入磁盘");
}
public static void print(int a[][]){
for (int i[] : a){
for (int j : i){
System.out.printf("%d\t",j);
}
System.out.println();
}
}
}
从磁盘中读取,并且转化为原数组
package DataStructure.稀疏数组;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @USER: 杨亚鹏
* @DATE: 2021/8/16
* @TIME: 17:11
* @DAY_NAME_FULL: 星期一
*/
public class Main1 {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("读取磁盘文件");
File file = new File("test.txt");
FileInputStream fileInputStream = new FileInputStream(file);
Scanner in = new Scanner(fileInputStream);
List list = new ArrayList();
while (in.hasNext()){
list.add(in.next());
}
int size = list.size();
int[][] sparsearray = new int[size/3][3];
for (int i = 0; i < sparsearray.length; i++){
for (int j = 0; j < sparsearray[0].length; j++){
String t = (String) list.get(0);
sparsearray[i][j] = Integer.valueOf(t);
list.remove(0);
}
}
System.out.println("稀疏数组为");
print(sparsearray);
//转化稀疏数组
int[][] array = new int[sparsearray[0][0]][sparsearray[0][1]];
for (int i=1; i <= sparsearray[0][2]; i++){
array[sparsearray[i][0]][sparsearray[i][1]] = sparsearray[i][2];
}
System.out.println("原数组为");
print(array);
}
public static void print(int a[][]){
for (int i[] : a){
for (int j : i){
System.out.printf("%d\t",j);
}
System.out.println();
}
}
}