稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时。可以使用稀疏数组来保存该数组,可有效减少存储空间。
存储方法:
1)记录数组一共有几行几列和有多少个不同的值
2)把具有不同值的元素是的行列及值记录在一个小规模的数组中,从而缩小程序的规模
例如下面二维数组
将该数组转换成稀疏数组应该为下表所示
行 | 列 | 值 |
---|---|---|
6 | 7 | 8 |
0 | 3 | 22 |
0 | 6 | 15 |
1 | 1 | 11 |
1 | 5 | 17 |
2 | 3 | -6 |
3 | 5 | 39 |
4 | 0 | 91 |
5 | 2 | 28 |
该表的第一行数字分别代表原数组的行数、列数、和有多少个有效值
下面每行数字分别表示第几行、第几列,的数字是多少。
例如第二行的0,3,22表示二维数组arr[0][3]=22
下面展示代码实现将二维数组转为稀疏数组
public class 稀疏数组 {
public static void main(String[] args) {
int[][] arr=new int[10][10]; //创建一个二维数组
arr[2][3]=1;
arr[3][5]=2;
arr[6][8]=2;
int num=0; //记录有效数字的个数
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
if(arr[i][j]!=0) {
num++;
}
}
}
int[][] arr2=new int[++num][3]; //根据上面统计的个数创建稀疏矩阵的大小
int count=0;
arr2[count][0]=arr.length; //稀疏矩阵第一行存储原数组的行、列和有效个数
arr2[count][1]=arr[0].length;
arr2[count++][2]=num-1;
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) { //将有效元素进行存储
if(arr[i][j]!=0) {
arr2[count][0]=i;
arr2[count][1]=j;
arr2[count++][2]=arr[i][j];
}
}
}
/*创建的矩阵arr
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 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 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
*/
/*生成的稀疏矩阵arr2
10 10 3
2 3 1
3 5 2
6 8 2
*/
稀疏数组转换为二维数组
这个跟上面的操作正好相反,直接上代码!
int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
for(int i=1;i<arr2.length;i++) {
arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];
}
//遍历arr3
for(int i=0;i<arr3.length;i++) {
for(int j=0;j<arr3[i].length;j++) {
System.out.printf("%d\t",arr3[i][j]);
}
System.out.println();
}
/*arr3的遍历结果
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 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 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
*/