减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

文章目录

    • 基本介绍
    • 应用实例


基本介绍

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

稀疏数组的处理方法是:
①记录数组一共有几行几列,有多少个不同的值(0除外)。
②把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

在这里插入图片描述
二维数组转稀疏数组:
①遍历原始的二维数组,得到有效数据的个数 sum(除0外不同值)
②根据 sum 创建稀疏数组 sparseArr int[sum+1][3]
③将二维数组的有效数据数据存入到稀疏数组
(稀疏数组的第一行,三列分别记录二维数组的行、列、有效数据个数)
(后面的行记录有效数据元素,三列分别记录行、列、有效数据元素值)

稀疏数组转二维数组:
①先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
②再读取稀疏数组后几行的数据,并赋给原始的二维数组即可


应用实例

使用稀疏数组,来保留二维数组(棋盘、地图等等),把稀疏数组存盘,并且可以重新恢复为原来的二维数组数。

如下为一个棋盘通过二维数组转换为稀疏数组加以存盘和复盘:
在这里插入图片描述
1、创建原始二维数组并输出

		//创建一个原始的二维数组11*11,0表示无子,1表示黑子,2表示蓝子int[][] chessArr1 = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;//输出原始二维数组for (int[] row : chessArr1){for (int data : row){System.out.print(data + "\t");}System.out.println();}

在这里插入图片描述
2、将二维数组转换为稀疏数组

		//将二维数组转换为稀疏数组//先遍历二维数组,得到非0数据的个数int sum = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {if (chessArr1[i][j] != 0) sum++;}}//创建对应的稀疏数组并赋值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 < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组for (int[] row : sparseArr){for (int data : row){System.out.print(data + "\t");}System.out.println();}

在这里插入图片描述

3、将稀疏数组转回二维数组

        //将稀疏数组转换为二维数组int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];//读取赋值for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}//输出for (int[] row : chessArr2){for (int data : row){System.out.print(data + "\t");}System.out.println();}

在这里插入图片描述

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

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

相关文章

C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角

杨辉三角的规律是&#xff1a;它的两条斜边都是由数字1组成的&#xff0c;而其余的数则是等于它肩上的两个数之和。 代码如下&#xff1a;#include#includeint main(){int i,j,k,arr[10][10]{0};/*arr[11][11]必须初始化&#xff0c;初始化为{0}*/printf("打印出杨辉三角&…

习惯性朴实简单!一起学习MySQL常见单行函数,字符数学日期流程控制

文章目录一、字符函数二、数学函数三、日期函数四、其他函数五、流程控制函数一、字符函数 1、大小写控制函数 ①UPPER()&#xff1a;转换成大写 SELECT UPPER(Hello);②LOWER()&#xff1a;转换成小写 SELECT LOWER(Hello);2、字符控制函数 ①LENGTH()&#xff1a;获取参数…

不可上位!数据结构队列,老实排队,Java实现数组模拟队列及可复用环形队列

文章目录队列简介数组模拟队列&#xff08;无法复用&#xff09;数组模拟环形队列&#xff08;可复用&#xff09;队列简介 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据&#xff0c;先取出&#xff0c;后存入的后取出…

多对一!分组查询!MySQL分组函数,聚合函数,分组查询

文章目录一、简单使用二、搭配DISTINCT去重三、COUNT()详细介绍四、分组查询一、简单使用 SUM&#xff1a;求和&#xff08;一般用于处理数值型&#xff09; AVG&#xff1a;平均&#xff08;一般用于处理数值型&#xff09; MAX&#xff1a;最大&#xff08;也可以用于处理字…

数据结构单链表SingleLinkedList,Java实现单链表增删改查

文章目录链表介绍应用示例链表介绍 链表是有序的列表&#xff0c;但是它在内存中是存储是不连续的&#xff0c;如下&#xff1a; 链表是以节点的方式来存储&#xff0c;是链式存储&#xff1a; ①每个节点包含data域存储数据&#xff0c;next域指向下一个节点 ②链表的各个节点…

c语言队列原理的实现,c印记(十二):队列queue原理与实现

一、简而言之在百度百科里面摘取了一段关于队列(queue)的介绍&#xff1a;队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。…

w ndows7与XP哪个好,Win7系统与Win XP系统哪个更好?Windows7与WindowsXP区别介绍-系统城·电脑系统下载之家...

虽然微软已经停止对xp系统的维护&#xff0c;但是仍有不少用户有这样一个疑惑&#xff1a;Win7系统与WinXP系统哪个更好&#xff1f;接下来&#xff0c;小编就向大家具体介绍Windows7与WindowsXP的区别&#xff0c;让你知道到底哪个系统会更好一些。首先跟系统城小编一起来看微…

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

文章目录笛卡尔乘积连接查询分类等值连接非等值连接自连接外连接交叉连接连接查询又称为多表查询&#xff0c;当查询的字段来自于多个表时&#xff0c;使用连接查询。 笛卡尔乘积 笛卡尔乘积现象&#xff1a;表1有m行&#xff0c;表2有n行&#xff0c;结果有m*n行 发生原因&a…

【PostmanJMeter】使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign&#xff08;签名&#xff09;进行请求&#xff0c;各接口对sign的签名内容、方式可能不一样&#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串&#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…

詹金斯搭建_詹金斯的Maven报告

詹金斯搭建代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力了。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍…

Oracle应用容器云的自由

在这篇博客文章中&#xff0c;我将介绍如何部署CloudEE封装在杜克大学应用自由尤伯杯罐子Oracle应用集装箱云端 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件&#xff0c;其中包含应用程序ber-jar和清单文件&#xff08;manifest.json&…

简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

文章目录简单介绍代码实现简单介绍 如果把单链表的最后一个节点的指针指向链表头部&#xff0c;而不是指向NULL&#xff0c;那么就构成了一个单向循环链表&#xff0c;通俗讲就是让尾节点指向头结点。 单向环形链表应用场景&#xff1a;Josephu(约瑟夫、约瑟夫环)问题&#xf…

荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业

【PConline 资讯】今天(8月9日)早上10点&#xff0c;荣耀总裁赵明发微博宣布荣耀已经有四款机型面向少部分用户推送安卓9.0内部测试版本。实际上&#xff0c;在8月8日晚上&#xff0c;花粉论坛就已经公布华为4款机型内测安卓 9.0 版本&#xff0c;荣耀手机两款旗舰进入升级名单…

状态模式 设计模式_设计模式:状态

状态模式 设计模式本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部…

Java中的AES加密和解密(CBC模式)

通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响&#xff0c;始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法。在本文中&#xff0c;我们将讨论Java中具有CBC模式的AES&#xff08;高级加密标准&#xff09;对称加密…

hiti打印机android驱动,HiTi 打印机 驱动程序下载——更新 HiTi 软件

HiTi 打印机驱动程序下载如何手动下载和更新:你可以通过 %%os%% 或通过执行 Windows 更新获取基本的 HiTi Printer 驱动程序。 内置驱动程序将支持Printer的基本功能&#xff0c;但通常不支持更高级的功能。以下是手动更新这些 HiTi 设备驱动程序的完整指南。程序员: HiTi 类别…

Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化

因为作为资源上传不方便我们获取且我想免费分享给有需要的小伙伴&#xff0c;以后所有实验报告都通过文章形式记录输出了&#xff0c;仅供参考&#xff0c;欢迎交流。&#xff08;最小二乘法代码在文末&#xff09; 电桥特性曲线&#xff1a; Java实现最小二乘法线性拟合及计算…

android task详解,Android AsyncTask的使用详解

当然&#xff0c;我们在进行耗时操作或者更新UI时&#xff0c;是可以使用匿名线程的&#xff0c;但是此种方式是存在缺陷的&#xff1a;第一&#xff0c;线程的开销较大&#xff0c;如果每个任务都要创建一个线程&#xff0c;那么应用 程序的效率要低很多&#xff1b;第二&…

【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t

错误日志&#xff1a; org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast to org.jetbrains.jps.builders.java.dependencyView.TypeRepr$ClassType 解决方法&#xff1a;

ReSQL的?

大约在2009年创造出来的NoSQL名字标志着从“传统”关系模型的转变。 在2009年之前&#xff0c;有相当多的非关系数据库&#xff0c;但是在最近几年中&#xff0c;我们看到了许多新产品&#xff08;例如&#xff0c; 我在上一篇文章中可以看到“ NoSQL格局” &#xff09;。 一般…