1.基本介绍
(1)当一个数组中大部分元素为0或为同一个值的数组时,可以用稀疏数组来保存该数组。
(2)稀疏数组的处理方法:
记录数组一共有几行几列,有多少个不同的值
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而达到缩小程序的规模的目的
(3)稀疏数组举例
![](https://img-blog.csdnimg.cn/img_convert/5c9af630467b0d2f4a054b99de3fa75d.png)
图1
![](https://img-blog.csdnimg.cn/img_convert/3a727e8ac39d7c809cc5db33b4abe893.png)
图2
如图所示,图1为一个六行七列的二维数组,图中共有8个非零数值。图2为一个稀疏数组,其中第一行记录了原始二维数组的行列数以及非零数据的个数,其余行记录了非零数据在原始二维数组中的位置以及数值大小。
2.稀疏数组的转换思路
(1)二维数组转稀疏数组:
遍历原始二维数组,得到有效数据的个数sum
根据sum创建稀疏数组int sparseArray[sum+1][3]
将二维数组的有效数据存入到稀疏数组
(2)稀疏数组转二维数组
先读取稀疏数组的第一行,根据一一行数据创建原始二维数组
在读取其余行数据,并且赋值给二维数组
3.代码实现
以图3图4为例实现稀疏数组与二维数组之间的互相转换
![](https://img-blog.csdnimg.cn/img_convert/1bbedc339fada5044e7fea608d1e0989.png)
图4
![](https://img-blog.csdnimg.cn/img_convert/fb7e519e30033a4dbc73ea92cc7b253f.png)
图4
package com.lzz.sparsearray;
public class SparseArray {
public static void main(String[] args) {
//创建原始二维数组11*11
int[][] chessArray=new int[11][11];
chessArray[2][3]=2;
chessArray[1][2]=1;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[0].length; j++) {
System.out.printf("%d\t",chessArray[i][j]);
}
System.out.println();
}
System.out.println("------------------------------------------------------");
//将二维数组转化成稀疏数组
//1.遍历二维数组得到非零数据
int sum = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[0].length; j++) {
if (chessArray[i][j] != 0){
sum++;
}
}
}
//创建对应的稀疏数组
int sparseArray[][]=new int[sum+1][3];
//给稀疏数组赋值
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
//遍历二维数组,将非零的值存放到sparseArray
int count = 0;//count用于记录是第几个非0数据
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[0].length; j++) {
if (chessArray[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArray[i][j];
}
}
}
System.out.println("得到的稀疏数组为");
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
//将稀疏数组恢复成原始二维数组
/*
1.先读取稀疏数组第一行,根据第一行的数据创建原始二维数组,
2.读取稀疏数组后几行,并赋值给原始二维数组
*/
int[][] chessArray2 = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
chessArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//输出恢复后的二维数组
System.out.println("恢复后的二维数组");
for (int i = 0; i < chessArray2.length; i++) {
for (int j = 0; j < chessArray2[0].length; j++) {
System.out.printf("%d\t",chessArray[i][j]);
}
System.out.println();
}
}
}
运行结果如下
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 2 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 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 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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
------------------------------------------------------
得到的稀疏数组为
11 11 2
1 2 1
2 3 2
恢复后的二维数组
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 2 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 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 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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
Process finished with exit code 0