数据结构(Java)——稀疏数组

本文介绍了稀疏数组的概念,它用于存储大部分元素为零的矩阵,以节省内存。文章通过一个示例展示了如何将原始二维数组转换为稀疏数组,并提供了Java代码实现稀疏数组的存储和还原过程。
摘要由CSDN通过智能技术生成

数据结构(Java)——稀疏数组

一、稀疏数组概念

稀疏矩阵(英语:sparse matrix),在数值分析中,是其元素大部分为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的。在计算机中以数组方式存储矩阵,即二维数组对应数学上的矩阵概念。
在使用计算机存储和操作稀疏矩阵时,经常需要修改标准算法以利用矩阵的稀疏结构。由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。
压缩的原理是:记录行数、列数和有效值个数以及有效值在一个小型二维数组中。

二、稀疏数组示例

原始数组数据:

[0][1][2][3][4][5]
[0]000000
[1]100000
[2]000000
[3]000-400
[4]000000
[5]000007

对应稀疏数组:

[0]663
[1]101
[2]33-4
[3]557

由以上两个表格内容可知,该稀疏数组[0]行表示原数组是有三个有效值的六行六列二维数组。后三行则是具体数据。

三、稀疏数组存储还原代码实现

啥也不说了,上代码!算了还是多说一句,代码是人,注解就是命!

public class SparseMatrix
{
    public static void main( String[] args )
    {
        //创建一个6*6的二维数组
        int[][] array1=new int[6][6];
        array1[1][0]=1;
        array1[3][3]=-4;
        array1[5][5]=7;
        System.out.println("输出原始数组数据:");
        for(int[] ints:array1){
            for(int anInt:ints){
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

        System.out.println("=====================");

        //原始数组转换为稀疏数组保存
        //1.获取有效值的个数
        int sum=0;
        for(int i=0;i<array1.length;i++){
            for(int j=0;j<array1.length;j++){
                if(array1[i][j]!=0)
                    sum++;
            }
        }
        System.out.println("有效值个数:"+sum);

        //2.创建一个稀疏数组
        //sum+1:总行数。即有效值个数加上存放行、列、有效值个数的一行
        int[][] array2=new int[sum+1][3];
        array2[0][0]=6;//6行
        array2[0][1]=6;//6列
        array2[0][2]=3;//有效值个数

        //3.遍历原始数组,将有效值存入稀疏数组中
        int count=0;//对应有效值个数
        for(int i=1;i<array1.length;i++){
            for(int j=0;j<array1.length;j++){
                if(array1[i][j]!=0){
                    count++;
                    array2[count][0]=i;
                    array2[count][1]=j;
                    array2[count][2]=array1[i][j];
                }
            }
        }

        System.out.println("输出稀疏数组:");
        for(int i=0;i<array2.length;i++){
            for(int j=0;j<3;j++){
                System.out.print(array2[i][j]+"\t");
            }
            System.out.println();
        }

        System.out.println("======================");
        //实现稀疏数组的读取
        //1.创建一个用来读取稀疏数组的数组,已知稀疏数组第[0]行前两个值分别为行列数
        int[][] array3=new int[array2[0][0]][array2[0][1]];

        //还原有效值位置,且已知有效值在稀疏数组最后一列
        //注意此处需要从i=1开始遍历,因为稀疏数组第[0]行存储行数、列数、有效值个数
        for(int i=1;i<array2.length;i++){
            array3[array2[i][0]][array2[i][1]]=array2[i][2];
        }

        //2.打印出来
        System.out.println("输出还原后的数组:");
        for(int i=0;i<array3.length;i++){
            for(int j=0;j<array3.length;j++){
                System.out.print(array3[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

输出结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值