**Java数据结构与算法之数组(稀疏数组)**

实际问题描述:
通常在围棋,五子棋方面会将棋盘的当前状态保存起来,由于在下棋的过程中可能会有大量的棋盘未放置棋子的状态0状态,白棋为1状态,黑棋子为2状态。
例如下图:
图中表示两个人一人走了一步
其中大量的0元素并没有保存的价值,因此,在保存该数组时需使用另一个数组进行保存,称之为稀疏数组。稀疏数组的建立:在稀疏数组的第一行记录原数组的行数、列数、不同数值的个数;在其他行记录不为0的元素所在的行数、列数以及数值。
上图的稀疏矩阵是一个三行三列的矩阵,图如下所示:

这样存储的数据量就小了很多(1111压缩为33)
1.原数组转换成稀疏数组代码实现:

	//创建一个原始的二维数组,用0表示没有棋子
		int chessarr[][]=new int[11][11];
		chessarr[1][2]=1;
		chessarr[2][3]=2;
		System.out.println("原始二维数组===");
		//使用增强for打印二位数组
		/*for(int[] row:chessarr){
			for(int i:row){
				System.out.printf("%d\t",i);
			}
			System.out.println();
		}
		*/
		
		//将二维数组转换成稀疏数组,便利原数组计算不一样数字的个数
		int sum=0;
		for(int i=0;i<chessarr.length;i++){
			for(int j=0;j<chessarr[0].length;j++){
				if(chessarr[i][j]!=0) 
					sum++;
			}
		}
		System.out.println(sum);
		//创建稀疏数组,先放入原数组的大小以及不一样元素的个数
		int separearr[][]=new int[sum+1][3];
		separearr[0][0]=chessarr.length;
		separearr[0][1]=chessarr[0].length;
		separearr[0][2]=sum;
		int tmp=1;
		for(int i=0;i<chessarr.length;i++){
			for(int j=0;j<chessarr[0].length;j++){
				if(chessarr[i][j]!=0){
					separearr[tmp][0]=i;
					separearr[tmp][1]=j;
					separearr[tmp][2]=chessarr[i][j];
					tmp++;
				}
			}
		}
		System.out.println("稀疏数组为========================");
		for(int[] row:separearr){
			for(int i:row){
				System.out.printf("%d\t",i);
			}
			System.out.println();
		}
		
  1. 将原数组转换成稀疏数组时需要进行存盘处置(I/O数据写入):
//将生成的二位矩阵写入磁盘文件中
  	File file=new File("F:/javawork/javvatest.txt");//存放的文件以及
  	FileWriter fwriter=new FileWriter(file);//问件写入流
  	for(int k=0;k<separearr.length;k++){
  		for(int j=0;j<separearr[0].length;j++){
  			fwriter.write(separearr[k][j]+"\t");
  		}
  		fwriter.write("\r\n");
  	}
  	fwriter.close();
  	

3.将数组从磁盘读取(I/O数据读取)

	//将磁盘数据读取到新的矩阵中
  	FileReader read=new FileReader(file);
  	BufferedReader bf=new BufferedReader(read);
  	String line;
  	int arr2[][]=new int[sum+1][3];
  	int row2=0;
  	while((line=bf.readLine())!=null)
  	{
  		String[] tmp2=line.split("\t");
  		
  		for(int i=0;i<tmp2.length;i++){
  			arr2[row2][i]=Integer.parseInt(tmp2[i]);
  		}
  		row2++;
  	}

4.将稀疏数组还原(相当于棋盘还原)

//将稀疏数组进行还原,先根据稀疏数组创建棋盘
  	int chessarr2[][]=new int[separearr[0][0]][separearr[0][1]];
  	//恢复数据
  	for(int i=1;i<=sum;i++){
  		chessarr2[separearr[i][0]][separearr[i][1]]=separearr[i][2];
  	}
  	System.out.println("恢复的原始数组为---------------");
  	for(int[] row:chessarr2){
  		for(int i:row){
  			System.out.printf("%d\t",i);
  		}
  		System.out.println();
  	}

参考韩顺平java数据结构和算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值