稀疏数组
例子:
棋盘用二维数组保存是11×11,稀疏数组是3×3,因此能大幅度节约空间
稀疏数组的使用原因:如果二维数组内很多值相同,有很多没意义的数据,使用稀疏数组能够大幅度节约空间
操作方法:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
结构说明:第一行的三个代表几行、几列、几个非0数字。第二行以后的即是特殊元素的行、列、值
例如:
3 2 2 //原数组有三行两列两个非0值
0 1 3 //第0行第1列值为3
2 1 1 //第2行第1列值为1
具体的代码实现:
创建一个二维数组:
//原始的二维数组
int[][] chess1=new int[11][11];
chess1[1][2]=5;
chess1[3][7]=1;
chess1[4][6]=3;
chess1[5][5]=3;
System.out.println("初始的二维数组:");
for (int[] rows:chess1)
{
for (int arr:rows)
{
System.out.print(arr+" ");
}
System.out.println();
}
将其转换成稀疏数组:
//转换成稀疏数组
//下方代码为检索多少个值非0
int sum=0; //sum值为非0值的个数,等下建立数组要用
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(chess1[i][j]!=0)
{
sum++;
}
}
}
//下方代码为建立稀疏数组
int[][] sparcearry=new int[sum+1][3];
sparcearry[0][0]=11; //第一行的三个值是已知的
sparcearry[0][1]=11;
sparcearry[0][2]=sum;
int d=0;
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(chess1[i][j]!=0)
{
d++;
sparcearry[d][0]=i; //为稀疏数组赋值
sparcearry[d][1]=j;
sparcearry[d][2]=chess1[i][j];
}
}
}
//打印出稀疏数组
System.out.println("sparcearry数组:");
for(int i=0;i<sparcearry.length;i++)
{
System.out.println(sparcearry[i][0]+" "+sparcearry[i][1]+" "+sparcearry[i][2]);
System.out.println();
}
稀疏数组还原成原数组:
//还原
System.out.println("还原后的数组:");
//建立还原后的二维数组
int[][] chess2=new int[sparcearry[0][0]][sparcearry[0][1]];
for(int i=1;i<=sparcearry[0][2];i++)
{
//为其赋值
chess2[sparcearry[i][0]][sparcearry[i][1]]=sparcearry[i][2];
}
//输出二维数组
for (int[] rows:chess2)
{
for (int arr:rows)
{
System.out.print(arr+" ");
}
System.out.println();
}