数据结构学习笔记(一):稀疏数组

数据结构学习笔记(一):稀疏数组

一、 稀疏数组的概念

​ 例如,五子棋程序中,有存盘推出和续上盘的功能。如果要实现这个功能,最简单的方法就是用二维数组储存。如下所示

数据结构学习笔记(一):稀疏数组_第1张图片

​ 可是该二维数组中很多值是0,因此记录了很多没有意义的数据。因此可以用到稀疏数组来对二维数组进行压缩。

当一个数组大部分元素为0,或者为同一个值的时候,可以使用稀疏数组来保存该数组。

​ 稀疏数组的处理方法是:

1.记录数组一共有几行几列,有多少个不同的值;

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

数据结构学习笔记(一):稀疏数组_第2张图片

二、 二维数组转换稀疏数组

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

​ 2.根据sum就可以创建稀疏数组sparseArr int [sum+1] [3]

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

三、 稀疏数组转原始二维数组

​ 1.先读取稀疏数组的第一行,根据第一行的数据创建原始二维数组。

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

四、数组转换到稀疏数组的代码实现

public class Test {
    public static void main(String[] args) {
        int[][] data = new int[11][11];
        data[1][2] = 1;
        data[2][3] = 2;

        SparseArr s = new SparseArr();
        int[][] arr2 = s.sparseArray(data);
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i][0]+"\t"+arr2[i][1]+"\t"+arr2[i][2]+"\t");
        }
    }
}

class SparseArr {

    public int[][] sparseArray(int[][] arr){
        int count =0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j]!=0){
                    count++;    //统计有效值的个数,有了有效值的个数才能生成稀疏数组的行数
                }
            }
        }

        int[][] arr2 = new int[count+1][3];
        int x = 0;
        arr2[0][0] = arr.length;        //稀疏数组第一行第一列储存原数组的行数
        arr2[0][1] = arr[0].length;     //稀疏数组第一行第二列储存原数组的列数
        arr2[0][2] = count;             //稀疏数组第一行第三列储存有效值的个数
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if (arr[i][j]!=0 ){
                    x++;
                    arr2[x][0] = i;             //储存有效值的行数
                    arr2[x][1] = j;             //储存有效值的列数
                    arr2[x][2] = arr[i][j];     //储存有效值的值
                }
            }
        }

        return arr2;
    }
}

五、稀疏数组转换到数组的代码实现

public class Test {
    public static void main(String[] args) {
        int[][] arr = {{11,11,2},{1,2,1},{2,3,2}};
        SparseToArr s = new SparseToArr();
        int arr2[][] = s.back(arr);
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[0].length; j++) {
                System.out.print(arr2[i][j]+"\t");
            }
            System.out.println("");
        }
    }
}

class SparseToArr {

    public int[][] back(int[][] arr){
        int x = arr[0][0];                       //得到原数组的行数
        int y = arr[0][1];                       //得到原数组的列数
        int x1=0;
        int y1=0;
        int z1=0;
        int[][] arr2 = new int[x][y];
        for (int i = 1; i < arr.length; i++) {
            x1 = arr[i][0];                     //得到有效值的行数
            y1 = arr[i][1];                     //得到有效值的列数
            z1 = arr[i][2];                     //得到有效值
            arr2[x1][y1] = z1;                  //还原数组
        }
        return arr2;
    }
}  

你可能感兴趣的:(数据结构与算法,数据结构,算法)