当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值得元素的行列及值记录在一个小规模得数组中,从而缩小程序的规模
原始二维数组
0 0 0 0 0 0 0
0 0 0 0 0 2 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 6 0 0 0
稀疏数组
行(row) 列(col) 值(val)
[0] 6 7 3
[1] 1 5 2
[2] 2 0 -1
[3] 5 3 6
二维和稀疏相互转换
package 数据结构.稀疏数组;
import java.util.ArrayList;
import java.util.List;
/**
* 稀疏数组
* 2021.5.31
* zmz
*/
public class XiShu {
//声明一个二维数组
private static final int[][] intArray = new int[6][7];
static {
intArray[1][5] = 2;
intArray[2][0] = -1;
intArray[5][3] = 6;
}
public static void main(String[] args) {
XiShu xiShu = new XiShu();
System.out.println("二维数组:");
xiShu.printArray(intArray);
System.out.println("-----------------------");
System.out.println("稀疏数组:");
xiShu.printArray(xiShu.changeSparseArr());
}
/**
* 二维数组转稀疏数组
*/
int[][] changeSparseArr() {
//统计不等于0的个数,和所在位置
int sum = 0; //个数
List<Integer> rows = new ArrayList<>(); //行
List<Integer> cols = new ArrayList<>(); //列
List<Integer> vals = new ArrayList<>(); //值
for (int i = 0; i < intArray.length; i++) {
for (int j = 0; j < intArray[i].length; j++) {
if (intArray[i][j] != 0) {
sum++;
rows.add(i);
cols.add(j);
vals.add(intArray[i][j]);
}
}
}
//声明稀疏数组
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = intArray.length;
sparseArr[0][1] = intArray[0].length;
sparseArr[0][2] = sum;
//将行、列、值存入 sparseArr从下标1开始
for (int i = 0; i < rows.size(); i++) {
sparseArr[i + 1] = new int[]{rows.get(i), cols.get(i), vals.get(i)};
}
return sparseArr;
}
/**
* 打印
*/
void printArray(int[][] arry) {
for (int[] i : arry) {
for (int j : i) {
System.out.print(j + "\t");
}
System.out.println();
}
}
}