稀疏数组简介

稀疏数组

1、定义:稀疏数组可以看做是普通数组的压缩。其存储形式为:
- 第一行记录二维数组的行数,列数,以及有效数据的个数
- 其他行记录每个有效数据所在的行数,列数,以及值
2、目的:使用稀疏数组目的是为了压缩数组,节约空间。
3、应用场景:稀疏数组一般使用在一个二维数组存储着大量无效数据的场景中。

实现

Java版本

首先,定义一个普通二维数组,将它打印出来看看。

    public static void main(String[] args) {
        int[][] test = new int[15][13];
        test[2][4] = 1;
        test[3][4] = 1;
        test[4][4] = 1;
        test[5][1] = 1;
        test[3][6] = 1;
        test[3][5] = 2;
        test[7][5] = 2;
        test[8][1] = 2;
        test[4][11] = 2;
        test[9][10] = 2;
        System.out.println("=========================原始数组=========================");
        printArrays(test);
    }
        /**
     * 打印二维数组
     *
     * @param arr 二维数组
     */
    public static void printArrays(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

在这里插入图片描述
可以看到,二维数组存储了 15*13 = 195个数据,但是实际有效数据只有10个,这种场景下,我们就可以考虑用稀疏数组来存储。根据稀疏数组的存储形式,可以通过以下代码实现普通数组转稀疏数组:

        /**
     * 普通数组转稀疏数组
     *
     * @param arr 普通数组
     * @return 稀疏数组
     */
    public static int[][] castSparseArray(int[][] arr) {
        //原数组行数
        int row = arr.length;
        //原数组列数
        int cloumn = arr[0].length;
        //已经使用格子数
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    sum++;
                }
            }
        }

        int[][] sparseArray = new int[sum + 1][3];
        sparseArray[0][0] = row; //二维数组的行数
        sparseArray[0][1] = cloumn; //二维数组的列数
        sparseArray[0][2] = sum; //有效数据的个数

        //稀疏数组填值
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    index++;
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = j;
                    sparseArray[index][2] = arr[i][j];
                }
            }
        }
        return sparseArray;
    }

打印得到以下结果:
在这里插入图片描述
得到稀疏数组之后,我们可以通过记录的信息,还原回普通的数组:

    /**
     * @param sparseArr 稀疏数组
     * @return 普通数组
     */
    public static int[][] castToArray(int[][] sparseArr) {
        int[][] array = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            int[] sparseRow = sparseArr[i];
            array[sparseRow[0]][sparseRow[1]] = sparseRow[2];
        }
        return array;
    }

结果如下:
在这里插入图片描述

C#版本

以下是C#稀疏数组实现:

        /// <summary>
        /// 普通数组转稀疏数组
        /// </summary>
        /// <param name="arr"></param>
        /// <returns></returns>
        public static int[,] castSparseArray(int[,] arr)
        {
            //原数组行数
            int row = arr.GetLength(0);
            //原数组列数
            int cloumn = arr.GetLength(1);
            //已经使用格子数
            int sum = 0;
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (arr[i, j] != 0)
                    {
                        sum++;
                    }
                }
            }
            int[,] sparseArray = new int[sum + 1, 3];
            sparseArray[0, 0] = row;
            sparseArray[0, 1] = cloumn;
            sparseArray[0, 2] = sum;

            //稀疏数组填值
            int index = 0;
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (arr[i, j] != 0)
                    {
                        index++;
                        sparseArray[index, 0] = i;
                        sparseArray[index, 1] = j;
                        sparseArray[index, 2] = arr[i, j];
                    }
                }
            }
            return sparseArray;
        }

        /// <summary>
        /// 稀疏数组转普通数组
        /// </summary>
        /// <param name="sparseArr">稀疏数组</param>
        /// <returns></returns>
        public static int[,] castToArray(int[,] sparseArr)
        {
            int[,] array = new int[sparseArr[0, 0], sparseArr[0, 1]];
            for (int i = 1; i < sparseArr.GetLength(0); i++)
            {
                array[sparseArr[i, 0], sparseArr[i, 1]] = sparseArr[i, 2];
            }
            return array;
        }

        /// <summary>
        /// 打印二维数组
        /// </summary>
        /// <param name="arr"></param>
        public static void printArrays(int[,] arr)
        {
            for (int i = 0; i < arr.GetLength(0); i++)
            {
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    Console.Write(arr[i, j] + " ");
                }
                Console.WriteLine();
            }
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值