数据结构与算法(一) 稀疏数组

引入实例

分析问题:因为该二维数组的很多值都是默认值0,因此记录了很多没有意义的数据,所以要用到稀疏数组来节省空间

稀疏数组的基本介绍

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
稀疏数组的处理方式是:
1.数组的第一行记录原数组一共有几行几列,有几个不同的值
2.把原数组具有不同的元素的行、列和值记录在小规模数组中,从而缩小程序的规模

应用实例

使用稀疏数组来保存类似前面的二维数组(棋盘,地图等)
把稀疏数组存盘,并且可以重新恢复原来的二维数组

思路分析

1.二维数组转稀疏数组的思路
1)遍历原始二维数组,得到有效数据的个数 sum
2)根据sum就可以创建稀疏数组sparsArr int[sum + 1],因为一个有效数据在稀疏数组中就是一行数据,而稀疏数组中的第一行存的是原始数组的行列及有效个数,所有稀疏数组长度为 sum + 1
3)将二维数组的有效数据存入稀疏数组

2.稀疏数组转原始数组的思路
1)首先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上图的chess = int [11] [11]
2)然后读取稀疏数组的后面几行的内容,并赋值给原始的二维数组即可

实现代码

1.二维数组转稀疏数组
1.1 得到有效个数 sum

//1.创建原始二维数组 并赋值
int chessArr[][] = new int[11][11];
//0:表示没有棋子  1:表示黑子  2:表示蓝子
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//遍历原始二维数组
System.out.println("原始数组:");
for (int[] row : chessArr){
    for (int data : row){
        System.out.print(data+"\t");
    }
    System.out.println();
}
//2.获取二维数组中有效数据个数 用于创建稀疏数组
int num = 0;
for (int[] row : chessArr){
    for (int data : row){
        if(data != 0 ){
            num++;
        }
    }
}

​ 1.2 创建稀疏数组sparsArr 长度为 sum+1,为什么是 sum+1上面已经解释过了

//3.创建稀疏数组
int sparseArr [][] = new int[num+1][3];

​ 1.3 将二维数组的有效数据存入稀疏数组

扫描二维码关注公众号,回复: 11477002 查看本文章
//4.将二维数组的有效数据存入稀疏数组
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = num;
int count = 0;//用于记录第几个有效数据
for(int i = 0;i < 11;i++){
    for(int j =0;j < 11;j++){
        if(chessArr[i][j]!=0){
            //有效数据
            count ++;
            sparseArr[count][0] = i;
            sparseArr[count][1] = j;
            sparseArr[count][2] = chessArr[i][j];
        }
    }
}

2.稀疏数组转原始数组
2.1 读取稀疏数组的第一行数据

//1.获取稀疏数组中的第一行数据,根据获取的数据创建二维数组
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];

​ 2.2 还原原始二维数组

//2.还原二位数组
//从第二行开始遍历
for(int i =1;i<sparseArr.length;i++){
    chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}

猜你喜欢

转载自blog.csdn.net/weixin_47254987/article/details/107596991