当前位置 博文首页 > 朝闻道 ||的博客:数组转化为 稀疏数组实现优化

    朝闻道 ||的博客:数组转化为 稀疏数组实现优化

    作者:[db:作者] 时间:2021-09-12 18:06

    一、解释
    像五子棋盘一样,假如现在下了很少的棋子,然而棋盘很大,如果存储整个棋盘的话会浪费很大内存。

    ? ? ? 那么我们想用小数组表示这个只有几个棋子的大棋盘。

    这时候就需要我们的稀疏数组来实现了在矩阵中,若数值为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
    下一篇:没有了