Java数组07:稀疏数组

news/2024/9/18 3:55:36/文章来源:https://www.cnblogs.com/Konon/p/18357850

1. 线性结构

  • 线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。
  • 线性结构有两种不同存储结构,即顺序存储结构和链式存储结构。
  • 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,即在内存中是连续的,例如数组。
  • 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息,但好处是可以充分利用碎片地址。
  • 线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解。

2. 非线性结构

非线性结构不是一对一的关系, 非线性结构包括:二维数组,多维数组,广义表,树结构,图结构


3. 稀疏数组

先看一个需求,在编写五子棋程序时,有存盘退出和续上盘的功能。
image

因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据,因此,在这里,我们需要引入一个新的概念——稀疏数组

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

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

image

即第一行第一列记录记录原始数组行数,第一行第二列记录原始数组列数,第一行第三列总共有多少个值,第二行记录第一个有效数据,第三行记录第二个有效数据

代码实现

public class SparseArr {public static void main(String[] args) {//创建一个二维数组 11*11//0表示没有棋子,1表示黑棋,2表示蓝棋int[][] chessArr = new int[11][11];chessArr[1][2] = 1;chessArr[2][3] = 2;//输出原始的二维数组System.out.println("原始的二维数组:");for (int i = 0; i < chessArr.length; i++) {for (int j = 0; j < chessArr[i].length; j++) {System.out.print(chessArr[i][j]+"\t");}System.out.println();}//将二维数组转换为稀疏数组//1.先遍历二维数组得到非零数据的个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr[i][j] != 0){sum++;}}}//2.创建对应的系数数组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 < chessArr.length; i++) {for (int j = 0; j < chessArr[i].length; j++) {if (chessArr[i][j] != 0){count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr[i][j];}}}//输出稀疏数组System.out.println();System.out.println("稀疏数组:");for (int i = 0; i < sparseArr.length; i++) {System.out.println(sparseArr[i][0]+"\t"+sparseArr[i][1]+"\t"+sparseArr[i][2]);}//将稀疏数组恢复成二维数组//1.先读取稀疏数组的第一行,根据第一行创建二维数组int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];//2.读取稀疏数组后几行赋值给二维数组//注意这里是从第二行开始for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}System.out.println();System.out.println("恢复后的二维数组:");for (int[] row : chessArr2) {for (int data : row) {System.out.print(data+"\t");}System.out.println();}}
}

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

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

相关文章

【Django开发】django美多商城项目完整开发4.0第2篇:项目准备【附代码文档】

本教程的知识点为:美多商城 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片验证码 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送短信 判断帐号是否存在 1. 判断用户名是否存在 后端…

IntelliJ IDEA 单元测试插件 TestMe

IntelliJ IDEA 添加单元测试插件 TestMe

Redis 使用场景

Redis 使用场景前三种使用广泛,另加队列用

Datawhale X 魔搭 AI夏令营 AIGC方向 Task2

代码逐行解析 先记录一下baseline代码通义千问生成的逐行解析: # 安装 Data-Juicer 和 DiffSynth-Studio !pip install simple-aesthetics-predictor # 安装simple-aesthetics-predictor !pip install -v -e data-juicer # 安装data-juicer !pip uninstall pytorch-lightning …

[Paper Reading] Multiple View Geometry Transformers for 3D Human Pose Estimation

Multiple View Geometry Transformers for 3D Human Pose Estimation link 时间:CVPR2024 机构:University of Toronto && Southeast University && Microsoft Research Asia TL;DR 提出一种基于Transformer端到端3D Human Pose Estimation方法MVGFormer,核…

MySQL8.0 Clone Plugin 实现解析浅析

MySQL8.0 Clone Plugin 实现解析浅析 从8.0.17版本开始官方实现了clone的功能,允许用户通过简单的SQL命令把远端/本地的数据库实例拷贝到其他实例后快速拉起一个新的实例。 该功能由一些列的WL组成 :Clone local replica(WL#9209) : 实现了数据本地Clone。 Clone remote repli…

USB协议详解第8讲(USB描述符-字符串和语言ID描述符)

1.字符串描述符相关概念 字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字,还有就是由我们用户自己定义的字符串,说白了就是起名…

【Azure Developer】使用Python SDK去Azure Container Instance服务的Execute命令的疑问解释

Azure 容器实例(Azure Container Instances,简称 ACI)是一个无服务器容器解决方案,允许用户在 Azure 云环境中运行 Docker 容器,而无需设置虚拟机、集群或编排器。ACI 适用于任何可以在隔离容器中操作的场景,包括事件驱动的应用程序、从容器开发管道快速部署、数据处理和…

DCDC电路设计之FB引脚布线

该随笔从与非网上搬运,原文: 案例讲解,DCDC电源反馈路径的布线规则 下面为正文内容: 在本文中,将对用来将输出信号反馈给电源ic的FB引脚的布线进行说明。 反馈路径的布线 反馈信号的布线在信号布线过程中也需要特别注意。反馈信号如Figure 7-a左侧的电路图所示,输出电压经…

vue使用JavaScript运算符

第一:加法运算符{{变量+n}}<p>num参与运算{{num+12}}</p>let vm = new Vue({el : "#app",data : {num: 101,isOK: true,message: 你好,lan: Java,id: 1001,}})第二:三目运算符<!-- 三目运算符 --><p>三目运算符:{{isOK==2 ? 真: 假}}<…

Golang - goto语句

用途 可以无条件地转移到过程中指定的行。该语句通常与条件语句配合使用,可用来实现条件转移,构成循环,跳出循环体等功能,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。 语法goto label; ... label: statement;注…

Day 42 动态规划 Part09

188. 买卖股票的最佳时机 IV 做完上一道题后再看就简单许多了。股票问题的重点就在于两点:找到所有的状态 状态如何转移对于本题,一共包含2*k种状态(第1,2...k次持有,第1,2...k次卖出)。状态间如何转移呢?见下图class Solution {public int maxProfit(int k, int[] pri…