二维数组特别篇之稀疏数组

为什么要使用稀疏数组?
我们为什么会使用稀疏数组呢?对于我们人来说,总会选择对我们有益的事情,使用稀疏数组就是对我们有益,才会选择使用。
那么使用稀疏数组的好处是什么呢?
稀疏数组,可以大大的压缩数组空间,节省资源,提高内存资源利用率。
稀疏数组的原理是怎样的?
稀疏数组压缩原始二维数组,所以稀疏数组的模式int[?][3],列始终为3列,第一列代表的是原始数组的行,第二列代表的是原始数组的列,第三列代表的是原始数组的有效值(非零数组)。而int[?][3] 中的 是多大,取决于原始数组中的有效值个数(假定有效值额个数为nums),可以理解为 =nums+1;那就有 稀疏数组int[nums+1][3]的定义。
原始数组转换为稀疏数组的实现思路:
1、遍历原始数组,得到有效值个数nums
2、依据原始数组的有效值个数nums,创建稀疏数组int[][] spareArray = new int[nums+1][3];
3、将原始数组的有效数据依次写入稀疏数组。

稀疏数组还原为原始数组的实现思路:
1、依据稀疏数组的第一行数据,可以得到原始数组的空间大小,创建原始数组int[][] array1 = new int[row][col];(注意!row =spareArray[0][0];col=spareArray[0][1])
2、依次将稀疏数组的数值赋值给原始数组。原始数组还原完成。

接下来是我们的手撕代码时间,该表演十分危险,初学者切记,需跟着小唐动手敲一遍,方可化险为夷,大佬请自动绕行!!!
代码:

public class sparseArray{
    
    
       public static void main(String[] args){
    
    
       //定义原始数组的存储空间大小
       int[][] strArray = new int[11][11];
       strArray[1][2] = 1;
       strArray[2][3] = 2;
       System.out.println("输出的原始数组是:");
       forint[] row : strArray){
    
    
           for(int data : row){
    
    
           System.out.printf("%d\t",data);//printf是c语言的延续
           //也可采用System.out.println("\t"+data);或将println换用为print
}
           System.out.println();
}
          //遍历原始数组,获得原始数组的有效值个数
          int sum = 0for(int i=0;i<11;i++){
    
     
          for(int j=0;j<11;j++){
    
    
          if(strArray!=0){
    
    
          sum++;
}
}
}
           //依据原始数组有效值,创建稀疏数组
           int[][] sparseArray = new int[sum+1][3];
           sparseArray[0][0] = 11;
           sparseArray[0][1] = 11;
           sparseArray[0][2] = sum;
           //遍历二维数组,将有效值赋值到稀疏数组
           int count = 0;//定义一个count,用于记录有效数值
           for(int i=0;i<11;i++){
    
    
           for(int j=0;j<11;j++){
    
    
          /*
                  注意为什么这里是用原始数组strArray,而没有sparseArray,是需要用原始二维数组中的有效数值,赋值到稀疏数组中。
                   如果用sparseArray[i][j]!=0;那么会出现报错
                   Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
                   at array.Demo02.main(Demo02.java:38)
                   这个报错是说索引超出边界
                   */
           if(strArray[i][j]!=0){
    
    
           count++;
           sparseArray[count][0] = i;
           sparseArray[count][1] = j;
           sparseArray[count][2] = strArray[i][j]
}
           
}
}
         //输出稀疏数组
         System.out.println();
         System.out.println("输出稀疏数组:");
        for(int i=0;i<sparseArray.length;i++){
    
    
         System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
     System.out.println();
}
}

package array;

/**
 * @author 小小唐@
 * @Date 2022/1/6-星期四-21:00
 */
public class Demo01 {
    
    
    public static void main(String[] args) {
    
    
        int[][] strArray= new int[11][11];
        strArray[2][3] = 1;
        strArray[4][5] = 2;
        System.out.println("输出原始数组:");
        for (int[] row : strArray) {
    
    
            for (int date : row) {
    
    
                System.out.printf("%d\t",date);
            }
            System.out.println();
        }

        int sum=0;
        for (int i = 0; i < 11; i++) {
    
    
            for (int j = 0; j < 11; j++) {
    
    
                if (strArray[i][j]!=0){
    
    
                    sum++;
                }
            }
        }
        System.out.println();
        System.out.println("输出原始数组有效数值:"+sum);
        System.out.println();

        int[][] sparseArray = new int[sum+1][3];
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;

        int count=0;
        for (int i = 1; i < 11; i++) {
    
    
            for (int j = 1; j < 11; j++) {
    
    
                if (strArray[i][j]!=0){
    
    
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = strArray[i][j];
                }
            }
            
        }
        System.out.println();
        System.out.printf("输出稀疏数组:\n");
        for (int i = 0; i < sparseArray.length; i++) {
    
    
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }

        /**
         * 稀疏数组还原为二维数组
         * 1、根据稀疏数组sparseArray[0][0],sparseArray[0][1],sparseArray[0][2]得到原始数组的行和列
         * 2、依次类推得到原始数组的有效数值
         */

        int[][] str1 = new int[sparseArray[0][0]][sparseArray[0][1]];
        //int i=1,是因为第一行只是确定原始数组总的空间大小,和有效数值的总数。从1开始才是原始数组中有效数值的位置,及有效数值的大小
        for (int i = 1; i < sparseArray.length; i++) {
    
    
            str1[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        System.out.println();
        System.out.println("还原原始数组:");

        for (int[] row : str1) {
    
    
            for (int date : row) {
    
    
                System.out.printf("%d\t",date);
            }
            System.out.println();
        }
    }
}

运行图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_49014164/article/details/122186934