彻底搞懂稀疏数组

312 阅读2分钟

这是我参与8月更文挑战的第四天,活动详情查看:8月更文挑战

前言

在写LeetCode的时候觉得自己数据结构和算法的知识不够牢固,学不好算法是万万不行的!所以去某站找数据结构与算法的视频进行学习,并查漏补缺。今天学的就是从了解到学会到掌握的稀疏数组~

稀疏数组

稀疏数组(sparse)

什么时候用

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

处理方法

1)记录下该数组一共有几行几列,有多少个不同的值

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

举例说明

image.png

转成稀疏数组↓

image.png

转稀疏数组思路

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

  • 遍历原始的二维数组,得到有效数据的总个数sum值

  • 根据sum值就可以创建稀疏数组sparseArr int[sum + 1] [3] (因为默认就三列,分别为行、列、值)

  • 将二维数组的有效数据存入到稀疏数组

稀疏数组 转 原始的二维数组的思路

  • 先读取稀疏数组的第一行,根据第一行的数据,得到数组的行数、列数,创建原始的二维数组,例如上面的 chessArr2 = int[11] [11]

  • 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可

代码实现

public class SparseArray{

public static void main(String[] args){

	//创建一个原始的二维数组 11*11

	// 0:表示没有棋子,1:表示黑子,2:表示蓝子

	int chessArr1[] [] = new int [11] [11];

	chessArr1[1] [2] = 1;

	chessArr1[2] [3] = 1;

	//输出原始的二维数组

	System.out.println("原始的二维数组");

	for(int[] row : chessArr1){

		for(int data : row){

			System.out.printf("%d\t",data);

		}

	}

	//将二维数组 转 稀疏数组

	//1.先遍历二维数组,得到非0数据的个数

	int sum = 0;

	for(int i =  0; i < chessArr1.length; i++){

		for(int j = 0; j < chessArr1.length ; j++){

			if(chessArr[i] [j] != 0){

				sum++;

			}

		}

	}

	//2.创建对应的稀疏数组

	int sparseArr[] [] = new int[sum+1] [3];

	//给稀疏数组赋值

	sparseArr[0] [0] = 11;

	sparseArr[0] [1] = 11;

	sparseArr[0] [2] = sum;

	//遍历二维数组,将非0的值存放到sparseArr中

	int count = 0; //count用于记录是第几个非0数据

	for(int i =  0;i<chessArr1.length;i++){

			for(int j = 0; j < chessArr1.length ; j++){

				count ++;

				if(chessArr[i] [j] != 0){

					sparseArr[count] [0] = i;

					sparseArr[count] [1] = j;

					sparseArr[count] [2]  = chessArr1[i] [j];

				}

			}

		}

		//输出稀疏数组的形式

		System.out.println();

		System.out.println("得到稀疏数组为");

		for(int i = 0; i < sparseAr.length; i++){

			System.out.printf("%d\t%d\t%d\t",sparseArr[i] [0],sparseArr[i] [1],sparseArr[i] [2]);

		}

		System.out.println();

		

	//将稀疏数组--> 恢复成 原始的二维数组

	int chessArr2[] [] = new int [sparseArr[0] [0]] [sparseArr[0] [1]] ;

	for( int i = 1 ; i < sparseArr.length ; i++){

		chessArr2[sparseArr[i] [0]] [sparseArr[i] [1]] = sparseArr[i] [2];			

	}

	//输出恢复后的二维数组

	System.out.println();

	System.out.println("恢复后的二维数组");

	for(int[] row: chessArr2){

		for(int data: row){

		System.out.printf("%d\t",data);

		}

		System.out.println();

	}

}

}

文章有写的不好的地方,还请大佬们不吝赐教!!

明天也要继续加油鸭!