数据结构--稀疏数组(学习笔记)

sparseArray 稀疏数组

应用场景:用于二维数组的大小优化,当二维数组中有大量相同的值时。

---------------------------------------代码实现---------------------------------------

public static void main(String[] args) {
    //二维数组
    int a[][] = new int[5][5];
    a[1][2] = 3;
    a[2][4] = 5;
    a[3][1] = 1;
    for (int[] ints : a) {
        for (int anInt : ints) {
            System.out.printf("%d\t",anInt);
        }
        System.out.println();
    }
}

如上图一个二维数组,里面有25个元素,其中有22个0,这时就可以用稀疏数组优化存储大小。

此时计算出的稀疏数组格式应该为:

5 5 3        //行数,列数,特殊值个数

1 2 3        //第2行第3列的值为3

2 4 5        //第3行第5列的值为5

3 1 1        //第4行第2列的值为1

这样新的稀疏数组中的只有12个元素,相较之前二维数组中的25个已经明显看出区别。

---------------------------------------代码实现---------------------------------------

//得到特殊元素总数
int sum = 0;
for (int[] ints : a) {
    for (int anInt : ints) {
       if(anInt != 0) sum++;
    }
}
System.out.println("特殊元素总数为:"+sum);
//新建一个稀疏数组
int sparseArray[][] = new int[sum+1][3];
//第一行数据赋值   5行5列 sum个特殊元素
sparseArray[0][0] = 5;
sparseArray[0][1] = 5;
sparseArray[0][2] = sum;
//赋值
int z = 1;//用于计算稀疏数组中的行下标
for (int i = 0;i < a.length;i++){
    for (int j = 0;j < a[i].length;j++){
        if(a[i][j] != 0){
            //z=1表示:当检测到第1个特殊元素时,把这个元素的下标和value存到稀疏数组的第二行(由于第一行存了数组信息5行5列3个元素,所以这里存第二行)
            sparseArray[z][0] = i;
            sparseArray[z][1] = j;
            sparseArray[z][2] = a[i][j];
            z++;
        }
    }
}
//打印
System.out.println("稀疏数组");
for (int[] ints : sparseArray) {
    for (int anInt : ints) {
        System.out.printf("%d\t",anInt);
    }
    System.out.println();
}

控制台输出:

接下来记录将稀疏数组再转化成二维数组

---------------------------------------代码实现---------------------------------------

//恢复成二维数组
int row = sparseArray[0][0];//得到行数
int col = sparseArray[0][1];//得到列数
int b[][] = new int[row][col];//此时得到了一个5行5列元素全是0的二维数组
//从第二行开始遍历sparseArray给新建的二维数组赋值
for (int i = 1;i < sparseArray.length;i++){
    int x = sparseArray[i][0];//拿到多少行x
    int y = sparseArray[i][1];//拿到多少列y
    b[x][y] = sparseArray[i][2];//在x,y处赋值
}
//打印
System.out.println("新的二维数组");
for (int[] ints : b) {
    for (int anInt : ints) {
        System.out.printf("%d\t",anInt);
    }
    System.out.println();
}

得到结果

好的一逼!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值