1.稀疏矩阵的基本介绍
当一个数组内部大部分的数据都是0或者是同一个数值的时候,我们可以采用稀疏矩阵来存储该数组
2.稀疏矩阵的处理方法
(1) 首先要记录二维数组一共有多少行,多少列,有多少个不同的值
(2) 其次将这些数值都记录在一个较小规模的稀疏矩阵中,稀疏矩阵为int[?] [3] sparseArr。其中稀疏数组的第一行存储的是二维数组的行、列、不同值得个数。(?指的就是不同值个数+1)
2.1实例
3.二维数组转矩阵的思路
1)遍历原始的二维数组,得到有效值个数SUM
2)创建稀疏矩阵sparseArr[SUM+1][3]
3)将行、列、有效个数存储在稀疏矩阵第一行
3)将二维数组中的数据所在的行、列、值存储到稀疏矩阵中
3.1代码实现
public class SparseArr {
public static void main(String[] args) {
//黑子为1,白子为2
int black = 1;
int white = 2;
//创建一个棋盘二维数组
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//遍历这个棋盘
for(int[] row : chessArr){
for(int item : row){
System.out.printf("%d\t",item);
}
System.out.println();
}
int sum = 0;
for(int i = 0;i<11;i++){
for (int j = 0; j < 11; j++) {
if(chessArr[i][j] != 0){
sum++;
}
}
}
System.out.println(sum);
//创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
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];
}
}
}
//遍历稀疏数组
for (int[] row : sparseArr) {
for (int item : row){
System.out.printf("%d\t",item);
}
System.out.println();
}
}
}
4.稀疏矩阵转二维数组思路
1)先读取稀疏数组的第一行,再创建二维数组
2)再读取下面的内容,将所对应的值正确的放入到二维数组中
public class SparseArr {
public static void main(String[] args) {
//黑子为1,白子为2
int black = 1;
int white = 2;
//创建一个棋盘二维数组
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//遍历这个棋盘
for(int[] row : chessArr){
for(int item : row){
System.out.printf("%d\t",item);
}
System.out.println();
}
int sum = 0;
for(int i = 0;i<11;i++){
for (int j = 0; j < 11; j++) {
if(chessArr[i][j] != 0){
sum++;
}
}
}
System.out.println(sum);
//创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
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];
}
}
}
//遍历稀疏数组
for (int[] row : sparseArr) {
for (int item : row){
System.out.printf("%d\t",item);
}
System.out.println();
}
System.out.println("--------------------------------------");
//将稀疏数组转换成二维数组棋盘
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1;i<=sparseArr[0][2];i++){
for (int j =0;j<3;j++){
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
for(int[] row : chessArr2){
for(int item : row){
System.out.printf("%d\t",item);
}
System.out.println();
}
}
}
5.总结
稀疏矩阵主要是用来压缩存储的,我们可以发现上面的11×11的矩阵被压缩至3×3的矩阵,减少了存储空间。实践是检验真理的唯一标准,只有当自己能理解原理,敲出代码,才是真正的掌握了这些内容。
6.声明
本文是作者在学习数据结构中的一些笔记,希望能够帮助到大家。作者才疏学浅,如有错误,欢迎批评指正。