JAVA数据结构与算法(1)-----稀疏数组

什么是稀疏数组

稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是指无效数据量远大于有效数据量的数组
例如:
普通数组

           00000000000000000            5*17    相当于   int[5][17]
           00000000000000000
           00000100000000000
           00000002000000000
           00003000000000000

稀疏数组

		5   17    3							5行   17列   3个有效数字
		2    5    1							下标(2,5)   值为1	
		3    8    2
		4    4    3

很明显使用稀疏数组存储会大大减少存储空间,并且可以提高读写速度
所以 当一个数组中大半部分元素为0或者为同一个值的数组时,可以用稀疏数组来保持该数组

接下来以五子棋棋盘举例

1,首先分析
五子棋棋盘为n*n的二维数组组成,具有存档功能 具体流程如图
JAVA数据结构与算法(1)-----稀疏数组_第1张图片

public static void main(String[] args){
     
		//创建原始二维数组 11*11
		//0表示空   1 表示黑 2表示蓝
		int cheaaArr1[][]=new int[11][11];   //创建原棋盘
		cheaaArr1[1][2]=1;
		cheaaArr1[2][3]=2;
		cheaaArr1[4][4]=2;
		System.out.println("原始二维数组");
		for(int[] row:cheaaArr1) {
     
			for(int data:row) {
     
			System.out.printf("%d\t",data);  //格式化输出 \t表示制表符
			}
			System.out.println();    //换行
		}
		//将二维数组转稀疏数组
		//1.遍历二维数组,得到非0数据个数
		int sum = 0;     //有效数据的个数
		for(int i=0;i<cheaaArr1.length;i++) {
     
			for (int j = 0; j < cheaaArr1.length; j++) {
     
				if(cheaaArr1[i][j]!=0) {
     
					sum++;
				}
			}
		}
		
		System.out.println("有效数据个数"+sum);
		
		//2.创建稀疏数组
		int sparseArr[][] =new int[sum+1][3];
		sparseArr[0][0]=cheaaArr1.length;		//得到稀疏数组的行数
		sparseArr[0][1]=cheaaArr1[0].length;  	//得到稀疏数组的列数
		sparseArr[0][2]=sum;					//得到稀疏数组的有效数据
		
		
		//3.遍历二维数组,将非0的值存到稀疏数组
		int count=0;//计数器
		for(int i=0;i<cheaaArr1.length;i++) {
     
			for (int j = 0; j < cheaaArr1.length; j++) {
     
				if(cheaaArr1[i][j]!=0) {
     
					count++;
					sparseArr[count][0]=i;
					sparseArr[count][1]=j;
					sparseArr[count][2]=cheaaArr1[i][j];
				}
			}
		}
		System.out.println("将稀疏数组写入到文件");
		int sparseArr2[][] =new int[sum+1][3];   
		try {
     
			FileWriter out = new FileWriter(new File("1.txt"));
			for (int i = 0; i < sparseArr.length; i++) {
     
				for (int j = 0; j < sparseArr[0].length; j++) {
     
					out.write(sparseArr[i][j]+"\t");
				}
				 out.write("\r\n"); 
			}
			out.close();
			
			//读取文件中的稀疏数组
			System.out.println("文件读取");
			BufferedReader in = new BufferedReader(new FileReader(new File("1.txt")));
			String line;  //一行数据
			int row=0;
			//逐行读取,并放入数组中
			while((line=in.readLine())!=null) {
     
				String[] temp = line.split("\t");
				for (int i = 0; i < temp.length; i++) {
     
					sparseArr2[row][i]=Integer.parseInt(temp[i]);
				}
				row++;
			}
			in.close();
			//4.输出稀疏数组的形式    \t是制表符   %d列数十进制整数   %c单个字符   %s字符串   printf格式输出
			for (int i = 0; i < sparseArr2.length; i++) {
     
				System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
				
			}
		} catch (Exception e) {
     
			e.printStackTrace();
		}
		System.out.println();

		
		//恢复稀疏数组
		//1.先读取稀疏数组的第一行的数据,创建原始的二维数组
			int chessArr2[][]=new int[sparseArr2[0][0]][sparseArr2[0][1]];
		
		//2.读取稀疏数组,再给二维数组赋值
			for (int i = 1; i < sparseArr2.length; i++) {
     
				chessArr2[sparseArr2[i][0]][sparseArr2[i][1]]=sparseArr2[i][2];
			}
		//3.展示	
			System.out.println("展示修复后的二维数组");
			for(int[] row:chessArr2) {
     
				for(int data:row) {
     
					System.out.printf("%d\t",data);  //格式化输出 \t表示制表符
				}
				System.out.println();
			}
	}

结果
JAVA数据结构与算法(1)-----稀疏数组_第2张图片

这个专栏主要记录自己学习数据结构与算法的过程,欢迎大家来一起探讨。
非常感谢尚硅谷的韩顺平老师。

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