稀疏数组

159 阅读2分钟

基本概念

当一个数组中,大部分值都是0或者是同一个值时,如果全部进行存储,会浪费空间,这个时候就可以把这个数组转换为稀疏数组。

如下图(图片来源网络),大部分都是0,真正用到的就是5个值。

进行转换之后就是下图,具体转换的规则由两部分组成,第一部分就是记录的原数组总的行数,列数,使用值的个数。第二部分就是记录的每个具体使用值的坐标(行数,列数)和具体值。

经过上面的转换,之前需要声明7x9=63大小的数组,现在只需要声明 3x6=18大小的数组,节省了很大的空间。

原始数组和稀疏数组相互转换代码

package com.example.demo.dataStructure;

public class SparseArr {
    public static void main(String[] args) {
        int rows = 9;
        int columns = 7;
        int[][] array = new int[9][7];
        array[1][1] = 3;
        array[3][0] = 1;
        array[3][1] = 4;
        array[4][2] = 7;
        array[5][5] = 5;
        System.out.println("初始化数组为:");
        printArr(array);
        int sum = 0;
        for (int[] i : array) {
            for (int j : i) {
                if (j != 0) {
                    sum++;
                }
            }
        }
        //原数组转稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = rows;
        sparseArr[0][1] = columns;
        sparseArr[0][2] = sum;

        int count = 1;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count++][2] = array[i][j];
                }
            }
        }
        System.out.println("转换后数组为:");
        printArr(sparseArr);
        //再还原数组
        int[][] arr = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1; i < sparseArr.length; i++) {
            arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("还原后数组为:");
        printArr(arr);
    }

    private 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();
        }
    }
}

输出的结果如下:

初始化数组为:
0	0	0	0	0	0	0	
0	3	0	0	0	0	0	
0	0	0	0	0	0	0	
1	4	0	0	0	0	0	
0	0	7	0	0	0	0	
0	0	0	0	0	5	0	
0	0	0	0	0	0	0	
0	0	0	0	0	0	0	
0	0	0	0	0	0	0	
转换后数组为:
9	7	5	
1	1	3	
3	0	1	
3	1	4	
4	2	7	
5	5	5	
还原后数组为:
0	0	0	0	0	0	0	
0	3	0	0	0	0	0	
0	0	0	0	0	0	0	
1	4	0	0	0	0	0	
0	0	7	0	0	0	0	
0	0	0	0	0	5	0	
0	0	0	0	0	0	0	
0	0	0	0	0	0	0	
0	0	0	0	0	0	0

解决一些二维数组存储可以用稀疏数组,网上的例子大都是五子棋和围棋等,也算是稀疏数组的简单运用。