一、概念简介
稀疏数组
就是数组中有很多的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 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
稀疏数组
11 11 2
2 3 1
3 4 2
可以看出原数组是11*11的,而非零元素只有两个1,2,稀疏数组第一行的数字分别表示原数组的行(11),原数组的列(11),原数组的非零个数(2)之后的每一行都是来存储非零元素的下标和值,例如(2,3,1)表示原数组的1存放在下标为(2,3)的位置。
好的,在了解规律之后就可以进行转换了。首先需要遍历数组找出非零元素的个数,然后建立一个二维数组进行保存,这个新建立的二维数组的行就是原来的非零元素个数sum+1(因为第0行需要保存数组的相关信息,eg 行 列 非零元个数)。遍历数组找到非零元时将数组的位置和信息保存下来即可。这就是原数组转化为稀疏数组表示;同理先初始化一个数组,初始元素全为0,然后直接遍历稀疏数组的每一行,逆向转换即可。
二、代码实现
public static void main(String []args)
{
int [][]a=new int[11][11];
a[2][3]=1;
a[3][4]=2;
int nonzero=0; //统计非零元素个数
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(a[i][j]!=0)
{
nonzero++;
}
//System.out.print(a[i][j]);
}
// System.out.print("\n");
}
//将矩阵转化为稀疏矩阵,稀疏矩阵只有3列分别保存行,列,值
int [][]sparse=new int[nonzero+1][3];
sparse[0][0]=sparse[0][1]=11;
sparse[0][2]=nonzero;
int count=1; //,第一行是矩阵信息,从第二行开始进行转换
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(a[i][j]!=0)
{
sparse[count][0]=i;
sparse[count][1]=j;
sparse[count][2]=a[i][j];
count++;
}
}
}
for(int i=0;i<nonzero+1;i++)
{
for(int j=0;j<3;j++)
System.out.print(" "+sparse[i][j]+" ");
System.out.print("\n");
}
//将稀疏矩阵转换为原来的矩阵
int [][]b=new int[sparse[0][0]][sparse[0][1]];
count=sparse[0][2];
for(int k=1;k<=count;k++)
{
int i=sparse[k][0];
int j=sparse[k][1];
b[i][j]=sparse[k][2];
}
for(int i=0;i<sparse[0][0];i++)
{
for(int j=0;j<sparse[0][1];j++)
System.out.print(" "+b[i][j]+" ");
System.out.print("\n");
}
}
运行结果展示
11 11 2
2 3 1
3 4 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 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
学习自B站java数据结构