前言
主要内容:主要介绍了稀疏数组的概念及稀疏数组与二维数组之间的相互转换
一、为什么要使用稀疏数组?
当一个数组存在大量重复数据时,比较占用空间,而通过稀疏数组来保存原数组,就可以达到节省空间的目的.
二、稀疏数组的概念
一个存在大量重复元素的数组A,通过另一个数组B来简化和保存原数组 A,以此来缩小数组A的规模,这个数组B就叫做稀疏数组.
三、稀疏数组的表示
稀疏数组的格式为下表:
row(行) | row(列) | val(值) |
---|---|---|
此处为原数组的总行数 | 此处为原数组的总列数 | 此处为原数组有效元素个数(即不同于原数组重复值的元素个数) |
第一个有效元素的行数(从第0行起) | 第一个有效元素的列数(从第0列起) | 第一个有效元素的值 |
第二个有效元素的行数 | 第二个有效元素的行数 | 第二个有效元素的值 |
第三个… | … | … |
假设有一个二维数组(6*6)如下图:
0 | 1 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 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 |
转换为稀疏数组后如图所示:
row | col | val |
---|---|---|
6 | 6 | 3 |
0 | 1 | 1 |
1 | 4 | 1 |
2 | 5 | 2 |
四、稀疏数组与二维数组之间的相互转换
1.二维数组转换为稀疏数组
思路:
(1).
获取二维数组的行数(数组名.length)、列数(数组名[0].length)、有效元素个数
(2).
创建稀疏数组
(3)
输入元素到稀疏数组
例子:
创建一个8*8的二维数组
// 6*6二维数组的创建
int InitialArr[][] = new int[8][8];
// 预先放置几个有效元素 其余元素置为0
InitialArr[0][1] = 1;
InitialArr[1][2] = 2;
InitialArr[2][4] = 5;
// 遍历输出该数组
for (int i = 0; i < InitialArr.length; i++) {
for (int j = 0; j < InitialArr[0].length; j++) {
System.out.printf("%s\t", InitialArr[i][j]);
}
System.out.println(); // 打印完一行后换行
}
创建结果如图:
0 1 0 0 0 0 0 0
0 0 2 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
转换:
int sum = 0; //获取有效元素个数
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(InitialArr[i][j]!=0){
sum++;
}
}
}
// 由稀疏数组格式知 稀疏数组的行数为有效元素个数+1 列数始终为3
// 创建稀疏数组
int SparseArray1[][] = new int[sum+1][3];
SparseArray1[0][0] = 8;
SparseArray1[0][1] = 8;
SparseArray1[0][2] = sum; //第一行数据填入
int count = 0;
// count作为有效元素个数的依据
//依次第一个、第二个....有效元素填入稀疏数组
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(InitialArr[i][j]!=0){
SparseArray1[count+1][0] = i; //填入行
SparseArray1[count+1][1] = j; //填入列
SparseArray1[count+1][2] = InitialArr[i][j]; //填入值
count++;
}
}
}
// 输出稀疏数组
for (int i = 0; i < sum+1; i++) {
System.out.printf("%d %d %d ",SparseArray1[i][0],SparseArray1[i][1],SparseArray1[i][2]);
System.out.println();
}
结果如图:
8 8 3
0 1 1
1 2 2
2 4 5
2.稀疏数组转换为二维数组
思路:
(1).
读取稀疏数组第一行信息,根据得到的行列数和有效元素个数创建二维数组
(2).
再获取有效元素的行列数与值,赋给二维数组即可
以上面例子中的稀疏数组为例:
// 获取稀疏数组的行列数创建二维数组
int row1 = SparseArray1[0][0];
int col1 = SparseArray1[0][1];
int TestArray[][] = new int[row1][col1];
// 将有效元素填入数组
for (int i = 1; i < SparseArray1.length; i++) {
TestArray[SparseArray1[i][0]][SparseArray1[i][1]] = SparseArray1[i][2]; //根据稀疏数组的行列值填
}
// 输出二维数组
for (int i = 0; i < row1; i++) {
for (int j = 0; j < col1; j++) {
System.out.printf("%s\t",TestArray[i][j]);
}
System.out.println();
}
输出结果:
0 1 0 0 0 0 0 0
0 0 2 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
比对最开始的二维数组可知结果正确
总结
如有错误 欢迎评论区指正