稀疏数组

news2024/11/28 12:53:20

章节目录:

    • 一、稀疏数组
      • 1.1 需求引出
      • 1.2 基本介绍
      • 1.3 应用实例
    • 二、结束语

一、稀疏数组

1.1 需求引出

假设我们有个五子棋程序,使用1来表示黑子,2表示蓝子,0表示没有棋盘落子,并且需要对棋盘数据进行存储。

  • 前端棋盘示意图
截屏2022-11-05 19.22.33
  • 需要存储的数据为
0	0	0	0	0	0	0	0	0	
0	1	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, 因此记录了很多没有意义的数据
  • 解决方式:使用稀疏数组

1.2 基本介绍

  • 使用场景:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  • 处理方式
    • 记录数组一共有几行几列,有多少个不同的值。
    • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
  • 存储结构示意图
稀疏数组结构

1.3 应用实例

  • 实现思路分析

步骤一:将二维数组转稀疏数组。

  1. 遍历原始的二维数组,得到有效数据的个数。
  2. 根据得到的有效个数,创建相应的稀疏数组行数。
  3. 将有效的数据存入稀疏数组当中。

步骤二:将稀疏数组数据存盘,文件名为 data.txt。

步骤三:从磁盘中读取 data.txt 文件,获取稀疏数组数据,将其还原为二维数组。

  1. 读取稀疏数组第一行,通过第一行数据得到行和列总数,创建出原始的二维数组。
  2. 读取稀疏数组剩下行的数据,将其赋值到二维数组相应的位置即可。
  • 代码示例
public class SparseArray {

    public static void main(String[] args) {

        // 创建原始数据数组。
        int[][] initArray = new int[9][9];
        initArray[1][1] = 1;
        initArray[2][3] = 2;

        // 输出原始数组。
        System.out.println("------初始化的二维数组:------");
        for (int[] data : initArray) {
            for (int d : data) {
                System.out.printf("%d\t", d);
            }
            System.out.println();
        }

        // ------初始化的二维数组:------
        //0	 0	0	0	0	0	0	0	0
        //0	 1	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


        // 创建稀疏数组。
        int row = initArray.length;
        int col = initArray[0].length;
        int sum = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (initArray[i][j] != 0) {
                  	// 记录有效数据的个数。
                    sum++;
                }
            }
        }

        // 创建存值数值的数组。
        int[][] sparse = new int[sum + 1][3];
        sparse[0][0] = row;
        sparse[0][1] = col;
        sparse[0][2] = sum;

        // 填入非0的值。
        int count = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (initArray[i][j] != 0) {
                    count++;
                    // 所在行数。
                    sparse[count][0] = i;
                    // 所在列数。
                    sparse[count][1] = j;
                    // 具体的数据。
                    sparse[count][2] = initArray[i][j];
                }
            }
        }

        // 遍历稀疏数组。
        System.out.println();
        System.out.println("------稀疏数组:------");
        for (int i = 0; i < sparse.length; i++) {
            // 输出
            System.out.printf("%d\t%d\t%d\t\n",
                    sparse[i][0],
                    sparse[i][1],
                    sparse[i][2]
            );
        }

        // ------稀疏数组:------
        //9	 9	2	(原始二维数组:共计9行 9列 有效数据条数为2)
        //1	 1	1	(其中第2列,第2行,有效数据的值为1。)
        //2	 3	2 (...)


        // 稀疏数组保存到磁盘。
        Path path = Paths.get("src/main/resources/data.txt");
        try (
                ObjectOutputStream oos = new ObjectOutputStream(
                        Files.newOutputStream(path))
        ) {
            oos.writeObject(sparse);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 读取。
        int[][] arrayFromText;
        try (
                ObjectInputStream ois = new ObjectInputStream(
                        Files.newInputStream(path));
        ) {
            arrayFromText = (int[][]) ois.readObject();

        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

        // 还原为初始数组。
        int arrayRow = arrayFromText[0][0];
        int arrayCol = arrayFromText[0][1];
        // 第一行记录原始二维数组的行和列。
        int[][] rowArray = new int[arrayRow][arrayCol];

        // 从第二行开始获取数据存储的坐标。
        for (int i = 1; i < arrayFromText.length; i++) {
            int r = arrayFromText[i][0];
            int c = arrayFromText[i][1];
            int data = arrayFromText[i][2];
            rowArray[r][c] = data;
        }

        // 打印还原后的数组内容
        System.out.println();
        System.out.println("------还原后的原始数组:------");
        for (int[] ints : rowArray) {
            for (int d : ints) {
                System.out.printf("%d\t", d);
            }
            System.out.println();
        }
    }

    // ------还原后的原始数组:------
    //0	 0	0	0	0	0	0	0	0
    //0	 1	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
}

二、结束语


“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

546、Zookeeper详细入门教程系列 -【Zookeeper内部原理】 2022.11.06

目录一、Zookeeper内部原理1.1 节点类型&#xff08;Znode&#xff09;1.2 Stat结构体1.3 监听器原理1.4 选举机制1.5 写数据流程二、最后三、参考链接一、Zookeeper内部原理 1.1 节点类型&#xff08;Znode&#xff09; 持久&#xff1a;客户端和服务器断开后&#xff0c;创…

汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码 + 实验报告)

目录一、实验内容二、实验说明三、实验报告要求四、实验目的五、 程序流程图六、内存变化情况七、实验报告 源程序代码 &#xff08;详细注释&#xff09;一、实验内容 一元二次方程ax2bxc0求解。 二、实验说明 1、要求在数据段中定义a、b、c、x&#xff0c;a、b、c初值不限…

【晶振专题】案例:为什么对着STM32低速32.768K晶振哈口气就不起振了?

本案例发现在一个工装产品上,首批一共做了10几台样机。发现有的样机在开机的时候读取不到RTC,有的样机却可以。读不到RTC是概率性出现的,发生在第一次上电的情况。开始他怀疑是环境问题,会不会和温度有关,于是同事在家做了大量的实验,发现对晶振吹口气就能让晶振不起振,…

01-nacos在Windows系统单机,集群的安装

一 &#xff0c;什么是Nacos?官网 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了一组简单易用的特性集&#xff0c;能够快速实现动态服务发现、服务…

Flutter教程之在 Flutter 中显示 TextField 上的日期选择器(教程含源码)

首先我们必须知道它是什么 Flutter 中的日期选择器——Flutter 日期范围选择器是一个轻量级的小部件,它允许用户轻松选择单个日期、多个日期或一个日期范围。日期选择器提供月、年、十年和世纪视图选项,以快速导航到所需的日期。 让我们实现它… 日期选择器—— 我们将在 …

机场调度管理系统(客户端+服务器端+Java+MySQL)

目 录 1 绪论 1 1.1 项目背景 1 1.2 项目目的 1 1.3 项目可行性分析 2 2 技术介绍 3 2.1 Java技术 3 2.1.1 Java技术简介 3 2.1.2 Java面向对象的特征 3 2.2Javascript和jQuery技术 4 2.1.1 Javascript 简介 4 2.2.2 jQuery-easyui简介 4 2.3Jsp技术 5 2.4 Mysql 5 3 需求分析…

python基础05——字典:dict及集合:set,看这篇文章就够了

目录1字典: dict 无序可变序列1.1 创建1.1.1 用{ }创建字典1.1.2 用dict创建字典1.1.3 用zip创建字典1.1.4 用fromkeys创建字典1.2 查询1.2.1 通过键访问字典的值1.2.1.1 直接取键 dict[ ]1.2.1.2 get()1.2.2 查看字典的键和值1.2.2.1 返回所有的键 dict.keys()1.2.2.2 返回所有…

分布式搜索———黑马旅游

案例功能实现 : ● 酒店搜索和分页 ● 酒店结果过滤 ● 我周边的酒店 ● 酒店竞价排名 资源链接 hoteld-demo工程&#xff1a;https://pan.baidu.com/s/1YlKz6vxcm7VWXAWPlUiBqg 提取码&#xff1a;GY66 进入hoteld-demo工程&#xff0c;启动服务&#xff0c;打开浏览器进入…

uniapp微信小程序半屏跳转小程序

1、资料设置申请绑定 进入微信小程序 设置 -> 第三方设置 -> 半屏小程序管理 添加需要绑定的小程序的appid 等待审核&#xff0c;审核通过后开始写代码 2、代码编写 &#xff08;1&#xff09;、以前的跳转方式是uni.navigateToMiniProgram 换成wx.openEmbeddedMiniP…

Spring核心思想

文章目录1. Spring核心思想1.1 Spring是什么1.2 什么是容器1.3 什么是loC1.3.1 传统开发1.3.2 如何解决传统开发中耦合度高的问题1.3.3 控制反转程序的编写1.4 理解Spring loC1.5 什么是DI1. Spring核心思想 1.1 Spring是什么 我们通常说的Spring是Spring Framework(Spring框…

一个非常实用的分布式 JVM 监控工具

介绍 该项目为了方便开发者更快监控多个远程主机jvm&#xff0c;如果你的项目是Spring boot那么很方便集成&#xff0c;jar包引入即可&#xff0c;不是Spring boot也不用气馁&#xff0c;你可以快速自行初始化一个Spirng boot程序引入jar包即可 效果展示 整体架构 git地址 ht…

Kafka由浅入深(6) Sender线程执行源码解析

一、KafkaProducer消息流程图 1.1 KafkaProducer 消息架构图 1.2 KafkaProducer 消息架构分为两部分 第一部分是KafkaProducer主线程 主要逻辑提供消息拦截器、序列化器、和分区器的默认实现和对外自定义扩展功能&#xff0c;已经将消息追加并缓存到累加器RecordAccumulator…

NeurIPS 2022 | 涨点神器!利用图像辅助三维点云分析的训练新范式

原文链接&#xff1a;https://www.techbeat.net/article-info?id4212 作者&#xff1a;颜旭 点云作为一种基本的三维表征形式&#xff0c;活跃在自动驾驶、机器人感知等多种任务上。尽管三维点云分析在近年来取得了良好的发展&#xff0c;但由于点云其本身往往是无序、无纹理以…

OpenCV笔记--人脸识别算法Eigenfaces和Fisherfaces

目录 1--前言 2--处理ORL数据集 3--Eigenfaces复现过程 4--Fisherfaces复现过程 5--分析 1--前言 ①SYSU模式识别课程作业 ②配置&#xff1a;基于Windows11、OpenCV4.5.5、VSCode、CMake&#xff08;参考OpenCV配置方式&#xff09; ③原理及源码介绍&#xff1a;Face…

云栖探馆!云小宝首秀遇上老司机小龙,猜猜谁赢了?

为啥人人都喜欢秋天呢&#xff1f;因为我们打喷嚏都是“爱秋”啊&#xff5e; 为啥大家会来云栖大会呢&#xff1f;因为云栖大会让我们在一“栖”啊&#xff5e; 2022云栖大会龙蜥峰会&#xff0c;小龙来啦~&#xff01; ​ 去年&#xff0c;小龙作为萌新来到云栖大会&#…

归并排序.

归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用金典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各个答案"修补"在一起,即分而治之) 归并排序的思想示…

为什么程序员会秃头?盘点程序员糟心的几大因素

程序员与脱发似乎存在某种必然的逻辑连接&#xff0c;程序员秃头已经成为大家心中的思维定势。 一提到程序员&#xff0c;难免会想起来java&#xff0c; c&#xff0c; python以及无休止的debug环节&#xff0c;不难想象经常会有程序员跳楼自杀的情况。因为实在是生存不易&…

L5W1作业1 手把手实现循环神经网络

欢迎来到课程5的第一个作业&#xff01;在此作业中&#xff0c;你将使用numpy实现你的第一个循环神经网络。 循环神经网络&#xff08;RNN&#xff09;在解决自然语言处理和其他序列任务上非常有效&#xff0c;因为它们具有“记忆”&#xff0c;可以一次读取一个输入 x⟨t⟩x^…

C语言百日刷题第六天

C语言百日刷题第六天51.鸡兔同笼问题52.输出所有形如aabb的完全平方数53.3n1问题54.输出100~999的所有水仙花数55.韩信点兵56.倒三角形57.求子序列的和58.分数化小数59.开灯问题60.蛇形填数51.鸡兔同笼问题 分析&#xff1a;小学生数学问题。设鸡为a个&#xff0c;兔为b个&…

大数据技术基础实验十:Hive实验——新建Hive表

大数据技术基础实验十&#xff1a;Hive实验——新建Hive表 文章目录大数据技术基础实验十&#xff1a;Hive实验——新建Hive表一、前言二、实验目的三、实验要求四、实验原理五、实验步骤1、启动Hive2、创建表3、显示表4、显示表列5、更改表6、删除表或者列六、最后我想说一、前…