概念
用来压缩无效数据(重复且只代表单一意义或状态的数据)较多的数组,减少空间损耗。
方法
普通储存的稀疏数组的列数是固定的,只有三列。
稀疏数组的第一行各列分别记录原始数组的行数,列数,有效值个数。
往后的每行记录各个有效值的 坐标 和 值。
第一列记录有效值的行数,第二列记录有效值的列数,第三列记录有效值的值
所以稀疏数组列数固定为 3,行数为 有效值个数+1。
实现(java)
1.创建一个11*11的原数组
int[][] arr = new int[11][11];//创建一个原数组
arr[1][2] = 1;//初始化原数组条件
arr[2][3] = 2;
arr[3][5] = 4;
arr[5][6] = 5;
int count = 0;//记录数组里有效数字的个数
for (int[] row:arr){
for (int item:row){
System.out.print(item+"\t");//遍历输出数组
if (item != 0)
count++;//计数有效数字
}
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 4 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
2.创建稀疏数组并将有效值的坐标赋值给稀疏数组
int[][] sparseArrOut = new int[count+1][3];//根据count创建稀疏数组
sparseArrOut[0][0] = 11;
sparseArrOut[0][1] = 11;
sparseArrOut[0][2] = count;//第一行的初始化
int k=1;//稀疏数组记录有效值的行数
for (int i=0; i<arr.length; i++){
for (int j=0; j<arr[i].length; j++){
if (arr[i][j] != 0){ //进行列的赋值
sparseArrOut[k][2] = arr[i][j];
sparseArrOut[k][0] = i;
sparseArrOut[k][1] = j;
k++;
}
}
}
3.稀疏数组的磁盘IO读写
try {
//将数组写出到磁盘上
FileWriter os = new FileWriter(new File("E:/a.txt"));
for (int[] row : sparseArrOut){
for (int item : row){
os.write(item+"\t");
}
os.write("\r\n");
}
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//读入稀疏数组
int[][] sparseArrIn = new int[count+1][3];
try {
BufferedReader br = new BufferedReader(new FileReader(new File("E:/a.txt")));
String line;
int row = 0;//行数
while ((line = br.readLine()) != null){
String[] temp = line.split("\t");
for (int j=0; j<temp.length; j++){
sparseArrIn[row][j] = Integer.parseInt(temp[j]);
}
row++;
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//遍历输出
for (int[] row : sparseArrIn) {
for (int item : row) {
System.out.print(item + "\t");
}
System.out.println();
}
------------------------------------------
11 11 4
1 2 1
2 3 2
3 5 4
5 6 5
4.还原数组
//还原数组
int[][] origin = new int[sparseArrIn[0][0]] [sparseArrIn[0][1]];//创建空的原数组
for (int i=1; i<sparseArrIn.length; i++){
origin[sparseArrIn[i][0]] [sparseArrIn[i][1]] = sparseArrIn[i][2];//将数组还原
}
for (int[] row1 : origin){//遍历输出
for (int item : row1){
System.out.print(item+"\t");
}
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 4 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