数据结构(一):稀疏数组

前言

主要内容:主要介绍了稀疏数组的概念及稀疏数组与二维数组之间的相互转换


一、为什么要使用稀疏数组?

当一个数组存在大量重复数据时,比较占用空间,而通过稀疏数组来保存原数组,就可以达到节省空间的目的.

二、稀疏数组的概念

一个存在大量重复元素的数组A,通过另一个数组B来简化和保存原数组 A,以此来缩小数组A的规模,这个数组B就叫做稀疏数组.

三、稀疏数组的表示

稀疏数组的格式为下表:

row(行)row(列)val(值)
此处为原数组的总行数此处为原数组的总列数此处为原数组有效元素个数(即不同于原数组重复值的元素个数)
第一个有效元素的行数(从第0行起)第一个有效元素的列数(从第0列起)第一个有效元素的值
第二个有效元素的行数第二个有效元素的行数第二个有效元素的值
第三个…

假设有一个二维数组(6*6)如下图:

010000
000010
000002
000000
000000
000000

转换为稀疏数组后如图所示:

rowcolval
663
011
141
252

四、稀疏数组与二维数组之间的相互转换

1.二维数组转换为稀疏数组

思路:
(1).
获取二维数组的行数(数组名.length)、列数(数组名[0].length)、有效元素个数

(2).
创建稀疏数组

(3)
输入元素到稀疏数组

例子:

创建一个8*8的二维数组

// 6*6二维数组的创建
        int InitialArr[][] = new int[8][8];

        // 预先放置几个有效元素 其余元素置为0
        InitialArr[0][1] = 1;
        InitialArr[1][2] = 2;
        InitialArr[2][4] = 5;

        // 遍历输出该数组
        for (int i = 0; i < InitialArr.length; i++) {
            for (int j = 0; j < InitialArr[0].length; j++) {
                System.out.printf("%s\t", InitialArr[i][j]);
            }
            System.out.println(); // 打印完一行后换行
        }

创建结果如图:

0	1	0	0	0	0	0	0	
0	0	2	0	0	0	0	0	
0	0	0	0	5	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	

转换:

int sum = 0; //获取有效元素个数
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if(InitialArr[i][j]!=0){
                    sum++;
                }
            }
        }

        // 由稀疏数组格式知 稀疏数组的行数为有效元素个数+1 列数始终为3
        // 创建稀疏数组
        int SparseArray1[][] = new int[sum+1][3];
        SparseArray1[0][0] = 8;
        SparseArray1[0][1] = 8;
        SparseArray1[0][2] = sum; //第一行数据填入
        int count = 0;
        // count作为有效元素个数的依据

        //依次第一个、第二个....有效元素填入稀疏数组

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if(InitialArr[i][j]!=0){
                    SparseArray1[count+1][0] = i; //填入行
                    SparseArray1[count+1][1] = j; //填入列
                    SparseArray1[count+1][2] = InitialArr[i][j]; //填入值
                    count++;
                }
            }
        }

        // 输出稀疏数组
        for (int i = 0; i < sum+1; i++) {
            System.out.printf("%d %d %d ",SparseArray1[i][0],SparseArray1[i][1],SparseArray1[i][2]);
            System.out.println();
        }

结果如图:

8 8 3 
0 1 1 
1 2 2 
2 4 5 

2.稀疏数组转换为二维数组

思路:
(1).
读取稀疏数组第一行信息,根据得到的行列数和有效元素个数创建二维数组

(2).
再获取有效元素的行列数与值,赋给二维数组即可

以上面例子中的稀疏数组为例:

 // 获取稀疏数组的行列数创建二维数组
        int row1 = SparseArray1[0][0];
        int col1 = SparseArray1[0][1];
        int TestArray[][] = new int[row1][col1];

        // 将有效元素填入数组
        for (int i = 1; i < SparseArray1.length; i++) {
                TestArray[SparseArray1[i][0]][SparseArray1[i][1]] = SparseArray1[i][2]; //根据稀疏数组的行列值填
        }

        // 输出二维数组
        for (int i = 0; i < row1; i++) {
            for (int j = 0; j < col1; j++) {
                System.out.printf("%s\t",TestArray[i][j]);
            }
            System.out.println();
        }

输出结果:

0	1	0	0	0	0	0	0	
0	0	2	0	0	0	0	0	
0	0	0	0	5	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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值