二维数组和稀疏数组互转

本文介绍了稀疏数组的概念,用于压缩大规模二维数组中大量重复或0值的情况。通过记录数组的行数、列数及不同值的数量,将原数组压缩成三列的新数组。代码示例展示了如何将二维数组转换为稀疏数组,以及如何将稀疏数组还原回原二维数组,有助于理解稀疏数组的存储和操作方法。

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

数据结构和算法

什么是稀疏数组?
稀疏数组就是将一个大规模的数组压缩,压缩后的这个数组就叫稀疏数组;
如果一个二维数组中,存放了许多同样的值,只有少数不同的值,就可以使用稀疏数组进行压缩,如果不加以压缩,把这个大规模的数组写入硬板中,那么将大大提高io操作。

重要理论:

  1. 记录数组中一共有几行几列,共有多少个不同的值
  2. 把具有不同的元素压缩到一个新的小规模数组中
  3. 固定只有三列:row col value

在这里插入图片描述
代码实现:

/**
 * @author compass
 * @version 1.0
 * @date 2021-04-16 12:17
 */
public class SparseArray {
    /**
     * 当一个大的数组,有很多为0或者为null的值,可以使用稀疏数组进行压缩
     * 1.记录数组中一共有几行几列,共有多少个不同的值
     * 2.把具有不同的元素压缩到一个新的小规模数组中
     * 固定只有三列:row  col value
     */

    public static void main(String[] args) {

        // 创建一个二维数组 arr[行][列]
        int[][] arrays = new int[10][10];
        // 给二维数组赋值
        arrays[0][8] = 2;
        arrays[9][3] = 1;
        arrays[5][3] = 2;
        arrays[6][3] = 5;
        System.out.println("----------------------------------原数组");
        printArr(arrays);
        System.out.println("----------------------------------稀疏数组");

        //转为稀疏数组
        int[][] sparseArray = toSparseArray(arrays);
        printArr(sparseArray);
        System.out.println("----------------------------------转回原数组");

        //再将稀疏数组转回原数组
        int[][] array = toArray(sparseArray);
        printArr(array);

    }


    //将稀疏数组转回原数组
    public static  int[][] toArray(int[][] arr){

      int[][] newArray = new int[arr[0][0]][arr[0][1]];
        for (int i = 1; i < arr.length; i++) {
            //将稀疏数组中的值赋值给原数组
            newArray[arr[i][0]][arr[i][1]] = arr[i][2];
        }

        return newArray;
    }

    // 二维数组转稀疏数组
    public static int[][] toSparseArray(int[][] arr){

        // 计算出原数组中有多少个不为0的值
        int count = 0;
         int row = 1;
        for (int i = 0; i <arr.length ; i++) {
            for (int j = 0; j < arr[i].length ; j++) {
               row = arr.length;
                if (arr[i][j] != 0) count++;
            }
        }

        //创建新数组(稀疏数组)
        int[][] newArray = new int[count+1][3];
        //第一行第一列为存放的行数:总共有不为0的值+1
        newArray[0][0] = arr.length;
        // 需要生成的列数:固定为3
        newArray[0][1] = row;
        // 存放一共有几个不为0的值
        newArray[0][2] = count;

        // 遍历原数组 将原数组的值赋值给稀疏数组
        int newArrayIndex = 0; //用于记录是第几个非0数据
        for (int i=0; i<arr.length; i++){
            for (int j = 0; j <arr[i].length ; j++) {
                if (arr[i][j] != 0){

                    newArrayIndex++;
                    // 赋值row
                    newArray[newArrayIndex][0]=i;
                    // 赋值col
                    newArray[newArrayIndex][1]=j;
                    //赋值 value
                    newArray[newArrayIndex][2]=arr[i][j];
                }
            }
        }

        return newArray;
    }

    // 打印二维数组的方法
    public static void printArr(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]+"\t");
            }
            System.out.println();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值