稀疏数组
稀疏数组的应用场景
当一个数组的大部分元素为同一个元素时可以使用稀疏数组来保存该数组
处理方法
1.记录数组有几行几列和多少个不同的值
2.把具有不同值的元素的行列及值记录在一个小规模数组中,从而缩小数组的规模
思路
1.二维数组转换为稀疏数组遍历原始的二维素组,得到有效数据个数sum据sum创建稀疏数组将二维数组的有效数据存入到稀疏数组中
2.稀疏数组转换为原始的二维数组读取稀疏数组的第一行,得到原始数组的大小和有效数据个数并创建原始的数组读取稀疏数组后面的数据将其交给原始的二维数组
代码实现
public class sparseArray {
//创建一个原始的二维数组11*11
//默认值为0,有1,2两个不同的值
public sparseArray()
{
int [][]nums=new int[11][11];
nums[1][2]=1;
nums[2][3]=2;//创建原始的二维数组
System.out.println("原始二维数组");
out(nums);
nums=transToSparse(nums);
System.out.println("转换后的稀疏数组");
out(nums);
nums=transToRaw(nums);
System.out.println("还原后的原始数组");
out(nums);
}
private int[][] transToSparse(int [][]nums)//传参为需要转换的原始数组,返回值是转换好的稀疏数组
{
//将二维数组转换为稀疏数组
//1.先遍历二维数组,得到原始数组的数据
int sum=0,r=nums.length,c=nums[0].length;
for(int []row:nums)//先取出行
{
for(int number:row)//从行中取出具体的元素
{
if(number!=0)
{
sum++;
}
}
}//得到原始数组的非0数据的个数和大小
//2.创建稀疏数组
int [][]sparse=new int[sum+1][3];//第一组数组需要存储原始数组的大小和非0数据的个数,所以行数是sum+1
sparse[0][0]=r;
sparse[0][1]=c;
sparse[0][2]=sum;//将原始数组的数据存储到稀疏数组的第一行
for(int i=0,index=1;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(nums[i][j]!=0)
{
sparse[index][0]=i;
sparse[index][1]=j;
sparse[index][2]=nums[i][j];
index++;
}
}
}
return sparse;
}//将原始数组转换为稀疏数组
private int[][] transToRaw(int nums[][])
{
//将稀疏数组转换为原始的数组
//1.读取稀疏数组的第一行
int r=nums[0][0];
int c=nums[0][1];//获取原始数组的大小
//2.创建原始数组,并将数组还给原始数组
int [][]raw=new int[r][c];
for(int i=1;i<nums.length;i++)
{
raw[nums[i][0]][nums[i][1]]=nums[i][2];
}
return raw;
}//将稀疏数组转换为原始数组
private void out(int [][]nums)
{
for(int []row:nums)//先取出行
{
for(int number:row)//从行中取出具体的元素
{
System.out.print(number+" ");
}
System.out.println();
}
}//输出数组的方法
}