稀疏数组

守給你的承諾、 提交于 2020-04-07 00:01:01

稀疏数组

介绍

当我们在处理如五子棋这类棋盘问题时,只有棋盘中的黑子和白字位置对于我们来说是由具体意义的,当一个二维数组中的绝大多数值都是某一个值时,我们选定位默认值,我们可以使用稀疏数组来保存,以达到节约空间的目的

处理过程

  1. 创建一个n+1行3列的二维数组(n为待压缩数组中不同于选定默认值的个数)
  2. 在第一行分别保存待压缩数组的行数、列数、n
  3. 对每一个不同于默认值的值按照行号、列号、值记录一行

把一个二维数组压缩为稀疏数组

public class SparseArray {

	public int[][] array2SparseArray(int[][] res){
		int n=0;
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				if(res[i][j]!=0) {
					n++;
				}
			}
		}
		int[][] tar=new int[n+1][3];
		tar[0][0]=res.length;
		tar[0][1]=res[0].length;
		tar[0][2]=n;
		int row=1;
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				if(res[i][j]!=0) {
					tar[row][0]=i;
					tar[row][1]=j;
					tar[row][2]=res[i][j];
					row++;
				}
			}
		}
		return tar;
	}
	
	public static void main(String[] args) {
		int[][] res=new int[4][5];
		res[1][2]=1;
		res[0][3]=2;
		res[2][0]=1;
		res[2][2]=1;
		SparseArray sa=new SparseArray();
		sa.print(res);
		
		int[][] tar = sa.array2SparseArray(res);
		sa.print(tar);
	}
	
	public void print(int[][] res) {
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				System.out.print(res[i][j]+" ");
			}
			System.out.println();
		}
	}
}

输出:
0 0 0 2 0 
0 0 1 0 0 
1 0 1 0 0 
0 0 0 0 0 
4 5 4 
0 3 2 
1 2 1 
2 0 1 
2 2 1

把稀疏数组还原

public class SparseArray {

	public int[][] array2SparseArray(int[][] res){
		int n=0;
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				if(res[i][j]!=0) {
					n++;
				}
			}
		}
		int[][] tar=new int[n+1][3];
		tar[0][0]=res.length;
		tar[0][1]=res[0].length;
		tar[0][2]=n;
		int row=1;
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				if(res[i][j]!=0) {
					tar[row][0]=i;
					tar[row][1]=j;
					tar[row][2]=res[i][j];
					row++;
				}
			}
		}
		return tar;
	}
	
	public int[][] sparseArray2Array(int[][] res){
		int rows=res[0][0];
		int cols=res[0][1];
		int n=res[0][2];
		int[][] tar=new int[rows][cols];
		for(int i=1;i<=n;i++) {
			int row=res[i][0];
			int col=res[i][1];
			int val=res[i][2];
			tar[row][col]=val;
		}
		return tar;
	}
	
	public static void main(String[] args) {
		int[][] res=new int[4][5];
		res[1][2]=1;
		res[0][3]=2;
		res[2][0]=1;
		res[2][2]=1;
		SparseArray sa=new SparseArray();
		sa.print(res);
		
		int[][] tar = sa.array2SparseArray(res);
		sa.print(tar);
		
		int[][] res2 = sa.sparseArray2Array(tar);
		sa.print(res2);
	}
	
	public void print(int[][] res) {
		for(int i=0;i<res.length;i++) {
			for(int j=0;j<res[i].length;j++) {
				System.out.print(res[i][j]+" ");
			}
			System.out.println();
		}
	}
}
输出:
0 0 0 2 0 
0 0 1 0 0 
1 0 1 0 0 
0 0 0 0 0 
4 5 4 
0 3 2 
1 2 1 
2 0 1 
2 2 1 
0 0 0 2 0 
0 0 1 0 0 
1 0 1 0 0 
0 0 0 0 0 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!