稀疏数组的含义
Java实现代码
public static void main(String[] args) {
int[][] arrays1=new int[11][11];
arrays1[1][2]=1;
arrays1[2][3]=2;
System.out.println("输出原始数组为:");
//System.out.println(Arrays.deepToString(arrays1));Java提供的二维数组打印方法只能一行输出
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
System.out.print(arrays1[i][j]+"\t");
}
System.out.println();
}
//下方c-foreach循环复杂度也差不多
/*for (int[] ints : arrays1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}*/
int sum=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (arrays1[i][j] != 0) {
sum++;
}
}
}
System.out.println("二维数组有效元素个数为:"+sum);
System.out.println("============创建过程(压缩)============");
//正式创建一个稀疏数组(牺牲时间换取空间的压缩方法)
//本质上是将一个正常数组的非零元素保留o元素舍去的一种压缩算法
int[][] arrays2 = new int [sum+1][3];
//稀疏数组的每一行代表着有效元素所在源数组的:行,列,值信息(此处的sum+1是因为下方第一行要存放稀疏数组的特征信息)
arrays2[0][0] = arrays1.length;
arrays2[0][1] = arrays1[0].length;
arrays2[0][2] = sum;
//第一行记录了源数组的行,列,有效元素个数信息
int count = 0;
for (int i = 0; i < arrays1.length; i++) {//行
for (int j = 0; j < arrays1[i].length; j++) {//列
if (arrays1[i][j] != 0) {
count++;//[0][0]存放了arrays1这个二维数组的特征信息(11行11列2个有效元素)
arrays2[count][0] = i;//记录行
arrays2[count][1] = j;//记录列
arrays2[count][2] =arrays1[i][j];//记录有效元素
}
}
}
System.out.println("稀疏数组:");
for (int i = 0; i < arrays2.length; i++) {
System.out.println(arrays2[i][0]+"\t"+arrays2[i][1]+"\t"+arrays2[i][2]+"\t");
}
System.out.println("============还原过程(解压缩)============");
int[][] arrays3 =new int[arrays2[0][0]][arrays2[0][1]];//取回特征值(源数组行列信息)
for (int i = 1; i < arrays2.length; i++) {//此处i=0存放的是源数组的特征信息不必读取,应从i=1读起
arrays3[arrays2[i][0]][arrays2[i][1]]=arrays2[i][2];
}
for (int[] ints : arrays3) {
for (int anInt : ints) {
System.out.print(anInt+"\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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 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 2
1 2 1
2 3 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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
进程已结束,退出代码0