数据结构与算法--稀疏数组

应用场景:编写的五子棋程序,有存盘退出和继续上盘的功能

问题分析:因为二位数组的很多默认值是0,所以记录了很多没有意义的数据

稀疏数组(SparseArray)基本介绍

 当一个数组中**大部分元素是0或者为同一个值**时,可以使用稀疏数组保存改数组

  稀疏数组处理方法:
         * 记录数组一共**有多少行,有多少个不同的值**
         * 把具有不同值的元素的行列值记录在一个小规模的数组中,从而**缩小程序**的规模

应用实例思路及实现

二位数组转稀疏数组思路:

    1.遍历原始的二维数组,得到有效数据个数count

    2.根据count创建稀疏数组sparseArray = int[count+1][3]

    3.将二维数组的有效数据存入稀疏数组中

稀疏数组转二位数组的思路:

     1.先读取稀疏数组的第一行,根据第一行数据创建原始的二位数组(如上:arr=int[11][11])

     2.再读取稀疏数组后几行的数据,并赋值给原始的二维数组

代码实现:

`

    public class SparseArray {

    public static void main(String[] args) {

    //创建一个原始的二维数组
    int[][] chessArr1 = new int[11][11];

    chessArr1[1][2] = 1;
    chessArr1[2][3] = 2;

    for (int[] row : chessArr1) {
        for (int data : row) {
            System.out.print(data+" ");
        }
        System.out.println();
    }
    //将二维数组转为稀疏数组
    //1.先遍历二位数组,得到非0数据的个数
    int sum = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArr1[i][j] != 0){
                sum++;
            }
        }
    }
    //System.out.println("sum=" + sum);

    //2.创建一个对应的稀疏数组
    int sparseArr[][] = new int[sum+1][3];

    //给稀疏数组赋值
    sparseArr[0][0] = 11;
    sparseArr[0][1] = 11;
    sparseArr[0][2] = sum;

    //遍历二位数组,将非0值存放到稀疏数组
    int count = 0;//count用于记录是第几个非0数据

    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArr1[i][j] != 0){
                count++;
                sparseArr[count][0] = i;
                sparseArr[count][1] = j;
                sparseArr[count][2] = chessArr1[i][j];
            }
        }
    }
    //输出稀疏数组
    System.out.println();
    System.out.println("-------------");
    System.out.println("稀疏数组:");

    for (int i = 0;i < sparseArr.length;i++){
       System.out.print(sparseArr[i][0]+" 	");
        System.out.print(sparseArr[i][1]+" 	");
        System.out.print(sparseArr[i][2]+" "+"	
");

        //System.out.printf("%d	",sparseArr[0][1],sparseArr[0][1],sparseArr[0][2]);
    }
    System.out.println();

    //将稀疏数组恢复成二位数组
    int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    //读取稀疏数组后几行的数据,赋给原始的二维数组
    for (int i = 1;i<sparseArr.length;i++){
        chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    }
    //恢复后的
    System.out.println();
    for (int[] row : chessArr2) {
        for (int data : row) {
            System.out.print(data+" ");
        }
        System.out.println();
     }
 }}

`

原文地址:https://www.cnblogs.com/ysera-y/p/13662532.html