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

Java数据结构与算法-稀疏数组

注:学习心得基于课程Java数据结构与Java算法

简要说明

在这里插入图片描述
原因:原始的二维数组存在大量的默认值0,记录了许多无效数据,由此需要用到稀疏数组去缩小程序的规模。
在这里插入图片描述
存储方式:转换为稀疏数组,第一行存储原二维数组的行、列、有效数据的个数。之后的行分别存储有效数据的行、列、值。

		//创建一个11*11的棋盘,1表示黑子,2表示蓝子
        int chessArr[][] =new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;

        //输出原始的二维数组
        System.out.println("原始的二维数组:");
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
        System.out.println();

注:Java中的foreach循环遍历详解

转换过程分析

  • 原二维数组—>稀疏数组
  1. 遍历的得到有效数据个数sum
  2. 创建稀疏数组sparseArr
  3. 将有效数据存入该稀疏数组
 		//遍历得到有效数据的个数sum
        int sum = 0;
        for(int i = 0;i<chessArr.length;i++){
            for(int j = 0;j<chessArr[i].length;j++){
                if(chessArr[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("sum="+sum);
        System.out.println();
        //创建稀疏数组
        int spareArr[][] = new int[sum+1][3];

        //将有效数据存入稀疏数组中
        spareArr[0][0] = chessArr.length;
        spareArr[0][1] = chessArr[0].length;
        spareArr[0][2] = sum;
       		//遍历二维数组
        int count = 1;//用于记录是第几个非零数据
        for(int i = 0;i<chessArr.length;i++){
            for(int j = 0;j<chessArr[i].length;j++){
                if(chessArr[i][j]!=0&&count!=sum+1){
                    spareArr[count][0] = i;
                    spareArr[count][1] = j;
                    spareArr[count][2] = chessArr[i][j];
                    count++;
                }
            }
        }

        //输出稀疏数组
        System.out.println("得到的稀疏数组:");
        for(int i = 0;i<spareArr.length;i++){
            System.out.println(spareArr[i][0]+"\t"+spareArr[i][1]+"\t"+spareArr[i][2]);
        }
  • 稀疏数组还原为二维数组
  1. 读取稀疏数组的第一行创建二维数组
  2. 遍历,将有效数据存入。
int chessArr1[][] = new int[spareArr[0][0]][spareArr[0][1]];
        for(int i = 1;i<spareArr.length;i++){
            chessArr1[spareArr[i][0]][spareArr[i][1]] = spareArr[i][2];
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值