zoukankan      html  css  js  c++  java
  • 稀疏数组

    稀疏数组

    介绍

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

    处理过程

    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 
    
    
  • 相关阅读:
    父级和 子集 controller 之间的通讯
    ui-router(三)controller与template
    ui-router详解(二)ngRoute工具区别
    关于MySql全文索引
    Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
    添加和删除索引以及如何给中间表添加两个主键
    设置数据库及表的默认字符集
    保存数据的时候报类型错误的原因和解决方案
    金融经济
    YII获取刚插入数据的id主键
  • 原文地址:https://www.cnblogs.com/moyuduo/p/12650185.html
Copyright © 2011-2022 走看看