稀疏数组

作者: 定格r | 来源:发表于2021-05-28 10:37 被阅读0次

    应用场景

    当在编写五子棋程序时


    image.png

    在一个11*11的五子棋棋局中,棋盘使用二维数组进行记录,那就需要定义一个11行11列的二维数组保存。

    image.png

    问题分析:

    因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,而且浪费内存空间。

    这个时候就可以使用稀疏数组。

    基本介绍

    当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组

    稀疏数组处理方法:

    image.png

    转换为 --->


    image.png

    1)记录数组一共有几行几列,有多少不同的值
    2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

    代码实现

    public class Sparse {
        public static void main(String[] args) {
            int [][] chessArr=new int[11][11];
            chessArr[1][2]=1;
            chessArr[2][3]=2;
            System.out.println("原始数组~");
            for (int[] row:chessArr){
                for (int data:row){
                    System.out.printf("%d\t",data);
                }
                System.out.println();
            }
    
    image.png
            //二维数组 ---->稀疏数组
            // 首先遍历二维数组,获取二维数组有效值
            int sum=0;
            for (int i=0;i<11;i++){
                for (int j=0;j<11;j++){
                    if (chessArr[i][j]!=0){
                        sum++;
                    }
                }
            }
            System.out.println("二维数组----->稀疏数组~~~~~");
            //创建一个稀疏数组行 sum+1,列为 3
            int[][] sparseArr=new int[sum+1][3];
            //将原来有效数据赋值给细稀疏数组
            //稀疏数组第一行
            sparseArr[0][0]=11;
            sparseArr[0][1]=11;
            sparseArr[0][2]=sum;
            //将原来数组的有效数据赋值给稀疏数组的行列值
            int count=0;
            for(int i=1;i<11;i++){
                for (int j=0;j<11;j++){
                    if (chessArr[i][j]!=0){
                        count++;
                        sparseArr[count][0]=j;
                        sparseArr[count][1]=j;
                        sparseArr[count][2]=chessArr[i][j];
                    }
                }
            }
            //遍历输出稀疏数组
            for (int i=0;i<sparseArr.length;i++){
                for (int j=0;j<sparseArr[i].length;j++){
                    System.out.printf("%d\t", sparseArr[i][j]);
                }
                System.out.println();
            }
    
    image.png
            //稀疏数组恢复原来二维数组
            System.out.println("稀疏数组恢复成二维数组~~~~~");
            /**
             * 思路:
             * 1. 先读取稀疏数组第一行,获取原来的二维数组的行和列,和有效数据
             * 2. 再读取稀疏数组后几行,并复制给原始的二维数组即可
             */
            int [][] chessArr2=new int[sparseArr[0][0]][sparseArr[0][1]];
            for (int i=1;i<sparseArr.length;i++){
                //读取稀疏数组后几行,将稀疏数组的 val列赋值
                chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
            }
            for (int [] row:chessArr2){
                for (int data:row){
                    System.out.printf("%d\t",data);
                }
                System.out.println();
            }
        }
    }
    
    image.png

    相关文章

      网友评论

        本文标题:稀疏数组

        本文链接:https://www.haomeiwen.com/subject/wiajsltx.html