Java数据结构与算法:稀疏数组(SparseArray)

news2024/11/23 15:46:16

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版


文章目录

  • 一、稀疏数组是什么?
    • 1.1 基本介绍
    • 1.2 稀疏数组的处理方法
    • 1.3 举例说明
  • 二、为什么要使用稀疏数组?
    • 2.1 先看这一个具体的应用需求
      • 问题
      • 解决方案
    • 2.2 使用稀疏数组的优缺点
      • 优点
      • 缺点
  • 三、如何使用稀疏数组?
    • 3.1 应用实例
    • 3.2 应用代码如下


在这里插入图片描述


一、稀疏数组是什么?

1.1 基本介绍

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保 存该数组。

1.2 稀疏数组的处理方法

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规 模

1.3 举例说明

在这里插入图片描述


二、为什么要使用稀疏数组?

2.1 先看这一个具体的应用需求

问题

在编写的五子棋程序中,有存盘退出和续上盘的功能,如下图所示

在这里插入图片描述

在上述11X11的五子棋盘中,如果需要执行存盘退出和续上盘的功能时,则需要将当前对战的棋盘状态信息下载到本地或将上次存放的棋盘对战状态信息上传到程序中。那么此时就需要一种数据结构用来存储对战的棋盘状态信息。

通常的做法是使用原生的二维数组记录棋盘的状态信息,但是这样会暴露出一个问题:二维数组的很多值如果不赋值,那么会被程序主动赋默认值,比如int类数组会被赋值为0,因此二维数组中会记录了很多没有意义的数据,造成内存空间的极大浪费。

解决方案

这时我们便可考虑使用稀疏数组,对原生的二维数组中所有数据做一个“压缩”,进而提高原来二维数组的空间利用率

2.2 使用稀疏数组的优缺点

优点

  • 提高空间利用率稀疏数组只存储非默认值的元素信息,可极大减少存储空间的占用
  • 方便进行压缩和解压缩稀疏数组可以方便地进行压缩和解压缩操作,对于大型稀疏矩阵的存储和传输非常有用
  • 提高运算效率稀疏数组在进行运算时,可只对非默认值元素进行处理,避免对所有元素进行无效操作,从而提高运算效率。

缺点

  • 降低数组的访问速度由于稀疏数组中非默认值元素的位置信息需要额外存储,访问这些元素的速度相对较慢,特别是在大规模稀疏矩阵中。
  • 需要进行额外的处理使用稀疏数组需要额外处理元素的位置信息,这会增加代码的复杂性和维护成本。

综上所述,稀疏数组适用于大部分元素都为默认值或重复值的情况,可显著减少存储空间的占用;但同时也需要特别注意其访问速度和代码复杂性等问题。


三、如何使用稀疏数组?

3.1 应用实例

  1. 使用稀疏数组,来保留类似前面的二维数阻(棋盘、地图等等)

  2. 把稀疏数组存盘,并且可以从新恢复原来的二维数组数据

  3. 整体思路分析

    在这里插入图片描述
    ①二维数组转稀疏数组的思路

    1.遍历原始的二维数组,得到有效数据的个数sum

    2.根据sum就可以创建稀疏数组sparseArr int[sum+1)][3]

    3.将二维数组的有效数据数据存入到稀疏数组

    ②稀疏数组转原始的二维数组的思路

    1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]

    2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.

3.2 应用代码如下

//稀疏键盘
public class t2 {

    public static void main(String[] args) {
        //定义原始棋盘的落子情况【二维数组】
        int[][] arr=new int[11][11];
        //1 -> 黑子,2 -> 篮子,0 -> 无子
        arr[1][2]=1;
        arr[2][3]=2;
        arr[5][2]=3;
        int sum=0;
        System.out.println("二维数组:" );
        for (int[] ints : arr) {
            for (int data : ints) {
                if (data!=0){
                    sum++;
                }
                System.out.print(data+"\t");
            }
            System.out.println();
        }

        //二维数组转为稀疏数组
        int[][] sparseArr=new int[sum+1][3];
        sparseArr[0][0]=11;
        sparseArr[0][1]=11;
        sparseArr[0][2]=sum;
        int count=0;
        for (int i = 0; i < arr.length ; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j]!=0){
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=arr[i][j];
                }
            }
        }

        System.out.println("稀疏数组:");
        for (int[] ints : sparseArr) {
            for (int data : ints) {
                System.out.print(data+"\t");
            }
            System.out.println();
        }

        //将稀疏数组恢复为二维数组newArr
        //1。先读取稀硫数组的第一行,根据第一行的数据,创建原始的二维数组
        int[][] newArr=new int[sparseArr[0][0]][sparseArr[0][1]];
		
		//2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
        for (int i = 1; i < sparseArr.length ; i++) {
            for (int j = 0; j < sparseArr[i].length ; j++) {
                if (j>1){
                    int row=sparseArr[i][j-2];
                    int col=sparseArr[i][j-1];
                    newArr[row][col]=sparseArr[i][j];
                }
            }
        }

        //打印恢复后的二维数组newArr
        System.out.println("打印新二维数组newArr:");
        for (int[] ints : newArr) {
            for (int data : ints) {
                System.out.print(data+"\t");
            }
            System.out.println();
        }

    }
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SpringBoot学习——项目用maven打包成jar包 windows + Linux平台运行 Linux安装java 遇到的问题

目录 引出认识maven以及packageMaven 构建生命周期package&#xff1a;打包&#xff0c;打包成jar包和使用&#xff08;1&#xff09;引入maven插件&#xff08;2&#xff09;打包jar包 windows平台运行jar包1.windows下安装java环境2.直接运行一个jar包 Linux平台运行jar包1.L…

RocketMQ 为何性能高

本文主要从性能角度考虑 RocketMQ 的实现。 整体架构 这是网络上流行的 RocketMQ 的集群部署图。 RocketMQ 主要由 Broker、NameServer、Producer 和 Consumer 组成的一个集群。 **NameServer&#xff1a;整个集群的注册中心和配置中心&#xff0c;管理集群的元数据。包括 T…

将本地MySql数据库导入到linux服务器上

首先 你的linux服务器上需要有MySql 如果您还没有安装 可以参考我的文章 在阿里云linux上安装MySql数据库 然后 我们在本地打开MySql的管理工具 我这里使用的 Navicat for MySQL 右击需要导入的数据库 如下图操作 选择一个目录存放文件 然后点击开始 走完一次之后点击关闭 查…

【多线程系列-01】深入理解进程、线程和CPU之间的关系

深入理解进程线程的关系 一&#xff0c;深入理解进程、线程与CPU之间的关系1&#xff0c;进程与线程1.1&#xff0c;进程与线程的关系1.2&#xff0c;在java中进程与线程的关系 2&#xff0c;进程间的通信方式2.1&#xff0c;管道2.2&#xff0c;信号2.3&#xff0c;消息队列2.…

taro-ui-vue3 的虚拟列表组件VirtualScroll

项目&#xff1a;taro3vue3 用法&#xff1a; <at-virtual-scrollbench"5":height"listHeight":items"fieldList":item-height"itemHeight" ><template #default"{ index, item }"><view :id"merchan…

【力扣算法12】之 11. 盛最多水的容器 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果完结 问题描述 给定一个长度为 n 的整数数组 height 。有n条垂线&#xff0c;第i条线的两个端点是(i, 0)和(i, height[i])。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构…

SQL 优化换汤不换药的时代变了与SQL审核

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Kubernetes轻量级日志工具Loki安装及踩坑记录

Loki简介 Loki是Grafana出品的一个轻量级日志系统&#xff0c;熟悉ELK的都知道ELK使用起来的成本&#xff0c;而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。 Promtail 用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具&#xff0c…

谷歌Bard更新中文支持;GPT-4:1.8万亿参数、混合专家模型揭秘; Meta推出商用版本AI模型

&#x1f989; AI新闻 &#x1f680; 谷歌的AI聊天工具Bard更新&#xff0c;增加中文支持 摘要&#xff1a;谷歌的AI聊天工具Bard新增中文环境&#xff0c;用户可以使用简体和繁体中文进行交流。然而&#xff0c;与竞品相比&#xff0c;Bard的回复略显生硬&#xff0c;语义理…

C# Winfrom将DataGridView数据导入Excel

1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 //定义Excel操作对象Microsoft.Office.Interop.Excel.Application excelApp new Microsoft.Office.Interop.Excel.Application();//定义Excel工作表Microsoft.Office.Interop.Excel.Worksheet worksheet excelApp.Wo…

【专题速递】在线K歌、云化XR、咔嚓剪辑和FFmpeg直播能力更新计划

// 在线K歌的技术方案选型有哪些&#xff1f;对于沉浸式XR我们又有什么新的思考&#xff1f;高性能低依赖的剪辑视频需要具备什么技术&#xff1f;7月29日LiveVideoStackCon2023上海站客户端体验与性能优化专场&#xff0c;为您解答。 客户端体验与性能优化 客户端作为直接面…

用Python画一个星空

1 问题 如何用Python画一个简单的星空&#xff1f; 2 方法 在Python中有着各种各样的工具包&#xff0c;比如math、pillow、requests等等&#xff0c;每个包有着自己专门的功能。要用python画星空&#xff0c;在绘制星空的过程中一般需要运用到turtle工具&#xff0c;它是属于P…

PVE虚拟化平台之安装RHEL9系统

PVE虚拟化平台之安装RHEL9系统 一、RHEL9介绍1.1 RHEL9简介1.2 RHEL9新功能 二、上传镜像到PVE存储2.1 检查PVE环境2.2 上传镜像 三、创建虚拟机3.1 设置虚拟机名称3.2 操作系统设置3.3 系统设置3.4 磁盘设置3.5 CPU设置3.6 内存设置3.7 网络设置3.8 确定虚拟机配置 四、安装操…

【刷题】在二叉树中分配硬币

在二叉树中分配硬币 https://leetcode.cn/problems/distribute-coins-in-binary-tree/description/ 描述 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应有 node.val 枚硬币&#xff0c;并且总共有 N 枚硬币。 在一次移动中&#xff0c;我们…

PLSQL Developer怎样查看当前活动会话

点‘工具’-‘会话’&#xff1a; 选择‘Active sessions’: 点击某个会话&#xff0c;可以看到其对应的sql&#xff1a;

Feign技术

说明&#xff1a;Feign和RestTemplate一样&#xff0c;是用于微服务之间通信的&#xff0c;配合注册中心技术Nacos&#xff0c;可以搭建一个完整的SpringCloud环境。本文介绍在NacosFeign环境下&#xff0c;Feign的使用。 环境介绍&#xff1a;创建两个服务&#xff0c;订单服…

Web3的2048,Sui 8192能否打开全链游戏的大门?

作者&#xff1a;Peng SUN&#xff0c;Foresight News Sui 8192&#xff1a;一局游戏就是一个NFT Sui 8192智能合约基于Move语言编写&#xff0c;构成非常简单&#xff0c;包括游戏、Game Board与排行榜&#xff08;Leaderboard&#xff09;三部分&#xff0c;覆盖方块移动、…

Linux基本知识/Linux文件夹创建、删除、复制等命令怎么用/grep管道符是啥

前情提要&#xff1a;经过一段时间的沉淀&#xff0c;因为要用到Linux&#xff0c;索性就梳理总结一下Linux的基本知识&#xff01; 一、Linux文件目录 1.1 结构 是一个树形结构&#xff0c;只有一个根目录/ 1.2 路径描述 linux系统中&#xff0c;路径层次关系用/来表示w…

IDEA安装JRebel插件激活LS client not configued问题

JRebel插件安装步骤&#xff1a;settings->Plugins中搜索JRebel&#xff0c;然后安装即可 这里安装的是最新版本&#xff0c;安装完后会要求重启IDEA&#xff0c;重启后一般会自动弹出JRebel面板&#xff0c;里面有个Activation&#xff0c;点击后弹出激活页面&#xff0c;我…

java 通过Json -schema完成对数据的效验

Json -schema 1.对象的效验2.数组套对象的效验3. 字符串的效验长度效验(minLength)(maxLength)正则效验日期和时间 4.对象套对象效验5.对象套数组6. 其他参数required(必须要填&#xff09;enum(范围之内&#xff09;not&#xff08;不&#xff09;anyOf 和allOf&#xff08;双…