数据结构-数组

本文介绍了稀疏矩阵的概念,当数值为0的元素远多于非0元素时,使用稀疏矩阵能节省存储空间。内容包括二维数组如何转换为稀疏数组,以及稀疏数组如何转换回二维数组,同时还提供了相应的代码实现。
摘要由CSDN通过智能技术生成

文章目录

稀疏矩阵

稀疏矩阵:数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律

二维数组转稀疏数组:

  1. 获取原始数组的有效数据数量
  2. 根据有效数据数量创建稀疏数组
  3. 设置稀疏数组第0行:原始矩阵行数,原始矩阵列数,有效数据量
  4. 将原始数组的有效数据存入稀疏数组:有效数据所在行,有效数据所在列,有效数据值

稀疏数组转二维数组:

  1. 根据稀疏数组第0行数据,创建二维数组
  2. 读取稀疏数组其他几行数据,并赋值给二维数组

代码实现:

import java.util.Arrays;

public class SparseMatrix {
    private static int getValidSize(int[][] source) {
        // 有效数据量
        int valid = 0;
        for (int r = 0; r < source.length; r++) {
            for (int c = 0; c < source[r].length; c++) {
                if (source[r][c] != 0) {
                    valid++;
                }
            }
        }
        return valid;
    }

    // 二维数组转稀疏数组
    public static int[][] parseSourceToSparse(int[][] source) {
        // 获取原始数组的有效数据数量
        int validSize = getValidSize(source);
        // 根据有效数据数量创建稀疏数组
        int[][] sparse = new int[validSize + 1][3];
        // 设置稀疏数组第0行:原始矩阵行数,原始矩阵列数,有效数据量
        sparse[0][0] = source.length;
        sparse[0][1] = source[0].length;
        sparse[0][2] = validSize;
        // 记录是第几个非0数据
        int count = 0;
        // 将原始数组的有效数据存入稀疏数组:有效数据所在行,有效数据所在列,有效数据值
        for (int r = 0; r < source.length; r++) {
            for (int c = 0; c < source[r].length; c++) {
                if (source[r][c] != 0) {
                    count++;
                    sparse[count][0] = r;
                    sparse[count][1] = c;
                    sparse[count][2] = source[r][c];
                }
            }
        }
        return sparse;
    }

    // 稀疏数组转二维数组
    public static int[][] parseSparseToSource(int[][] sparse) {
        // 根据稀疏数组第0行数据,创建二维数组
        int[][] source = new int[sparse[0][0]][sparse[0][1]];
        // 读取稀疏数组其他几行数据,并赋值给二维数组
        for (int r = 1; r < sparse.length; r++) {
            source[sparse[r][0]][sparse[r][1]] = sparse[r][2];
        }
        return source;
    }

    public static void main(String[] args) {
        int[][] source = new int[9][9];
        source[0][0] = 1;
        source[8][8] = 1;
        int[][] sparse = parseSourceToSparse(source);
        for (int r = 0; r < sparse.length; r++) {
            System.out.println(Arrays.toString(sparse[r]));
        }
        int[][] recover = parseSparseToSource(sparse);
        for (int r = 0; r < recover.length; r++) {
            System.out.println(Arrays.toString(recover[r]));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值