当前位置 博文首页 > 朝闻道 ||的博客:数组转化为 稀疏数组实现优化
一、解释
像五子棋盘一样,假如现在下了很少的棋子,然而棋盘很大,如果存储整个棋盘的话会浪费很大内存。
? ? ? 那么我们想用小数组表示这个只有几个棋子的大棋盘。
这时候就需要我们的稀疏数组来实现了在矩阵中,若数值为0的元素数目远远多于非0元素的数目,
并且非0元素分布没有规律时,则称矩阵为稀疏矩阵(数组)。
?
可以看到在这个二维数组中array[11][11]中,有两个数1和2,
分别在第二行第三列? array[2][3]=1??
? ? ? ? ? ? 第三行第四列?array[3][4]=2
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?? ?0
0?? ?0?? ?0?? ?0?? ?0?? ?0?? ?0? ??0? ? 0? ? 0? ? 0
二、稀疏数组的组成
稀疏数组表示形式如下:
?????row col val
0 ? 11 ?11 ? 2? ? ? ? ? 几行 几列 有效值(sum)
1 ? 1 ? 2 ? ?1
2 ? 2 ? 3 ? ?2
可以看出在数组的第一行表示的是:原始数组的行 、列、有效值数
第二行表示:第一个有效值的:行 、列、数值
第三行表示:第二个有效值的:行、 列、 数值
依次类推
三、
? ? ? ??原始数组---》稀疏数组? ?的转化
? ? ? ? 稀疏数组--》原始数组
代码如下:
public class shuzu {
public static void main(String[] args) {
//1、创建原始数组
int[][] array=new int[11][11];
array[1][2]=1;
array[2][3]=2;
for(int[] a:array)
{
for(int i:a)
{
System.out.print(i+"\t");
}
System.out.println();
}
//2、遍历二维数组计算非零个数
int sum=0;
for(int i=0;i< array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
if(array[i][j]!=0)
{
sum++;
}
}
}
System.out.println("非零个数是" + sum);
//3、创建 稀疏数组
int[][] sparseArray=new int[sum+1][3];
//给稀疏数组赋值
sparseArray[0][0]=11; //行数
sparseArray[0][1]=11; //列数
sparseArray[0][2]=sum; //有效值数(sum)
//遍历原始数组存到-》 稀疏数组数据(不包含稀疏数组第一行)
int count=0;//用于记录 第几个非零数据
for(int i=0;i< array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
if(array[i][j]!=0)//原始数组非零数字
{
count++;
sparseArray[count][0]=i;//行数 赋给稀疏数组 第二行 一列
sparseArray[count][1]=j;//列数赋给稀疏数组 第二行 二列
sparseArray[count][2]=array[i][j];//值赋给稀疏数组第二行 第三列
}
}
}
System.out.println();
//输出稀疏数组
System.out.println("到的稀疏数组为:");
for(int i=0;i<sparseArray.length;i++)
{
for(int j=0;j<sparseArray[i].length;j++)
{
System.out.print(sparseArray[i][j]+"\t");// \t 一个tab单位
}
System.out.println();
}
System.out.println();
//将稀疏数组--》原始数组
int[][] array2=new int[sparseArray[0][0]][sparseArray[0][1]];//稀疏数组的[0][0]是数组的行数,[0][1]是数组的列数
//遍历稀疏数组的第二行(从第二行开始)把数据 解析为 原数组
for(int i=1;i<sparseArray.length;i++)
{
array2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
//遍历解析成功的数组
for(int i=0;i<array2.length;i++)
{
for(int j=0;j<array2.length;j++)
{
System.out.print(array2[i][j]+"\t");// \t 一个tab单位
}
System.out.println();
}
}
}
运行结果:
?这样就实现了用小数组存储大的数组的功能,优化了数组的存储,防止了内存的浪费
觉得写的不错的,可以给咱个赞吗?
?
?
?
?
cs