java数据结构与算法学习_稀疏数组

稀疏数组
当一个数组大部分都为元素0,或为同一个值的数组时,可以使用稀疏数组
即将一个原始数组进行压缩保存

举例:五子棋下棋中途保存

保存方法
1.记录原始数组一共有几行几列,有多少个不同的值
2.把具有不同值的元素的行列及值的数据记录在一个小规模数组中,从而缩小程序的规模

应用场景举例
java数据结构与算法学习_稀疏数组_第1张图片
创建一个11*11的棋盘,其中1代表黑子,2代表蓝子,其余地方都可以填充0代替,因此可以创建出一个二维数组

在这里插入图片描述
用稀疏数组将原始数组压缩,其中
第一行第一列:记录原始数组行数
第一行第二列:记录 原始数组列数
第一行第三列:记录不同值的个数

第二行开始,第一列记录特殊值的行坐标,第二列记录特殊值的列坐标,第三列记录值本身数据.
以此类推,将所有非0的值的坐标及值的数据,记录到每一行,可以形成一个新的数组(稀疏数组)

int sparseArr[][] = new int[11][11]{{11,11,3},
									{1,2,1},
									{2,3,2},
									{4,5,2}};

代码实现

创建一个原始的二维数组11*11
0:代表没有棋子 1:代表黑子 2:代表蓝子

		int chessArr1[][] = new int[11][11];
		chessArr1[1][2] = 1;
		chessArr1[2][3] = 2;
		chessArr1[4][5] = 2;

开始将原始数组转换为稀疏数组

思路实现:
1.先遍历二维数组 得到非0数据的个数

		int sum = 0; //记录非零个数

		for(int i = 0 ; i < chessArr1.length ; i++) {
			for(int j = 0 ; j < chessArr1[i].length ; j++) {
				if(chessArr1[i][j] != 0) {
					sum++;
				}
			}
		}

2.创建对应的稀疏数组
行数 = 非0数据个数+1
列数 = 3

		int sparseArr[][] = new int[sum+1][3];
		sparseArr[0][0] = chessArr1.length; //第一行第一列,存多少行
		sparseArr[0][1] = chessArr1[0].length;//存多少列
		sparseArr[0][2] = sum;//非0数据个数

3.遍历二维数组,将非0的值存放到稀疏数组中

		int count = 0;//用于记录是第几个非0数据
		
		//开始循环原始数组
		for(int i = 0 ; i < chessArr1.length ; i++) {
			for(int j = 0 ; j < chessArr1[i].length ; j++) 
			{
				if(chessArr1[i][j] != 0) {
					count++; //当值非0时,非0数据个数+1
					sparseArr[count][0] = i; //第一列存放行
					sparseArr[count][1] = j; //第二列存放列
					sparseArr[count][2] = chessArr1[i][j];
				}
			}
		}

4.输出形成的稀疏数组

for(int i = 0 ; i < sparseArr.length ; i++) {
			for(int j = 0 ; j < sparseArr[i].length ; j++) {
				System.out.printf("%d\t",sparseArr[i][j]);
				}
			System.out.println();
			}	

5.将稀疏数组恢复成原始的二维数组

		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];
		}

6.恢复后的二维数组与原始数组一致

		System.out.println("恢复后的二维数组");
		
		for(int[] row : chessArr2) {
			for(int item : row) {
				System.out.printf("%d\t",item);
			}
			System.out.println();
		}

附加尝试
1.如果普遍数据不是0,稀疏数组如何恢复二维数组

		int index = 1;//确定有效数据行位置,起始为1

		for(int i = 0 ; i < chessArr2.length ; i++) {
			for(int j = 0 ; j < chessArr2[i].length ; j++) {
				//index的范围为1-有效数据个数: 1-sparseArr[0][2]
				if(i == sparseArr[index][0] && j == sparseArr[index][1]) {
					chessArr2[i][j] = sparseArr[index][2];
					if(index < sparseArr[0][2]) {
						index++;
					}
				}
				else {
					//假设普遍值为5
					chessArr2[i][j] = 5;
				}
			}
		}

2.将完成的稀疏数组数组保存至文件里

		//文件路径定义在主方法外面:Public static String filePath 
		File file = new File(filePath);
		
		//判断文件是否存在
		if(!file.exists()) {
			try {
				file.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		Writer out = new FileWriter(file);
		
		//将每一行数据转为String类型,写入文件
		String temp = ""; 
		StringBuffer st = new StringBuffer(temp);
		
		for(int i = 0 ; i < sparseArr.length ; i++) {
			for(int j = 0 ; j < sparseArr[i].length ; j++) {
					st.append(sparseArr[i][j]);
					st.append("、");
					}
			String temp2 = st.toString();
			
			try {
				out.write(temp2);
				out.write("\r\n");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			st.delete(0, st.length()); //每写完一行清空StringBuffer
		}
		
		out.close(); //关闭Writer

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