数据结构之稀疏数组

1.稀疏数组的基本介绍

当一个数组中大部分值为0或者相同时,我们的数组相当于存储了很多意义不大的值,造成了空间上的浪费,所以我们就可以利用稀疏数组来存储这些值。

请添加图片描述

如何用稀疏数组来处理这样的上面这样类型的数组呢

(1)记录原数组一共几行几列,一共有多少不同的值。

(2)把这些值不相同的元素所在的行、列以及其本身的值记录在一个小规模数组当中。(这个小规模数组就是稀疏数组)

Eg:6行7列的二维数组——>9行3列的稀疏数组 如下图所示:
# 稀疏数组的首行记录:原始数组的行和列以及多少非零不同值的个数;
# 其他行记录:具体非零值的 :行+列+值  
	稀疏数组的行数=原二维数组有效元素的个数+1;
    稀疏数组的列数=3; 

请添加图片描述

2.稀疏数组的转换
2.1.二维数组——>稀疏数组
1) 先遍历原始二维数组得到有效数据的个数:sum
2) 根据sum就可以创建系数数组 sparseArray :int  [sum+1][3];行数=sum+1;列数=3
3) 将二维数组的有效数据存入到稀疏数组中即可
//一、创建原始二维数组
public static void main(String[] args) {
    //创建11行11列的五子棋盘    0:无棋子 1:黑棋 2:白棋    
    int [][] chessArray=new int[11][11];
    chessArray[1][2]=1;
    chessArray[2][3]=2;
    chessArray[4][5]=1;
    //做一个输出 加强for循环 一维数组一个加强for 二维数组两个嵌套
    for (int[] resultArray:chessArray){
        //这个for打印出来一个一维数组也就是一行
        for (int result:resultArray){
            System.out.print("\t"+result);
        }
        //让没打出一个数组 就换一行
        System.out.println();
    }
}

请添加图片描述

//二、将二维数组转换为稀疏数组
//1.先找出有效元素个数
int sum=0;
for (int i=0;i<11;i++){
    for (int j=0;j<11;j++){
        if (chessArray[i][j]!=0){
            sum++;
        }
    }
}
System.out.println("sum="+sum);
//2.创建对应的稀疏数组
int [][] sparseArray=new int[sum+1][3];
//给稀疏数组赋值
//首行赋值
sparseArray[0][0]=11;//第一行第一列 行数=11;
sparseArray[0][1]=11;//第一行第二列 列数=11;
sparseArray[0][2]=sum;//第一行第三列 有效数据为sum个;
//给剩下的行赋值 遍历二维数组 把非零的值存入稀疏数组
int current=0;//作为一个计数器 来表示是第几个非零数据 也就是稀疏数组的行数
for (int i=0;i<11;i++){
    for (int j=0;j<11;j++){
        if (chessArray[i][j]!=0){
            //而稀疏数组的行数是要递增的 每循环一次找到不是0的值 就要递增一次
            current++;
            sparseArray[current][0]=i; //本行的第一列就是原始数组的行
            sparseArray[current][1]=j;//本行的第二列就是原始数组的列
            sparseArray[current][2]=chessArray[i][j];//本行的第三列就是原始数组的该位置的值
        }
    }
}
//输出稀疏数组
System.out.println("这是稀疏数组");
//sparseArray.length 二维数组行的长度
//sparseArray[i].length 二维数组列的长度
for (int i=0;i<sparseArray.length;i++){
    System.out.println("\t"+sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
}

请添加图片描述

2.1稀疏数组——>二维数组
1) 根据稀疏数组的首行存储的元素确定原始二维数组的行数、列数、和非零有效数值的个数如上图所示: 
   int [ sparse[0][0] ] [ sparse[0][1] ]
   稀疏数组的sparse[0][0]—>二维数组的行数
   稀疏数组的sparse[0][1]—>二维数组的列数 
2) 再读取稀疏数组剩余几行的数据赋值给二维数组
public static void main(String[] args) {
    //一、将稀疏数组转换为二维数组
    //先创建一个稀疏数组
    int[][] sparseArray=new int[][]{{6,7,8},{0,3,22},{0,6,15},{1,1,11},
                                    {1,5,17},{2,3,-6},{3,5,39},{4,0,91},{5,2,28}};
    System.out.println("这是稀疏数组");
    for (int i=0;i<sparseArray.length;i++){
        System.out.println("\t"+sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
    }
    //1.把稀疏数组的首行赋给二维数组
    int[][] chessArray=new int[sparseArray[0][0]][sparseArray[0][1]];
    //2.读取稀疏数组后面几行(从第二行开始)的数据 赋值给二维数组
        //二维数组已经被动态初始化 而int类型的默认值为0 所以不用考虑0的存放
    for (int i=1;i<sparseArray.length;i++){
        //稀疏数组本行的第1列是二维数组的行
        //稀疏数组本行的第2列是二维数组的列
        //稀疏数组本行的第3列是二维数组在该位置的值
        chessArray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
    }
    System.out.println("这是转换后的二维数组");
    //打印二维数组
    for (int[] resultArray:chessArray){
        //这个for打印出来一个一维数组也就是一行
        for (int result:resultArray){
            System.out.print("\t"+result);
        }
        //让没打出一个数组 就换一行
        System.out.println();
    }
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄烤红薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值