减小程序规模!稀疏数组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,一经查实,立即删除!

相关文章

ug弹簧可变性装配_弹簧可配置魔术

ug弹簧可变性装配Spring框架具有几个提供一系列服务的模块&#xff0c;其中许多模块仅可用于托管对象&#xff08;Spring Bean&#xff09;。有关这些服务的一些示例是依赖注入&#xff0c;事务管理&#xff0c;AOP服务等。当我们使用时&#xff0c;一切都很好对象即服务&#…

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

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

朴实!简单!依你所好,MySQL排序查询ORDER BY

1、基本语法 SELECT查询列表 FROM表 #可选&#xff08;WHERE ...&#xff09; ORDER BY排序列表 DESC/ASC;升序是ASC或者不写&#xff0c;降序是DESC 2、案例一&#xff1a;按字段&#xff08;*代表全部&#xff09; SELECT* FROMemployees ORDER BYsalary DESC;3、案例二&am…

使用一个命令执行单个Java源文件

JDK增强提案 &#xff08; JEP &#xff09; 草案于2017年末创建&#xff0c;名为“ 启动单文件源代码程序 ”&#xff08;其相关的JDK问题为JDK-8192920 &#xff09;。 顾名思义&#xff0c;该JEP草案旨在“增强Java启动器以支持运行作为Java源代码的单个文件提供的程序。” …

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

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

c语言程序设计陈雪芳,东莞理工学院C语言课程设计.doc

東莞理工學院C语言程序设计课程设计报告书院系名称 机械工程学院专业班级 2013级机械设计制造及其自动化1班组长成员指导教师 陈雪芳完成时间 2014年6月1日目 录1、系统功能及任务描述………………………..1.1系统总体功能描述………………………….1.2主要任务描述…………………

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

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

c语言循环与数组训练题,C语言循环数组练习题解读.doc

循环数组练习题一&#xff0e;选择题1&#xff0e;for(i0;i<10;i); 结束后&#xff0c; i 的值是&#xff1b; BA9B10C11D122&#xff0e;下面程序的循环次数是&#xff1a;Dint k0;while(k<10){if(k<1)continue;if(k5)break;k;}A.5B6C4D 死循环&#xff0c;不能确定循…

Java更快地对基元数组进行排序?

看起来Java的原语排序数组在不久的将来可能会提高性能。 弗拉基米尔雅罗斯拉夫斯基&#xff08;Vladimir Yaroslavskiy&#xff09;已在core-libs-dev邮件列表中发布了一条消息 &#xff0c;标题为“ Dual-Pivot Quicksort的新优化版本 ”&#xff0c;其中Yaroslavskiy撰写了“…

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

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

华工网络教育C语言校考答案,计算机应用基础(统考)随堂练习2017秋华工答案.docx...

计算机应用基础(统考)随堂练习第一章计算机基础知识计算机能直接识别并执行的语言是 ______。A. 汇编语言B.自然语言C.机器语言D.高级语言答题&#xff1a;A. B. C. D.参考答案&#xff1a; C计算机存储容量的基本单位是 _____。A. 赫兹B.字节( Byte)C.位 (bit)D. 波特答题&…

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

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

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

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

通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

文章目录节点类链表类&#xff08;主要&#xff09;测试类小结节点类 可以根据需要&#xff0c;对节点属性进行修改。注意重写toString()方法&#xff0c;以便后续的输出操作。 //节点类 class Node {public int id;public String name;public Node next;public Node(int id,…

Java 10 – JEP 286:局部变量类型推断

Java 10即将发布&#xff0c;RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中&#xff0c;开发人员社区中最有趣且最受关注的是286&#xff1a;Local-Variable Type Inference 。 什么是局部变量类型推断&#xff1f; 我们在Java 8中看到…

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…

android 自定义表单,Android实现Ant Design 自定义表单组件

Ant Design 组件提供了Input&#xff0c;InputNumber&#xff0c;Radio&#xff0c;Select&#xff0c;uplod等表单组件&#xff0c;但实际开发中这是不能满足需求&#xff0c;同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽)&#xff0c;这时需要自己动…

逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

文章目录节点类链表类测试类双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。 节点类…

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

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