java实现稀疏矩阵的压缩与解压的方法

 更新时间:2022年03月30日 09:06:42   作者:三国小梦  
这篇文章主要介绍了java实现稀疏矩阵的压缩与解压 ,把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵,需要的朋友可以参考下

任务要求

把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋。

把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵。

其中三元组的第一行用来存储原始稀疏矩阵的行数、列数和有效的数据个数,其余行用来存储有效的非0数据

思路分析

稀疏矩阵的压缩

  • 遍历原始的稀疏矩阵,得到有效的数据个数sum
  • 根据sum创建三元组new int [sum+1] [3](即sum+1行3列的二维数组)
  • 将二维数据的有效数据存入三元组中

稀疏矩阵的解压

  • 先读取三元组的第一行,根据第一行的数据创建一个二维数组
  • 再读取三元组的后面几行,并赋值给该二维数组即可

代码实现

稀疏矩阵的压缩

package zone.lxy.sparsearray;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/*
* 把稀疏矩阵压缩成三元组
* */
public class Compress {
    public static void main(String[] args) throws IOException {
        // 创建一个稀疏矩阵11*11
        // 0表示没有棋子
        // 1表示黑子
        // 2表示白子
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        // 输出原始的稀疏矩阵
        System.out.println("原始的稀疏矩阵:");
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                System.out.print(chessArr1[i][j] + " ");
            }
            System.out.println();
        }
        // 对稀疏矩阵压缩存储
        // 1.先遍历稀疏矩阵记录非0元素的个数
        int sum = 0;
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
        // 2.创建对应的三元组并初始化
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        // 3.把稀疏矩阵中的非0元素放到三元组中
        int count = 1;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                    count++;
        // 输出生成的三元组
        System.out.println("得到压缩后的三元组:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        // 把该三元组以文件形式保存起来,压缩完成
        FileOutputStream fos = new FileOutputStream("map.data");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(sparseArr);
        oos.close();
        fos.close();
    }
}
// 输出结果
原始的稀疏矩阵:
0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 0 
得到压缩后的三元组:
11 11 2 
1  2  1 
2  3  2 

稀疏矩阵的解压

package zone.lxy.sparsearray;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/*
* 把三元组还原成稀疏矩阵
* */
public class DeCompress {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 读取文件并赋值
        FileInputStream fis = new FileInputStream("map.data");
        ObjectInputStream ois = new ObjectInputStream(fis);
        int[][] sparseArr = (int[][]) ois.readObject();
        ois.close();
        fis.close();
        // 输出文件中的存储的三元组
        System.out.println("得到压缩后的三元组:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        // 先读取三元组的第一行,根据第一行数据创建原始的稀疏矩阵
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        int[][] chessArr = new int[row][col];
        // 从第二行开始读取三元组并赋值给稀疏矩阵
        for (int a = 1; a <sparseArr.length; a++) {
            int i = sparseArr[a][0];
            int j = sparseArr[a][1];
            int val = sparseArr[a][2];
            chessArr[i][j] = val;
        }
        // 输出解压后的稀疏矩阵
        System.out.println("解压后的二维数组:");
        for (int[] i : chessArr) {
            for (int item : i) {
                System.out.printf("%d ", item);
            }
            System.out.println();
        }
    }
}
// 输出结果
得到压缩后的三元组:
11 11 2 
1  2  1 
2  3  2 
解压后的二维数组:
0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 
0 0 0 2 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 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 0 0 0 0 0 

到此这篇关于java实现稀疏矩阵的压缩与解压 的文章就介绍到这了,更多相关java稀疏矩阵压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA项目常用异常处理汇总

    JAVA项目常用异常处理汇总

    这篇文章主要介绍了JAVA项目常用异常处理汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中的do while循环控制语句基本使用

    Java中的do while循环控制语句基本使用

    这篇文章主要介绍了Java中的do while循环控制语句基本使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java中HTTP GET方法调用带有body的问题解决

    Java中HTTP GET方法调用带有body的问题解决

    这篇文章主要为大家详细介绍了Java如何解决HTTP GET方法调用带有body的问题,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2024-02-02
  • Java实现英文猜词游戏的示例代码

    Java实现英文猜词游戏的示例代码

    这篇文章主要介绍了如何用Java编写一个英文猜词游戏,可以用来背英语单词。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-02-02
  • Java 实战项目锤炼之网上花店商城的实现流程

    Java 实战项目锤炼之网上花店商城的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+servlet+mysql+ajax实现一个网上花店商城系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java性能工具JMeter实现上传与下载脚本编写

    Java性能工具JMeter实现上传与下载脚本编写

    性能测试工作中,文件上传也是经常见的性能压测场景之一,那么 JMeter 文件上传下载脚本怎么做,本文详细的来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • SpringBoot实现获取客户端IP地理位置

    SpringBoot实现获取客户端IP地理位置

    在当今互联的世界中,了解客户端的地理位置对于提供个性化服务和增强用户体验至关重要,使用本文为大家介绍了SpringBoot获取客户端IP地理位置的相关方法,需要的小伙伴可以参考下
    2023-11-11
  • Spark-Sql入门程序示例详解

    Spark-Sql入门程序示例详解

    Spark SQL 作为 Spark 四大核心组件之一,主要用于处理结构化数据或半结构化数据,它支持在Spark 中使用 SQL 对数据进行查询,本文给大家介绍Spark-Sql入门程序,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • SpringCloud LoadBalancerClient 负载均衡原理解析

    SpringCloud LoadBalancerClient 负载均衡原理解析

    LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡,本文给大家深入解析 LoadBalancerClient 接口源码,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java如何实现单链表的增删改查

    Java如何实现单链表的增删改查

    这篇文章主要给大家介绍了关于Java如何实现单链表的增删改查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论