对于一个数组,如果大部分元素都是0或者其他相同的值,只有少数不同的值时,就可以将这个数组转换稀疏数组来存储,从而缩小数组的规模,实现类似于压缩的功能。

转换为稀疏数组

以常见的二维数组转换为稀疏数组来举例,具体步骤如下:

  1. 遍历源数组,获取有效数据的个数,保存到变量sum中。
  2. 创建稀疏数组,行数为sum+1,列数为3列,第一行的三个元素分别为源数组行数,列数以及sum,后面每一行分别为有效数据在源数组中的位置以及值。
public static int[][] arrayToSparseArray(int[][] arr){
        // 1.获取数组中不为0的元素的个数
        int arrHeight = arr.length;
        int arrLength = arr[0].length;
        int sum = 0;
        for (int i = 0; i < arrHeight; i++) {
            for (int j = 0; j < arrLength; j++) {
                if (arr[i][j] != 0) {
                    sum++;
                }
            }
        }

        // 2.创建稀疏数组,列数为3,行数为sum+1,第一行存储原数组长度,后面行存储原数组不为0值的位置以及值
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = arrHeight;
        sparseArr[0][1] = arrLength;
        sparseArr[0][2] = sum;

        // 3.将原数组中不为0的值存储到稀疏数组中
        int count = 1;
        for (int i = 0; i < arrHeight; i++) {
            for (int j = 0; j < arrLength; j++) {
                if (arr[i][j] != 0) {
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr[i][j];
                    count++;
                }
            }
        }
        return sparseArr;
    }

转换为二维数组

稀疏数组转换为二维数组步骤如下:

  1. 获取稀疏数组第一行数据,创建二维数组。
  2. 获取稀疏数组后续数据,赋值给二维数组对应元素。
public static int[][] sparseArrayToArray(int[][] sparseArr){
        // 1.从稀疏数组中获取第一行的值来创建数组
        int arrHeight = sparseArr[0][0];
        int arrLength = sparseArr[0][1];
        int[][] arr = new int[arrHeight][arrLength];

        // 2.从稀疏数组中获取值赋予给新创建的数组
        for (int i = 1; i < sparseArr.length; i++) {
            arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        return arr;
    }

测试

public static void main(String[] args) {
        // 创建一个二维数组
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        chessArr1[4][5] = 2;
        System.out.println("二维数组为:");
        for (int[] row : chessArr1) {
            for (int i : row) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }

        System.out.println("转换为稀疏数组:");
        int[][] parseArray = SparseArray.arrayToSparseArray(chessArr1);
        for (int[] row : parseArray) {
            for (int i : row) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }

        System.out.println("转换为二维数组:");
        int[][] sparseArrayToArray = SparseArray.sparseArrayToArray(parseArray);
        for (int[] row : sparseArrayToArray) {
            for (int i : row) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }
    }

输出如下:

二维数组为:
0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    2    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
转换为稀疏数组:
11    11    3    
1    2    1    
2    3    2    
4    5    2    
转换为二维数组:
0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    2    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0

欢迎关注我的公众号,一起学习技术。


程序开发与运维
1 声望0 粉丝

下一篇 »
链表