稀疏数组
概念
稀疏数组的出现主要是对普通数据的一种压缩式转化,如果普通数据中存在大量相同字符,稀疏数组即可进行转化为内存空间较小的数据,如:
普通数组:
0 0 0 0 0
0 1 0 0 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0
该数组中存在大量相同字符 0 ,可将其转化为稀疏数组:
row col value
5 5 2
1 1 1
2 2 2
该数组将上面 5*5 的二维数组,转化为 3 * 3 的二维数组,
该数组:
-
第一行是记录普通数组对应的总行数、总列数、总共值的个数(不为0的值的个数)
-
第二行以后,具体记录行下标、列下标、对应的值
-
行数不确定,列数为3
以上即为 稀疏数组
普通数组与稀疏数组转化
package cn.com;
/**
* 稀疏数组
*/
public class SparseArray {
public static void main(String[] args) {
// 1.获取普通数组
int[][] normalArray = getNormalArray();
// 2.输出普通数组到控制台
print2Console(normalArray);
// 3.普通数组转化为 稀疏数组
int[][] sparseArray = convertNormal2Sparse(normalArray);
// 4. 输出稀疏数组到控制台
print2Console(sparseArray);
// 5. 稀疏数组转化为 普通数组
int[][] newNormalArray = convertSparse2Normal(sparseArray);
// 6. 输出转化后的普通数组到控制台
print2Console(newNormalArray);
}
// 获取普通数组
public static int[][] getNormalArray(){
int[][] normalArray = new int[5][5];
normalArray[1][1] = 1;
normalArray[2][2] = 2;
return normalArray;
}
// 输出内容到控制台
public static void print2Console(int[][] array){
for (int[] rows : array){
for(int v : rows){
System.out.print(v);
}
System.out.println();
}
System.out.println("-----------------");
}
public static int[][] convertNormal2Sparse(int[][] normalArray){
// 求出总行数、总列数、总值个数
int sum = 0;
for(int[] rows : normalArray){
for(int v : rows){
if(v != 0){
sum ++;
}
}
}
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = normalArray.length;
sparseArray[0][1] = normalArray[0].length;
sparseArray[0][2] = sum;
int index = 0;
for(int row = 0; row < normalArray.length; row ++){
for(int col = 0; col < normalArray[row].length; col ++){
if(normalArray[row][col] != 0){
index ++;
sparseArray[index][0] = row;
sparseArray[index][1] = col;
sparseArray[index][2] = normalArray[row][col];
}
}
}
return sparseArray;
}
public static int[][] convertSparse2Normal(int[][] sparseArray){
int[][] normalArray = new int[sparseArray[0][0]][sparseArray[0][1]];
for(int row = 1; row < sparseArray.length; row ++){
normalArray[sparseArray[row][0]][sparseArray[row][1]] = sparseArray[row][2];
}
return normalArray;
}
}
************************ 控制台输出内容 *********************************
00000
01000
00200
00000
00000
-----------------
552
111
222
-----------------
00000
01000
00200
00000
00000
-----------------