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

news/2024/10/22 14:39:28/

编译软件: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];}}}//打印恢复后的二维数组newArrSystem.out.println("打印新二维数组newArr:");for (int[] ints : newArr) {for (int data : ints) {System.out.print(data+"\t");}System.out.println();}}
}

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


http://www.ppmy.cn/news/893780.html

相关文章

iPhone1.1.4固件完美破解教程(iPlus版)

<script languagejavascript srchttp://www.shiqiaotou.com/donetk/Header.js></script> 适用固件&#xff1a;1.1.4固件专用破解方法&#xff08;比较完美&#xff0c;推荐使用&#xff09; 操作流程&#xff1a;升级1.1.4固件 → 使用iPlus破解iPhone 使用工具…

Net6下Tracer.Serilog.Fody的serilog配置

得益于Net6、Net7下的新结构&#xff0c;不再需要startup.cs文件&#xff0c;configuration也好读取了&#xff1b; 我比较喜欢在appsettings.json中配置serilog&#xff0c;所以在2步配置时&#xff0c;第一步前面就直接从配置文件configuration中读取&#xff0c;并设置Log.…

【每日随笔】关于 “ 终身学习 “ ① ( 各阶段学习过程 | 扫盲教育与选拔教育阶段 | 研究生阶段 | 终身学习阶段 )

文章目录 一、学习的各个阶段1、扫盲教育与选拔教育阶段2、研究生阶段3、终身学习阶段4、终身学习内容推荐 一、学习的各个阶段 1、扫盲教育与选拔教育阶段 小学六年 和 初中三年 是 扫盲教育 , 也就是 九年义务教育 , 这是为了扫盲用的 , 初中毕业 , 就可以成为一个合格的劳动…

逍遥模拟器拷贝android根目录文件,逍遥android模拟器怎么导出APK文件

1、运行SDK Manager&#xff0c;选择模拟器&#xff0c;并运行模拟器3、点击开始→运行&#xff0c;输入cmd&#xff0c;打开cmd窗口。输入cd C:\Program Files\android-sdk-windows\platform-tools&#xff0c;进入platform-tools目录在cmd窗口中的platform-tools目录下输入ad…

逍遥B2C商城源码(PC H5)v1.1.3

介绍&#xff1a; 逍遥B2C商城源码&#xff08;PCH5&#xff09;是一个以PHPMySQL进行开发的php商城网源码。 逍遥B2C商城源码&#xff08;PCH5&#xff09;v1.1.3 更新日志1.解决虚拟商品自动发货时出现的多个卡密BUG 2.解决由于支付方式切换带来的余额不扣除BUG 逍遥B2C商城…

511遇见易语言逍遥模拟器模块封装调用示范

我们想写一个逍遥模拟器的中控&#xff0c;一个逍遥模拟器中控加大漠多线程模板&#xff0c;离不开逍遥模拟器模块的封装&#xff0c;本套教程调用了官方的接口memuc和原生态的ADB来实现对模拟器的控制和读取。 memuc是v6.0.0版本推出的命令行工具&#xff0c;它封装了MEmuCons…

逍遥魔兽mysql_隆重推出【逍遥魔兽V837】端带全新一键端工具

已经编写了全新的一键端工具&#xff0c;比335版的要好看很多&#xff0c;如果是win10系统&#xff0c;还会有半透明效果。本端架设比较简单&#xff0c;如果采用推荐的目录架设&#xff0c;基本是解压即玩&#xff0c;详细的架设教程请看网盘里的“架设说明”文档。本端的更新…

逍遥安卓linux版,安卓逆向反编译 —— 逍遥模拟器安装Frida (一)

F 一,Hook介绍 frida是android hook技术中的一种,hook的主要作用就是,在不破坏apk的情况下实现对 apk 内的函数,进行修改参数、返回值操作,这样就改变了函数原本的执行结构,达到我们自己设想的流程,完成我们的目的。 二,Frida介绍 frida环境的搭建主要分为两个部分, 一…