当前位置 博文首页 > 数组_队列_链表(Java)_Inmaturity_7的博客:数据结构和算法学习

    数组_队列_链表(Java)_Inmaturity_7的博客:数据结构和算法学习

    作者:[db:作者] 时间:2021-08-01 14:49

    数据结构和算法学习笔记一_数组_队列_链表

    (学自尚硅谷数据结构和算法前30节(java版))

    一、稀疏数组(压缩存储数组)

    1.1、介绍

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

    1.2、稀疏数组的处理办法是:
    1. 记录数组一共有几行几列,有多少个不同的值
    2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
    1.3、举例:五子棋程序,存盘退出和恢复上盘

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ec9X7eui-1605108410981)(D:\TyporaPic\image-.png)]

    因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据->转换成稀疏数组
    在这里插入图片描述

    二维数组转成稀疏数组的思路:

    • 遍历原始的二位数组,得到有效数据的个数sum
    • 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
    • 将二维数组的有效数据存入到稀疏数组

    稀疏数组转成二维数组的思路:

    • 读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
    • 读取稀疏数组除第一行的数组并赋值给原始的二维数组
    1.4、代码实现
    package com.lxf.sparsearray;
    
    public class SparseArray {
        public static void main(String[] args) {
            //创建一个原始的二维数组11*11,假设有两个棋子:黑子在第二行第三列,蓝子在第三行第四列。
            //0:表示没有棋子,1表示黑子 ,2表篮子
            int charArr1[][] = new int[11][11];
            charArr1[1][2]=1;
            charArr1[2][3]=2;
            charArr1[1][3]=1;
            charArr1[1][4]=2;
            charArr1[3][2]=1;
            charArr1[2][2]=2;
            //row column 长度
            int rowL=charArr1.length;
            int columnL=charArr1[0].length;
            //输出原始的二维数组
            System.out.println("原始的二维数组:");
            for (int[] row : charArr1) {
                for (int data : row) {
                    System.out.printf("%d\t",data);
                }
                System.out.println();
            }
            //原始二维数组转成稀疏数组
            //1.
            // 得到非0数据的个数
            //记录数组中非零数的个数
            int sum=0;
            for (int[] row : charArr1) {
                for (int data : row) {
                    if(data!=0){
                        sum++;
                    }
                }
            }
            //2.创建对应的稀疏数组
            int[][] sparseArr = new int[sum + 1][3];
    
            //3.将二维数组的数赋值给稀疏数组
            sparseArr[0][0]=rowL;
            sparseArr[0][1]=columnL;
            sparseArr[0][2]=2;
            //记录稀疏数组行
            int count=0;
            for (int i = 0; i < rowL; i++) {
                for (int j = 0; j < columnL; j++) {
                    if(charArr1[i][j]!=0){
                        count++;
                        sparseArr[count][0]=i;
                        sparseArr[count][1]=j;
                        sparseArr[count][2]=charArr1[i][j];
                    }
                }
            }
            //4.打印稀疏数组
            System.out.println("得到的稀疏数组为:");
            for (int[] row : sparseArr) {
                System.out.printf("%d\t%d\t%d\t",row[0],row[1],row[2]);
                System.out.println();
            }
            //5.将稀疏数组恢复成二维数组
            int[][] charArr2=new int[sum+1][3];
            for (int i = 1; i < sparseArr.length; i++) {
                charArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
            }
            //输出恢复后的二维数组
            System.out.println("恢复后的二维数组:");
            for (int[] row : charArr2) {
                for (int data : row) {
                    System.out.printf("%d\t",data);
                }
                System.out.println();
            }
        }
    }
    
    

    结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiimeHw8-1605108411030)(D:\TyporaPic\image-.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7LEFGRlX-1605108411047)(D:\TyporaPic\image-.png)]

    稀疏数组存入文件,从文件取出操作代码:

    package com.lxf.sparsearray;
    
    import java.io.*;
    import java.util.Arrays;
    
    public class SparseArray {
        public static void main(String[] args) throws IOException {
            //创建一个原始的二维数组11*11,假设有两个棋子:黑子在第二行第三列,蓝子在第三行第四列。
            //0:表示没有棋子,1表示黑子 ,2表篮子
            int charArr1[][] = new int[11][11];
            charArr1[1][2]=1;
            charArr1[2][3]=2;
            charArr1[1][3]=1;
            charArr1[1][4]=2;
            charArr1[3][2]=1;
            charArr1[2][2]=2;
            //row column 长度
            int rowL=charArr1.length;
            int columnL=charArr1[0].length;
            //原始二维数组转成稀疏数组
            //1.
            // 得到非0数据的个数
            //记录数组中非零数的个数
            int sum=0;
            for (int[] row : charArr1) {
                for (int data : row) {
                    if(data!=0){
                        sum++;
                    }
                }
            }
            //2.创建对应的稀疏数组
            int[][] sparseArr = new int[sum + 1][3];
    
            //3.将二维数组的数赋值给稀疏数组
            sparseArr[0][0]=rowL;
            sparseArr[0][1]=columnL;
            sparseArr[0][2]=2;
            //记录稀疏数组行
            int count=0;
            for (int i = 0; i < rowL; i++) {
                for (int j = 0; j < columnL; j++) {
                    if(charArr1[i][j]!=0){
                        count++;
                        sparseArr[count][0]=i;
                        sparseArr[count][1]=