1.稀疏数组
1.1 基本介绍
当一个数组中大部分元素为0,或者为同一个数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法:
- 记录一个数组的size,有多少个不同的值
- 把具有不同值的元素的下标和值记录在一个小规模数组(稀疏数组)中,从而缩小程序的规模
1.2 经典案例
该二维数组的很多默认值是0,因此记录了许多没有意义的数据—>稀疏数组
1.3思路分析
1.3.1 二维数组转稀疏数组的思路:
- 遍历原始的二维数组,得到原始数组中的有效数据的个数sum
- 根据sum的值创建一个稀疏数组sparseArray
- 将二维数组的有效数据存入到稀疏数组中
1.3.2 稀疏数组转原始的二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据创建原始的二维数组
- 读取稀疏数组后几行的数据,并赋给原始的基本数组
1.4 稀疏数组的代码实现
public class SparseArrayTest01 {
public static void main(String[] args) throws IOException {
// 创建一个原始11 * 11的二维数组
// 0 表示没有棋子,1表示黑子,2表示白字
int[][] chessArray = new int[11][11];
// 给棋盘赋初值
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
chessArray[i][j] = 0;
}
}
chessArray[1][2] = 1;
chessArray[2][3] = 2;
int[][] sparseArray = originTosparse(chessArray);
printArray(sparseArray);
printArray(sparseToOrigin(sparseArray));
}
// 将原始数组转换为稀疏数组的方法
public static int[][] originTosparse(int[][] origin) {
// 获取原始数组的行和列
int rowLength = origin.length;
int columnLength = origin[0].length;
// 对二维数组进行遍历,寻找不为零的元素
int sum = 0;
for (int i = 0; i < rowLength; i++) {
for (int j = 0; j < columnLength; j++) {
if (origin[i][j] > 0) {
sum = sum + 1;
}
}
}
System.out.println(sum);
// 创建一个sum + 1行3列的数组
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = rowLength;
sparseArray[0][1] = columnLength;
sparseArray[0][2] = sum;
int rowCount = 1;
for (int i = 0; i < rowLength; i++) {
for (int j = 0; j < columnLength; j++) {
if (origin[i][j] > 0) {
sparseArray[rowCount][0] = i;
sparseArray[rowCount][1] = j;
sparseArray[rowCount++][2] = origin[i][j];
}
}
}
return sparseArray;
}
// 定义一个打印函数
public static void printArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.printf("%d\t", array[i][j]);
}
System.out.println();
}
}
// 将稀疏数组恢复成原始数组
public static int[][] sparseToOrigin(int[][] sparse) {
// 首先应当读取稀疏数组的第一行,获取原始数组的行信息,列信息
int rowLength = sparse[0][0];
int columnLength = sparse[0][1];
// 根据读取到的数据创建原始数组
int[][] origin = new int[rowLength][columnLength];
// 原始数组赋初值
for (int i = 0; i < rowLength; i++) {
for (int j = 0; j < columnLength; j++) {
origin[i][j] = 0;
}
}
// 对稀疏数组进行遍历
for (int i = 1; i < sparse.length; i++) {
origin[sparse[i][0]][sparse[i][1]] = sparse[i][2];
}
return origin;
}
}