java数据结构-稀疏数组

稀疏数组介绍

一、什么叫稀疏数组呢?
如果一个数组(包括多维数组)中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,节约空间。
一般来说,稀疏数组的处理方法是:
1.记录数组一共有几行几列,有多少个不同的数值。
2.把具有不同值的元素的行列及记录在一个小规模的数组中,从而缩小程序的规模。
图例:java数据结构-稀疏数组_第1张图片
从上图可以看出,原始二维数组转稀疏数组的思路:

  • 遍历原始二维数组,得到有效元素个数num
  • 根据元素个数num创建稀疏数组sparseArray[num+1][l列数]
  • sparseArray数组首行存储原始二维数组行数和列数,以及有效值个数
  • 原始二维数组有效数据存入到稀疏数组中

那么如何把稀疏数组在转换成原始数组呢?

  • 首先先读取稀疏数组第一行数据,创建原始二维数组originalArray[5][7]
  • 再读取稀疏数组后几行数据,赋值给原始二维数组。

下面以五子棋棋盘为例演示稀疏数组应用场景。
首先我们定义一个11行、11列的棋盘chessboard[11][11],默认值为0。接着我们用1表示黑色棋子,2表示白色棋子。对棋盘数组进行赋值。代码如下:

         //创建一个11行、11列的棋盘
        int[][] chessboard = new int[11][11];
        //在棋盘上下子,黑子值为1,白子值为2
        chessboard[1][2]=1;
        chessboard[2][3]=2;
        System.out.println("原始二维数组:");
        for (int[] rows : chessboard) {
            for (int value : rows) {
                System.out.printf("%d\t",value);
            }
            System.out.println();
        }
    }

输出结果:
java数据结构-稀疏数组_第2张图片
完整代码如下:

public static void main(String[] args) {
        //创建一个11行、11列的棋盘
        int[][] chessboard = new int[11][11];
        //在棋盘上下子,黑子值为1,白子值为2
        chessboard[1][2] = 1;
        chessboard[2][3] = 2;
        System.out.println("原始二维数组:");
        printArray(chessboard);
        //将二维数组转化成稀疏数组
        int num = 0;
        for (int i = 0; i < chessboard.length; i++) {
            for (int j = 0; j < chessboard[i].length; j++) {
                if (chessboard[i][j] != 0) {
                    num++;
                }
            }
        }
        //创建对应的稀疏数组
        int sparseArray[][] = new int[num + 1][3];
        //稀疏数组首行赋值
        int rows = sparseArray[0][0] = 11;
        int cols = sparseArray[0][1] = 11;
        sparseArray[0][2] = num;
        int[][] newSparseArray = arrayAssignment(chessboard, sparseArray);
        System.out.println("转化的稀疏数组:");
        printArray(newSparseArray);

        //稀疏数组转原始二维数组
        //创建一个二维数组,并将稀疏数组的首行记录的行数和列数初始化大小
        int[][] newChessBoard = new int[rows][cols];
        //首行之后的数据
        for (int i = 1; i < newSparseArray.length; i++) {
            newChessBoard[newSparseArray[i][0]][newSparseArray[i][1]]=newSparseArray[i][2];
        }
        System.out.println("转化后的原始二维数组:");
        printArray(newChessBoard);
    }

    /**
     * 将原始二维数组转化成稀疏数组
     *
     * @param a
     * @param b
     * @return 稀疏数组
     */
    public static int[][] arrayAssignment(int a[][], int b[][]) {
        //记录非0数据次序
        int count = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j] != 0) {
                    count++;
                    b[count][0] = i;
                    b[count][1] = j;
                    b[count][2] = a[i][j];
                }
            }
        }
        return b;
    }

    /**
     * 格式化输出
     *
     * @param a
     */
    public static void printArray(int a[][]) {
        for (int[] rows : a) {
            for (int value : rows) {
                System.out.printf("%d\t", value);
            }
            System.out.println();
        }
    }

运行结果:
java数据结构-稀疏数组_第3张图片

你可能感兴趣的:(java,数据结构)