1.定义
稀疏数组是一种二维数组。当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组是一种n行3列的二维数组,其行数n取决于原数组中不为0数的个数。
2.稀疏数组的处理方法
(1)记录数组一共有几行几列,有多少个数不为0值,稀疏数组中第一行存放的数据是原数组中共有几行、几列、有多少个数不为0值。
|
(2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
3.举例运用
现有如下一个二维数组,将它转换为一个稀疏数组:
![原数组](https://img-blog.csdnimg.cn/1831d645f6a54983b0d4f5d65f2b9f09.png)
转换步骤:
1.先确定原数组共有多少行(6行)、多少列(7列)、多少个不为0的数(8个)
因此,稀疏数组第一行的数据为:
2.看原数组第 i 行中不为0的元素所在的列数、以及元素大小:
(1)原数组第1行:不为0的数分别为22、15,其所在行下标为0,其所在的列数下标为3和6,所以其转换后的稀疏数组为:
(2)原数组第2行:不为0的数分别为11、17,其所在行下标为1,其所在的列数下标为1和5,所以其转换后的稀疏数组为:
....................
(6)原数组第6行:不为0的数为28,其所在行下标为5,其所在的列数下标为2,所以其转换后的稀疏数组为:
其得到的一个稀疏数组如下:
![稀疏数组](https://img-blog.csdnimg.cn/369afb07fa904f17802b5290e0833981.png)
4.代码实现
/**
* 稀疏数组:
* 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
* 处理方法:
* 1.稀疏数组第一行记录数组一共有几行几列,有多少个不同的值
* 2.后面每一行记录原始数组中不为0元素所在的行和列以及值,从而缩小程序的规模
*/
public class sparseArrDemo {
public static void main(String[] args) {
//创建一个原始的二维数组
int[][] chessArr =
{{0, 0, 0, 22, 0, 0, 15},
{0, 11, 0, 0, 0, 17, 0},
{0, 0, 0, -6, 0, 0, 0},
{0, 0, 0, 0, 0, 39, 0},
{91, 0, 0, 0, 0, 0, 0},
{0, 0, 28, 0, 0, 0, 0}};
//输出原始二维数组
System.out.println("原始二维数组为:");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//将二维数组转换为稀疏数组
System.out.println("将二维数组转换为稀疏数组:");
//1.先遍历二维数组,得到非0数据的个数
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
//2.创建对应的稀疏数组
int sparseArr[][] = new int[sum + 1][3];
//给稀疏数组赋值
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count = 0;//用于记录是第几个非0数据
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//输出稀疏数组
for (int[] row : sparseArr) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
效果实现: