稀疏数组

博客介绍了稀疏数组,当二维数组仅在少数位置存储数据时,可将其转化为稀疏数组以减少存储空间。文中给出了原始数组转化为稀疏数组的示例,还鼓励读者动手实现,若有困难可参考代码实现部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如有错误请指正,谢谢!

什么是稀疏数组?

在这里插入图片描述

如图一个二维数组,仅仅只是在某几个位置存储了其他数据.
我们却要使用一个如此之大的数组保存这些数组.略显可惜.
我们可以将其转化为稀疏数组,减少保存这些数据所占用的空间.

在这里插入图片描述
转换之后的稀疏数组如上图

*每个数据代表的含义*
原始数组有几行原始数组有几列原始数组的有效数据的个数
该值所处原始数组的第几行该数所处原始数据的第几列原始数据中的该数

我们可以看到原始数组为11行11列.共两个有效数组
有效数字1所处的位置是[1,2]
有效数字2所处的位置是[2,3]
所以转化成稀疏数组为上边的那个图片.

思路就是这样的, 自己可以动手实现一下,如果实现不了,可以参考表面的代码实现

能动手就不逼逼!

代码实现

package name.dancer.array;

/**
* 稀疏数组
* @author dancer
* @date 2019-07-12
* @description
*      二维数组转稀疏数组
*          1.遍历原始的二维数组,得到有效数据的个数sum
*          2.根据sum就可以创建稀疏数组sparseArr [sum + 1][3]
*          3.将二维数组的有效数组存入到稀疏数组
*
*      稀疏数组转二维数组
*          1.读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,array[11][11]
*          2.读取稀疏数组后几行的数据,并赋值给原始的二维数组即可.
*
**/
public class SparseArray {

   public static void main(String[] args) {

       // 创建原始数组
       int[][] array = new int[11][11];
       array[1][2] = 1;
       array[2][3] = 2;
       System.out.println("[ + ] 原始数组");
       for (int[] row: array) {
           for (int data : row) {
               System.out.printf("%d\t", data);
           }
           System.out.println();
       }

       // 获取!0值个数
       int num = 0;
       for (int[] row : array) {
           for (int data : row) {
               if (data != 0) {
                   num++;
               }
           }
       }

       // 构建稀疏数组
       int[][] sparseArray = new int[num + 1][3];
       sparseArray[0][0] = array.length;
       sparseArray[0][1] = array[0].length;
       sparseArray[0][2] = num;
       // 填充数据
       int line = 0;
       for (int i = 0; i < array.length; i++) {
           for (int j = 0; j < array.length; j++) {
               if(array[i][j] != 0) {
                   line++;
                   sparseArray[line][0] = i;
                   sparseArray[line][1] = j;
                   sparseArray[line][2] = array[i][j];
               }
           }
       }
       System.out.println("[ + ] 原始数组转稀疏数组");
       for (int[] row : sparseArray) {
           System.out.printf("%d\t%d\t%d\n", row[0], row[1], row[2]);
       }

       // 稀疏数组转原始数组
       int[][] array2 = new int[sparseArray[0][0]][sparseArray[0][1]];
       for (int i = 1; i < sparseArray.length; i++) {
           array2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
       }

       System.out.println("[ + ] 稀疏数组转原始数组");
       for (int[] rows : array2) {
           for (int data : rows) {
               System.out.printf("%d\t", data);
           }
           System.out.println();
       }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值