一、什么是稀疏数组呢?

定义一个11*11的二维数组int[ ][ ] cherryArr=new int[11][11]

数据结构和算法之稀疏数组_稀疏数组


其中

cherryArr1[1][2]=1;

cherryArr1[2][3]=2;

cherryArr1[4][4]=5;

那么它转换为稀疏数组是什么样的呢?

数据结构和算法之稀疏数组_二维数组_02


稀疏数组一共有三列,第一列是二维数组的某个数据的行,第二列是二维数组的某个数据的列;第三列是二维数组中的某个数据;该稀疏数组第一行例外,11 11 3各代表二维数组的行、列、多少个非0数据;


二、稀疏数组有什么用呢?

在处理如五子棋这种棋盘时,使用稀疏数组保存黑子和白子的位置,可以压缩数据,节约空间的目的;


三、稀疏数组和二维数组的相互转换

1.思路

数据结构和算法之稀疏数组_稀疏数组_03


2.代码

/**
* @author:抱着鱼睡觉的喵喵
* @date:2021/1/26
* @description:
*/

/**
* 二维数组转稀疏数组思路:
* 1.遍历二维数组,得到二维数组中非零的个数
* 2.创建稀疏数组,给稀疏数组的第一行进行赋值;(0-行,1-列,2-非0数)
* 3.遍历二维数组,给稀疏数组赋值
*/

/**
* 稀疏数组转二维数组思路:
* 1.根据稀疏数组的第一行数据,创建二维数组
* 2.遍历稀疏数组,给二维数组赋值
*/
public class SpareArray {
public static void main(String[] args) {
//创建一个原始的二维数组 11*11,0表示没有棋子,1表示黑子,2表示蓝子
int cherryArr1[][]=new int[11][11];
cherryArr1[1][2]=1;
cherryArr1[2][3]=2;
cherryArr1[4][4]=5;
System.out.println("二维数组如下");
for (int[] row:cherryArr1){
for(int item :row ){
System.out.printf("%d\t",item);
}
System.out.println();
}
//将二维数组转稀疏数组
//1.先遍历二维数组,得到非0数据的个数
int num=0;
for (int[] row:cherryArr1){
for (int item:row){
if (item!=0){
num++;
}
}
}
//创建对应的稀疏数组
int sparseArr[][]=new int[num+1][3];
//给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=num;
//遍历二维数组,将非0的值存放到稀疏数组中
int temp=1;
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if (cherryArr1[i][j]!=0){
sparseArr[temp][0]=i;
sparseArr[temp][1]=j;
sparseArr[temp][2]=cherryArr1[i][j];
temp++;
}
}
}
System.out.println("二维数组转为稀疏数组如下:");
for (int i=0;i<sparseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);;
}

//稀疏数组转二维数组
int[][] cherryArr2=new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i=1;i<num+1;i++){
cherryArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
System.out.println("稀疏数组转二维数组如下:");
for (int[] row:cherryArr2){
for (int item: row){
System.out.printf("%d\t",item);
}
System.out.println();
}
}
}