稀疏数组

java数组之稀疏数组

稀疏数组的介绍

稀疏数组是一个经典的时间换空间的数组操作

稀疏数组为一个二维数组 列数固定为3列

当一个数组中大部分元素为0,或者同一数值的数组时,可以用稀疏数组来保存该数组

稀疏数组的处理方式是

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的数字的位置即行 列 和 该数值记录在一个小规模的数组中,从而缩小程序的规模

稀疏数组的使用

以五子棋游戏为例

在这里插入图片描述
在这里插入图片描述

首先将这些数值用普通的二维数组表示并输出到控制台

int c[][]=new int[5][11];
c[0][2]=1;
c[1][3]=2;
for (int[] d:c) {   //将数组遍历出来
    for (int f:d) {
        System.out.print(f+" ");
    }
    System.out.println();
}
输出结果为:	//可以看到跟上面图片中的数值一样
			0 0 1 0 0 0 0 0 0 0 0 
			0 0 0 2 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 
			0 0 0 0 0 0 0 0 0 0 0 

用稀疏数组来保存上面的值

  • 第一行:保存二维数组的总行数和总列数 和 有效数值的个数 可以看出上面二维数组的行数为 11 列数为11 有效数值个数为2个
  • **第二行:**保存第一个有效数值的所在的行数 列数 以及数值 第一个有效数值为1 行数为0 列数为2 数组中的下标从0开始 行列同样
  • 第三行:保存第一个有效数值的所在的行数 列数 以及数值 第一个有效数值为2 行数为1 列数为3

将数组存放到稀疏数组中 这就构成了一个稀疏数组

有效数值
11112 //有效数值个数
021
132
  1. 稀疏数组的第一行为二维数组的总行数和列数 以及有效数值的个数
  2. 下面依次保存的是 有效数值的行数 列数 以及数值

代码演示

将上面的二维数组用代码转换为稀疏数组

 //按照上面的数据建立一个二维数组
        int c[][]=new int[11][11];
        c[0][2]=1;
        c[1][3]=2;
  //通过循环遍历求出该数组里的有效数值有几个  
        int num=0;		//有效数值的个数
        for (int i = 0; i <c.length ; i++) {
            for (int j = 0; j <c[i].length ; j++) {
               if (c[i][j]!=0){     	//当有数字不为o时 就是有效数字 让 num+1 
                   num++;
               }
            }
        }

//建立一个二维数组作为稀疏数组
//该数组的总行数就是有效数值加一 ,每一行存放一个有效数字的行 列 和 数值 加上第一行存放的数值信息 所以加1 
        int x[][]=new int[num][3];
        x[0][0]=11;
        x[0][1]=11;
        x[0][2]=num;
//通过循环遍历原始的二维数组得到有效数字的行 列 数值 并依此赋值给稀疏数组

 		int sum=1;     	//sum作为赋值下标 稀疏数组下标为 0 的第一行已经赋值过了 所以从1开始
        for (int i = 0; i <c.length ; i++) {
            for (int j = 0; j <c[i].length ; j++) {
                if (c[i][j]!=0){
                        x[sum][0]=i;         //行
                        x[sum][1]=j;        //列
                        x[sum][2]=c[i][j];  //数值
                        sum++;  //赋值过后让sum自增 作为下次赋值的下标
                }
            }
        }
 //将稀疏数组还原遍历
 //新建一个二维数组 列和行 由稀疏数组第一行保存的值 赋值
        int p[][]=new int[x[0][0]][x[0][1]];
		//通过循环向新建的数组中赋值 赋值次数为 稀疏数组中保存的有效数字个数 也就是x[0][3]
    for (int i = 1; i <x[0][3] ; i++) { //int = 1 跳过下标为0的第一列 第一列保存的是原始数组的 行数 列数 有效数值个数
          p[x[i][0]][x[i][1]]=x[i][2];
  //根据稀疏数组中保存的有效数值的 行 列 数值 向二维数组中赋值
        }
    //遍历二维数组 显示原始状态
        for (int j[]:p) {
            for (int o:j) {
                System.out.print(o+" ");
            }
            System.out.println();
        }
    }

     //稀疏数组是典型的时间换空间的方法
     //数据的储存和调用比较复杂浪费时间 但是比起原始数据储存 忽略掉了大量的无用数值 节省了空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值