稀疏数组

稀疏数组

1.概念

当一个数组大部分元素为0,或者为同一值的数组时,可以使用稀疏数组表示;

稀疏数组处理方法:

1)记录数据有几行几列,有多少个不同的值;

2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模;

2.稀疏数组的举例

3.原始数据转化为稀疏数组

方法: 1)稀疏数组总是3列,第一行总是固定的,由原数组的行列数以及原数组中的非0个数组成;

所以首先遍历得到原数组中的非0个数sum以及行列数,创建稀疏数组new int[sum+1][3]

​ 2) 遍历原数组将有效值存入稀疏数组中

4.稀疏数组还原原数组

方法: 1) 根据稀疏数组第一行的前两个数值创建出原数组;

​ 2)遍历稀疏数组将其他行的值存入原数组中;

public class SparseArray {

    public static void main(String[] args) {

        int startArray[][] = new int[11][11];
        startArray[1][2] = 3;
        startArray[2][4] = 6;
        // 原数组转稀疏数组
        int sparse[][] = startToSparse(startArray);
        for (int[] ints : sparse) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
        System.out.println("------------------------");
        // 稀疏数组转为原数组
        int[][] ints1 = SparseToStartArray(sparse);
        for (int[] ints : ints1) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
    }


    /**
     * 原数组转稀疏数组
     *     row  col  val
     *  0  11   11    2     // 有效数组第一列行代表的分别为:原数组行、列、有效数字个数
     *  1  1     2    3     // 每个有效数值在原数组中的位置以及值
     *  2  2     4    6
     */
    private static int[][] startToSparse(int[][] startArray) {
        // 得到原数组中的有效数值的个数
       int sum = getSum(startArray);
        // 创建稀疏数组
        int row = sum + 1; //行
        int col = 3;
        int sparse[][] = new int[row][col];
        sparse[0][0] = startArray.length;
        sparse[0][1] = startArray[0].length;
        sparse[0][2] = sum;
        // 遍历原数组将原数组中的有效值赋值到稀疏数组
        int count = 0;
        for (int i=0;i<startArray.length;i++) {
             for (int j=0; j<startArray[0].length; j++) {
                 if (startArray[i][j] !=0) {
                     count++;
                     sparse[count][0] = i;
                     sparse[count][1] = j;
                     sparse[count][2] = startArray[i][j];
                 }
             }
         }

        return sparse;
    }


    public static int getSum(int[][] startArray) {
        int sum =0;
        for (int i=0; i<startArray.length; i++) {
            for (int j = 0; j< startArray[0].length; j++) {
                if (startArray[i][j] != 0) {
                    sum++;
                }
            }
        }
        return sum;
    }


    /**
     * 稀疏数组转化原数组
     * 根据稀疏数组第一行的前两个数值创建原数组
     * 循环遍历稀疏数组后几行,赋值给原数组
     */

    public static int[][] SparseToStartArray(int[][] sparseArray) {
        // 创建原数组
        int row = sparseArray[0][0];
        int col = sparseArray[0][1];
        int[][] startArray = new int [row][col];

        // 遍历稀疏数组
        for (int i=1; i<sparseArray.length;i++) {
            for (int j=0; j<3; j++) {
                int startRow = sparseArray[i][0];
                int startCol = sparseArray[i][1];
                startArray[startRow][startCol] = sparseArray[i][2];
            }
        }
        return startArray;
    }
}
posted @ 2021-04-05 16:23  撑起一片阳光  阅读(74)  评论(0编辑  收藏  举报