稀疏数组,一种简单的减小无关数据运算的算法思想

稀疏数组
    使用环境
        *当需要保存二维数组时,二维数组内含有大量无意义数据(如大多为0或相同的值)时,
        可先将其转化为稀疏数组,然后再存入文件
        相当于进行压缩操作
        *如应用于五子棋的局面保存
    处理方法
        *数组内第一行记录一共有几行几列,有多少个不同的值
        *然后将不同数对应的行列及值记录在之后
        *以上操作形成一个新的小规模数组,从而达到压缩作用
    具体操作
        *遍历原数组,得出有效数据个数sum
        *根据sum创建稀疏数组(sparseArr) int[sum+1][3]
        *将原数组的有效数据存入稀疏数组中
        恢复原数组的操作:
        *先读取稀疏数组第一行,根据数据创建原始二维数组
        *再读取后几行数据,赋值到对应位置
    代码实现(五子棋盘)
  

      package 稀疏数组的运用;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;

    public class sparseArr {

        public static void main(String[] args) throws Exception{
            //创建一个初始数组10*10表示棋盘
            //0表示没有棋子,1表示黑棋,2表示白棋
            int chessArr1[][] = new int[10][10];
            chessArr1[2][5] = 1;
            chessArr1[5][7] = 2; 
            
            //输出初始数组
            for(int []row : chessArr1){
                for(int data:row){
                System.out.printf("%d\t",data);
                }
                System.out.println();//每输出一行换行
            }
            //转换为稀疏数组
            //先遍历得出有效数字个数
            int sum = 0;
            for(int i = 0;i < 10; i++){
                for(int j = 0;j < 10; j++){
                    if(chessArr1[i][j] != 0)
                    sum++;
                }
            }
            //创建稀疏数组
            int sparseArr[][] = new int [sum+1][3];
            //赋值
            sparseArr[0][0] = 10;
            sparseArr[0][1] = 10;
            sparseArr[0][2] = sum;
            //遍历二维数组,将有效数字放入稀疏数组
            int count = 0;        //用于记录第几个有效数字;
            for(int i = 0;i < 10; i++){
                for(int j = 0;j < 10; j++){
                    if(chessArr1[i][j] != 0){
                        count++;
                        sparseArr[count][0] = i; 
                        sparseArr[count][1] = j;
                        sparseArr[count][2] = chessArr1[i][j];
                    }
                }
            }
            //输出稀疏数组
            for(int i = 0;i < sparseArr.length; i++){
                System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
            }
            System.out.println();
            
            //保存录入文件并读取
            ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("map.data"));
            output.writeObject(sparseArr);
            output.close();
            
            ObjectInputStream input = new ObjectInputStream(new FileInputStream("map.data"));
            int[][] sparseArr2 = (int[][]) input.readObject();
            //恢复稀疏数组(文件io部分)
            //先读取稀疏数组,并创建新二维数组

            int chessArr2[][] = new int[sparseArr2[0][0]][sparseArr2[0][1]];
            for(int i = 1;i < sparseArr2.length; i++){
                chessArr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];
            }
            //输出新二维数组
            for(int []row : chessArr2){
                for(int data:row){
                System.out.printf("%d\t",data);
                }
                System.out.println();//每输出一行换行
            }
            input.close();
        }
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值