文章目录
一、稀疏数组是什么?
当一个数组中大部分元素是0,或为同一个值的时候,可以使用稀疏数组来保存数组。它是一个十分有效的存储结构,便于节省存储空间。
二、应用实例
这里有个需求,通过二维数组来模拟棋盘状态,显然此时数组中大部分元素为零,为了节省空间,可以考虑使用稀疏数组。
二维数组转稀疏数组的思路是:
- 记录数组一共有几行几列,有多少不同的值。如上图所示,二维数组为11*11,共有两个有效数据,1和2。
- 创建稀疏数组int sparseArr[3][3],第一行为二维数组的行数、列数、有效值个数。后面两行记录的是有效值的位置和它的值。
稀疏数组转二维数组的思路是:
- 先读取稀疏数组的第一行,创建11*11的二维数组。
- 依次遍历之后各行,将有效值填充进二维数组。
三、代码实现
package com.atguigu.sparsearray;
public class SpareArray {
public static void main(String[] args) {
//创建一个11*11二维数组
//0代表无子,1代表黑子,2代表蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
//输出原始二维数组
System.out.println("原始的二维数组~");
for(int[] row:chessArr1) {
for(int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//二维数组转稀疏数组
//1.遍历二维数组,找到有效数据
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {
int[] row = chessArr1[i];
for (int j = 0; j < row.length; j++) {
//判断是否为零
if(chessArr1[i][j] != 0) {
sum++;
}
}
}
//2.创建对应稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
//初始化第一行
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
//3.遍历二维数组,将有效数据存放到稀疏数组中
int count = 0;//count表示目前是第几个非零数据
for (int i = 0; i < chessArr1.length; i++) {
int[] row = chessArr1[i];
for (int j = 0; j < row.length; j++) {
if(chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//4.输出稀疏数组
System.out.println();
System.out.println("得到的稀疏数组为:");
for (int i = 0; i < sparseArr.length; i++) {
int[] row = sparseArr[i];
for (int j = 0; j <row.length ; j++) {
System.out.printf("%d\t",sparseArr[i][j]);
}
System.out.println();
}
//稀疏数组还原为二维数组
//1.读取稀疏数组第一行,获取二维数组的行数和列数
int chessArr2[][] = new int [sparseArr[0][0]][sparseArr[0][1]];
//2.通过稀疏数组后面若干行,还原二维数组
for (int i = 1; i < sparseArr.length; i++) {
int[] row = sparseArr[i];
chessArr2[row[0]][row[1]] = row[2];
}
//3.输出二维数组
System.out.println();
System.out.println("通过稀疏数组还原的二维数组:");
for (int i = 0; i < chessArr2.length; i++) {
int[] ints = chessArr2[i];
for (int j = 0; j < ints.length; j++) {
System.out.printf("%d\t",chessArr2[i][j]);
}
System.out.println();
}
}
}
运行结果