稀疏数组

一、稀疏数组的定义


稀疏(sparsearray)数组:可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组。

稀疏数组的应用场景:五子棋程序,有存盘退出和续上盘的功能,将五子棋盘转化成二维数组如下所示:
分析上述问题:因为该二维数组默认的地方值为0,因此记录了很多没有意义的数据。当遇到此种情况时,可以使用稀疏数组。
稀疏数组_第1张图片

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:
  ■  数组的第一行,用于记录数组一共有几行几列,有多少个不同的值。
  ■  把具有不同值的元素的行列记录在一个小规模的数组中,从而缩小程序的规模。
稀疏数组_第2张图片

二、应用实例


我们将下图所示的棋盘使用稀疏数组进行存盘退出操作:
稀疏数组_第3张图片

【1】将上面类似的二位数组棋盘保存到稀疏数组中,并存放至外部备份文件 sparsearray.text 中:稀疏数组可以简单的看作为是压缩,在开发中也会使用到。比如将数据序列化到磁盘上,减少数据量,在 IO 传输过程中提高效率等等。为什么要进行压缩:因为稀疏矩阵中存在大量的默认值,占据了大量的存储空间,而真正有用的数据却少之又少;且在计算时浪费资源,所以要进行压缩存储以节省存储空间和计算方便。

/**
 * 将棋盘转化为稀疏数组并备份与外部设配
 */
public class Sparsearray {
    //定义一个二维数组
    public static void main(String[] args) throws Exception {
        //定义成int类型的二维数组,默认值就为0;
        int[][] intArr = new int[11][11];
        //根据棋盘中显示,存在一个黑子,我们用1表示,蓝子有2表示
        intArr[1][2]=1;
        intArr[2][3]=2;

        /*  上述二维数组输出的矩阵图如下所示
        0	0	0	0	0	0	0	0	0	0	0
	0	0	1	0	0	0	0	0	0	0	0
	0	0	0	2	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
	0	0	0	0	0	0	0	0	0	0	0
         */
        for (int i=0;i

【2】稀疏数组输出的 sparsearray.text 内容如下:
 
【3】将稀疏数组文件中的内容恢复至传统的二维数组棋盘;

/**
 * 将稀疏数组文件中的内容恢复至传统的二维数组棋盘
 */
public class SparseArrayClass {
    public static void main(String[] args) throws Exception {
        //读取  sparsearray.text  中的内容
        FileInputStream fileInputStream = new FileInputStream("sparsearray.text");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        //读取文件中的内容  先读取第一行的数据
        String s1 = bufferedReader.readLine();
        //判断文件第一行是否有值,如果有值则获取,并创建棋盘数组
        if(s1 != null){
            String[] split = s1.split(" ");
            int[][] sparsearray = new int[Integer.valueOf(split[0])][Integer.valueOf(split[1])];
            //有多少个稀疏值,则遍历获取多少行
            for(int i=1;i<=Integer.valueOf(split[2]);i++){
                String line = bufferedReader.readLine();
                //获取到的散列数组的1-n 行数据,将其赋值到棋盘数组中
                String[] sparse = line.split(" ");
                sparsearray[Integer.valueOf(sparse[0])][Integer.valueOf(sparse[1])]=Integer.valueOf(sparse[2]);
            }

            /*  将稀疏数组转化为棋盘数组如下:
            	0	0	0	0	0	0	0	0	0	0	0
                0	0	1	0	0	0	0	0	0	0	0
                0	0	0	2	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
                0	0	0	0	0	0	0	0	0	0	0
             */
            for (int[] i: sparsearray){
                for (int j:i){
                    System.out.print("\t"+j);
                }
                System.out.println();
            }
        }
    }
}

----如果喜欢,点个  红心♡  支持以下,谢谢----

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