稀疏数组(详)

什么是稀疏数组? 稀疏数组是指包含空位或未定义元素的数组,这些空位并不占用内存空间。可以通过Array构造函数或delete操作符来创建稀疏数组。JavaScript 的迭代方法(如forEachmapfilter等)会跳过空位,处理时需要特别注意。稀疏数组在length属性、内存使用和性能上有一些特殊表现,处理时需要小心。 阅读详情

基本介绍

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

稀疏数组的处理方法:

1)记录数组一共有几行几列,有多少个不同的值

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

这个小规模数组就是稀疏数组

特点:行不确定 列是三列 

应用场景

五子棋盘的存盘退出和续上盘功能

分析:因为该二维数组很多值是默认值0,因此记录了很多没有意义的数据。

解决:稀疏数组

二维数组 => 稀疏数组思路:

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

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

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

稀疏数组 =>  二维数组的思路:  

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

2.再循环读取稀疏数组的后继行数据,并赋值给原始的二维数组

代码实现

 

public class HelloWorld {
    public static void main(String []args) {
       
		// 创建一个原始的二维数组 11 * 11
		// 0:没有棋子 1:黑棋 2:白棋
		int chessArr1[][] = new int[11][11];
		chessArr1[1][2] = 1;
		chessArr1[2][3] = 2;
		System.out.println("输出原始二维数组");
		for(int[] row : chessArr1){
			for(int data: row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		// 二维数组 => 稀疏数组
		// 先遍历拿到所有非0的有效数据的总数
		int sum = 0;
		for(int[] row : chessArr1){
			for(int data : row){
				if(data!=0){
					sum++;
				}
			}
		}
		System.out.println("sum="+sum);
		// 声明稀疏数组
		// sum+1 = 有效数据总数 + 第一行的描述 
		System.out.println("输出稀疏数组");
		int sparseArr[][] = new int[sum+1][3];
		// 一共有个多少行
		sparseArr[0][0] = chessArr1.length;
		System.out.println("共有"+chessArr1.length+"行");
		// 一行有三列
		sparseArr[0][1] = chessArr1[0].length;
		System.out.println("共有"+chessArr1[0].length+"列");
		// 一共有几个非0值
		sparseArr[0][2] = sum;
		System.out.println("有效数据共有"+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+1;
					sparseArr[count][1] = j+1;
					sparseArr[count][2] = chessArr1[i][j];
				}
			}
		}
		System.out.println("稀疏数组为:");
		for(int i = 0; i < sparseArr.length; i++){
			System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
		}
		
		// 接下来再将稀疏数组转回原始二维数组
		int chessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
		for(int i=1;i<sparseArr.length;i++){
			// 第几行:sparseArr[i][0]-1  第几列:sparseArr[i][1]-1 对应的值:sparseArr[i][2]
			chessArr[sparseArr[i][0]-1][sparseArr[i][1]-1] = sparseArr[i][2];
		}
		System.out.println("二维数组为:");
		for(int[] row : chessArr){
			for(int data: row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
    }
}

控制台输出:

 到此,大功告成

其实还少一步往文件里面存储和读取,最好能把这一步给完善了。

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南 在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通 阅读详情

相关推荐

达梦数据库连接报错6001网络通信异常

本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。

chen_zizi2025的博客 2771

什么是稀疏数组?稀疏数组详解

【1】背景 如下图所示,这里有一个 15 ×15 的棋盘,如果现在要让你通过编码的方式,让你将这盘棋局保存起来,你会怎么做呢? 面对行列数据的保存,我相信大多人第一时间都会想到用二维数组进行保存。 【2】普通数组保存棋盘数据 比如,我们可以将棋盘进行抽象化,用一个 15 × 15 的二维数组来表示,然后用 0 表示空点,用 1 表示白子,用 2 表示黑子,于是就可以抽象为如下模样。 于是,我们可以通过如下代码,将数据保存到二维数组中。 /** * 将棋盘数据保存为二维数组 */ .

小白一个 9481

Kinect V1结构光激光散斑原理及样式

   对 intel realsense F200 和 Kinect V1的coding pattern原理进行调研,知二者都使用light coding的方式,该方法与传统的coded structure light不同:传统编码结构光(空间编码,时间编码)最终使用的是三角测量的原理计算深度信息;light coding通过投射具有高度伪随机性的激光散斑,会随着不同距离变换不同

松间明月 1万+

稀疏数组详解

稀疏数组 一、什么是稀疏数组? 1、系数矩阵的官方定义 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。 2、稀疏数组 当一个数组中大部分元素为0,或者为同一值(也就是说可以不是0)的数组时,可以使用系数数组来保存该数组。 2.1、大部分怎么去理解 通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵

m0_52209438的博客 1724

从零构建:openEuler WSL下的ARM交叉编译工具链自动化部署方案

本文详细介绍了在openEuler WSL环境下使用Ansible自动化部署ARM交叉编译工具链的方案。通过编写Ansible角色和Playbook,实现从基础环境配置到工具链安装、环境变量设置的一键部署,大幅提升嵌入式开发效率。方案支持多种ARM架构,并扩展了QEMU仿真、VS Code远程开发等实用功能,是嵌入式开发者的高效解决方案。

h3i4j的博客 382

【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)

随着智能电动汽车行业的发展,汽车=智能终端+四个轮子,而人工智能也发展越来越快,Python语言使用越来越广,本章节主要介绍如何使用Python语言基于Pytest自动化框架来实现DoIP诊断自动化测试。首先回顾一下DoIP诊断基础知识:DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。

测试领域技术分享 3795

稀疏数组 - SparseArray

一、稀疏数组的概念 当一个数组中大部分元素是0,或为同一个值的时候,可以使用稀疏数组来保存数组。 它是一个十分有效的存储结构,便于节省存储空间。 它的处理方式是: 1、记录数组一共有几行几列,有多少不同的值; 2、把具有不同值的元素的行、列及值记录在一个小规模二维数组中(稀疏数组),从而缩存储数据的规模。 ...

kayyoo的博客 1441

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

【计算机视觉 | MMDetection】关于mmdetection如何计算参数量、计算量和速度FPS

wzk4869的博客 3022

数据结构 - 稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。记录数组一共有几行几列,有多少个不同的值。把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

mry6的博客 1853

matlab 基于离散余弦变换DCT的最小二乘相位解缠

最小范数法是寻求在解包裹相位的局部微分与包裹相位微分相一致的条件下, 逼近于真实相位分布的解包裹相位分布。目标是使解包裹相位与包裹相位曲面的差最小

点云侠的博客 285

Bootstrap方法详解——技术与实例

一、Introduction 如果说到Bootstrap你会想到什么?是Twitter推出的那个用于前端开发的开源工具包吗?Unfortunately,本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想...

白马负金羁 8万+

数据结构:稀疏数组详讲【Java】

先看一下场景:• 游戏开发:如存储大型游戏地图,如五子棋棋盘的状态,只需记录已落子位置;• 图像处理:在图像矩阵中,大量像素可能为黑色(值为0)或其他单一颜色;• 数据压缩:在科学计算、信号处理等领域,遇到大量接近零的浮点数矩阵时。我们发现在使用数组记录数据的时候,会出现零的数据居多,非零数据较少的情况。进而导致直接存储整个数组会导致大量的空间浪费。由此我们稀疏数组就可以解决这类问题。

不知名的fE 737

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

YOLOv5入门实践第2步,手把手教你使用labelimg标注数据集

路人贾的博客 1万+

数组 - 稀疏数组

一,稀疏数组 1.定义 稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组 形如: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

kevin的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实现稀疏数组

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

baolingye的博客 5683

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

初识稀疏数组

小白初识稀疏数组,详细介绍稀疏数组定义、解释以及代码实现。

m0_75173521的博客 845

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

什么是稀疏数组

什么是稀疏数组 当一个数组大部分元素为0,或者为同一个值的数组时,可以使用稀释数组来保存该数组。 如以下例子: int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3]= 2; //遍历array1数组 System.out.println("输出原始的数组:"); for (int[] ints : array1) {

weixin_46271608的博客 763

稀疏数组

一、概述   1、概念      2、处理方法      3、示例   原数组如下:      转换为稀疏数组如下:    二、代码   1、主方法 @Testpublic void SparseTest() { // 创建一个原始的二维数组 11 * 11 // 0: 表示没有棋子, 1 表示 黑子 2 表蓝子 int[][] arr = new ...

全网同名,欢迎关注。 648

算法——【稀疏数组】——探究稀疏数组

稀疏数组 文章目录稀疏数组什么是稀疏数组稀疏数组的规则稀疏数组的优点稀疏数组的使用场景稀疏数组的代码 什么是稀疏数组 稀疏数组也是数组。 稀疏数组(Sparse array) ,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。 稀疏数组的规则 以原数组为二维数组举例 第一行:二维数组的行、列、有效数据的个数 第二行及以后:有效数据所在行、列、有

奔跑的狮子 650

怎么转稀疏数组?稀疏数组又是啥呢?

为什么会需要稀疏数组? 大家都玩过五子棋,五子棋的棋盘就相当于一个我们java中的二维数据,但是当我们下了一两步棋的时候,这时候需要将自己下的期步骤等数据保存到棋盘该怎么办呢? 直接将全部的数据全部保存下来吗?这样是不是有点浪费了内存呢?毕竟这时候的有效数据还是很少的,那该怎么做呢? 这时候就需要我们的稀疏数组来实现了 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没...

paul的博客 488
上一篇: 线性结构和非线性结构
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值