二维数组与稀疏数组
稀疏数组
定义
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组。
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
二维数组:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 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 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0
==========================
二维数组转稀疏数组
10 12 3
3 2 1
7 6 1
9 3 2
存储结构
第一行存储原始数据总行数,总列数,总的非0数据个数;
接下来每一行都存储非0数所在行,所在列,和具体值 。
rows cols n
r1 c1 val1
r2 c2 val2
. . .
. . .
rn cn valn
二维数组与稀疏数组之间的转换
package cn.tedu.Array;
public class xsArray {
public static void main(String[] args) {
System.out.println("原始数组:");
int[][] ysArray = new int[10][10];
ysArray[3][5] = 1;
ysArray[7][9] = 2;
int sum = 0;
for (int i = 0; i < ysArray.length; i++) {
for (int j = 0; j < ysArray[i].length; j++) {
if (ysArray[i][j] != 0) {
sum++;
}
System.out.print(ysArray[i][j] + "\t");
}
System.out.println();
}
System.out.println("=========================================================");
System.out.println("稀疏数组:");
int[][] xsArray = new int[sum + 1][3];
xsArray[0][0] = ysArray.length;
xsArray[0][1] = ysArray[0].length;
xsArray[0][2] = sum;
int count = 0;
for (int i = 0; i < ysArray.length; i++) {
for (int j = 0; j < ysArray[i].length; j++) {
if (ysArray[i][j] != 0) {
count++;
xsArray[count][0] = i;
xsArray[count][1] = j;
xsArray[count][2] = ysArray[i][j];
}
}
}
for (int i = 0; i < xsArray.length; i++) {
for (int j = 0; j < xsArray[i].length; j++) {
System.out.print(xsArray[i][j] + "\t");
}
System.out.println();
}
System.out.println("=========================================================");
System.out.println("稀疏数组还原成原始数组:");
int[][] hyArray = new int[xsArray[0][0]][xsArray[0][1]];
for (int i = 1; i < xsArray.length; i++) {
hyArray[xsArray[i][0]][xsArray[i][1]] = xsArray[i][2];
}
for (int i = 0; i < hyArray.length; i++) {
for (int j = 0; j < hyArray[i].length; j++) {
System.out.print(hyArray[i][j] + "\t");
}
System.out.println();
}
}
}
二维数组:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 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 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0
==========================
二维数组转稀疏数组
10 12 3
3 2 1
7 6 1
9 3 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 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 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 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0 0