基本介绍
当一个二维数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
如下图
二维数组与稀疏数组转换(java)
/**
@author 陈治远
@create 2019-07-24 11:14
*/
public class SparseArray {
public static void main(String[] args) {
int[][] dubboDimensionalArray = new int[10][10];
dubboDimensionalArray[2][6] = 9;
dubboDimensionalArray[3][3] = 8;
dubboDimensionalArray[8][6] = 6;
dubboDimensionalArray[5][9] = 1;
dubboDimensionalArray[7][4] = 8;
System.out.println("二维数组:");
printArray(dubboDimensionalArray);
// 二维数组转稀疏数组
int[][] sparseArray = toSparseArray(dubboDimensionalArray);
System.out.println("二维数组转稀疏数组:");
printArray(sparseArray);
// 稀疏数组转二维数组
int[][] dubboDimensionalArray2 = toDubboDimensionalArray(sparseArray);
System.out.println("稀疏数组转二维数组:");
printArray(dubboDimensionalArray2);
}
/**
* 将稀疏数组转成二维数组
* 步骤:
* 1.读取稀疏数组的第0行,得到原来的二维数组有m行n列
* 2.创建一个m行n列的二维数组
* 3.遍历稀疏数组,对二维数组赋值
* @param sparseArray 要被转换的稀疏数组
* @return 返回转换后得到的二维数组
*/
public static int[][] toDubboDimensionalArray(int[][] sparseArray) {
// 得到二维数组有m行n列
int m = sparseArray[0][0];
int n = sparseArray[0][1];
// 创建一个二维数组
int[][] dubboDimensionalArray = new int[m][n];
// 遍历稀疏数组并对dubboDimensionalArray赋值
for (int i = 1; i < sparseArray.length; i++) {
int row = sparseArray[i][0];
int col = sparseArray[i][1];
int value = sparseArray[i][2];
dubboDimensionalArray[row][col] = value;
}
return dubboDimensionalArray;
}
/**
* 将二维数组转成稀疏数组
* 步骤:
* 1.先遍历二维数组,得到非0数据的个数count
* 2.创建一个新数组,数组有 count+1 行 3 列,int[count+1][3]
* 3.对新数组初始化
* 3.1 第一行代表原二维数组的行列数和非0值的个数
* 3.1 第二行以及之后的行表示原数组中非0值的位置和值
* @param dubboDimensionalArray 要被转换的二维数组
* @return 返回转换后得到的稀疏数组
*/
public static int[][] toSparseArray(int[][] dubboDimensionalArray) {
// 得到二维数组的行列数
int row = dubboDimensionalArray.length;
int col = dubboDimensionalArray[0].length;
// 得到非0值的个数
int count = 0;
for (int[] ints : dubboDimensionalArray) {
for (int anInt : ints) {
if (anInt != 0) {
count++;
}
}
}
// 定义一个新数组(稀疏数组)
int[][] sparseArray = new int[count + 1][3];
// 初始化稀疏数组
// 先初始化稀疏数组的第0行
sparseArray[0][0] = row;
sparseArray[0][1] = col;
sparseArray[0][2] = count;
// 将count重置为1,用来标记稀疏数组下次初始化的行s是哪行,1表示下次是第1行
count = 1;
// 初始化稀疏数组的第二行以及之后的行
for (int i = 0; i < dubboDimensionalArray.length; i++) {
for (int j = 0; j < dubboDimensionalArray[i].length; j++) {
if (dubboDimensionalArray[i][j] != 0) {
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = dubboDimensionalArray[i][j];
count++;
}
}
}
return sparseArray;
}
public static void printArray(int[][] array) {
for (int[] ints : array) {
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 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0
0 0 0 8 0 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 8 0 0 0 0 0
0 0 0 0 0 0 6 0 0 0
0 0 0 0 0 0 0 0 0 0
二维数组转稀疏数组:
10 10 5
2 6 9
3 3 8
5 9 1
7 4 8
8 6 6
稀疏数组转二维数组:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0
0 0 0 8 0 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 8 0 0 0 0 0
0 0 0 0 0 0 6 0 0 0
0 0 0 0 0 0 0 0 0 0
使用场景:当需要将一个二维数组存入磁盘,而二维数组中有大量无用数据时,将之转换成稀疏数组再存储,可以节约磁盘空间。