稀疏数组学习

稀疏数组(Sparse Array) 是一种用于压缩存储大量默认值(通常是 0)的数组的数据结构。它通过只存储非默认值的元素及其位置来节省空间。稀疏数组常用于存储矩阵或二维数组,尤其是当数组中大部分元素为默认值时。

稀疏数组的核心思想

普通数组的问题:

如果一个二维数组中有大量重复的默认值(如 0),存储这些值会浪费空间。

稀疏数组的解决方案:

只存储非默认值的元素及其位置。

使用一个三元组 (行, 列, 值) 来表示每个非默认值。

稀疏数组的结构

稀疏数组通常由两部分组成:

第一行:

存储原始数组的行数、列数以及非默认值的个数。

例如:[行数, 列数, 非默认值个数]。

后续行:

每一行存储一个非默认值的三元组 (行, 列, 值)。
在这里插入图片描述

package com.jianstudy.array;
public class ArrayDemo11 {public static void main(String[] args) {//稀疏数组学习//原始数组int[][] array1 = {{0,0,0,2,0},{0,0,3,0,0},{1,0,0,5,0},{0,4,0,0,0}};//获取原始数组有效值的个数int result = 0;//定义一个result存放有效值的个数for(int i =0;i< array1.length;i++){for(int j =0;j<array1[0].length;j++){if(array1[i][j]!=0){//判断如果对应某行某列的元素不等于0(即有效值)就让result自增result ++;}}}System.out.println("原始数组有效值有"+result+"个"); //原始数组有效值有5个     //创建一个数组存放稀疏数组int[][] array2 = new int[result+1][3]; //稀疏数组的长度是[5+1][3] 6行3列/*稀疏数组的一层是行数,有效值的个数+1(多一行表示头部信息 用来存放 行,列,有效值)稀疏数组的二层是列数固定3   (1列存放的行,2列存放的列,3列存放的有效值)*///用二维数组的长度来表示稀疏数组的头部 行 信息array2[0][0]= array1.length;//初始化  把原始数组行的长度 赋给 稀疏数组的第一行第一列//因为原始数组是规则的二维数组,所以每一组二维数组的内层一维数组长度是一样的所以可以随便取一组来获取内层一维数组的长度//用内层的一维数组的长度来表示稀疏数组的头部 列 信息array2[0][1]= array1[0].length;//初始化  把原始数组列的长度 赋给 稀疏数组的第一行第二列//用result表示稀疏数组的头部有效值信息array2[0][2]=result;//初始化  把获得有效值的个数 赋给 稀疏数组的第一行第三列/*       得到头部信息(第一行)行 列 有效值        *///填充稀疏数组//第一次循环会把头部信息遍历出来,后续得到的都是有效值元素的行列坐标以及有效元素本身的值int count =0;//计数 稀疏数组的有效值行数for(int i=0  ;i< array1.length ;i++){for(int j=0 ;j<array1[0].length;j++){if(array1[i][j]!=0){//如果原始数组的某个值不为0(即有效值)执行以下代码                count++;array2[count][0] = i;//稀疏数组有效值的行坐标array2[count][1] = j;//稀疏数组有效值的列坐标array2[count][2] = array1[i][j];//稀疏数组的有效值  }}}//输出稀疏数组System.out.println("输出稀疏数组");for(int i = 0;i<array2.length;i++){//因为稀疏数组的列数是固定的所以只需要循环行数iSystem.out.println( array2[i][0]+" "+ array2[i][1]+" "+ array2[i][2]+" ");/*此时的稀疏数组  array2 =[5+1][3] 6行3列0	 1    20头部信息 行4 列5 有效值51 		  0   3   22 		  1   2   33 		  2   0   14 		  2   3   55 		  3   1   4array2 = {{4 5 5},{0 3 2},{1 2 3},{2 0 1},{2 3 5},								 {3 1 4}} 		*/    }//还原稀疏数组//1.读取稀疏数组        //稀疏数组的头部行列信息就是还原数组的外内层元素。且隐性的初始化还原数组array3的各个元素					int[][] array3 = new int[array2[0][0]][array2[0][1]];//array2[0][0]=4 array2[0][1]=5/*  			头部信息    行4 列5int[][] array3 = new int[4][5];array3[0][0]=0;.........array3[3][4]=0;	4*5=20个元素全部被隐性的初始化*///2.给其中的元素还原他的值。for (int i = 1; i < array2.length; i++) {//要从第二行开始,第一行是头部信息i=1就是第二行开始 如果i=0就会读到头部信息/*0 1行  头部信息 行4 列5 有效值5        1 2行            0   3   2			 			1 2行 0 3 22 3行  		   1   2   3						2 3行 1 2 33 4行  		   2   0   1	 		-------->   3 4行 2 0 14 5行  		   2   3   5						4 5行 2 3 55 6行  		   3   1   4                        5 6行 3 1 4*///这里可以看成初始化array3的元素。还原数组接收稀疏数组有效值,匹配的是稀疏数组有效值的行列                array3[array2[i][0]][array2[i][1]]=array2[i][2];//稀疏数组的有效值,赋给还原数组的对应项/*从{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}}{{0,0,0,0,0},{0,0,0,0,0},{0,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,0,0}}{{0,0,0,2,0},{0,0,3,0,0},{0,0,0,0,0},{0,0,0,0,0}}{{0,0,0,2,0},{0,0,3,0,0},{1,0,0,0,0},{0,0,0,0,0}}								{{0,0,0,2,0},{0,0,3,0,0},{1,0,0,5,0},{0,0,0,0,0}}{{0,0,0,2,0},{0,0,3,0,0},{1,0,0,5,0},{0,4,0,0,0}}*/            }System.out.println("=============");//3.使用for each循环打印还原后的稀疏数组for(int[] a:array3){for(int b:a){System.out.print(b+" ");}System.out.println();}}
}

在这里插入图片描述

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

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

相关文章

一、Vscode、Git、Github账号及个人访问令牌

一、Vscode下载、安装 1.Vscode 下载地址 2. Vscode安装 3.Vscode 配置C 安装插件 中文插件&#xff08;安装后重启生效&#xff09; C 扩展包 MinGw下载 MinGw蓝奏云下载链接,密码&#xff1a;64xamingw-64 官网—>下载时需要访问Github&#xff0c;需要挂梯子 配…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时&#xff0c;添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为&#xff0c;我们可以将已登录状态的Cookies存储起来&#xff0c;并在下次自动化测试或爬虫任务中直接加载这些Cookies&#xff0c;从而跳过登录步骤。 Cookies简介 …

Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 3 部分

附件下载 联系工作人员获取附件 在 OpticStudio 中使用 RCWA 工具为增强现实&#xff08;AR&#xff09;系统设置出瞳扩展器&#xff08;EPE&#xff09;的示例中&#xff0c;首先解释了 k空间中光栅的规划&#xff0c;并详细讨论了设置每个光栅的步骤。 介绍 本文是四篇文…

Acwing 哞叫时间II

6134. 哞叫时间II - AcWing题库 题目大意&#xff1a;统计数组中子序列abb的数量&#xff1a; 做法&#xff1a;从右往左枚举倒数第二个b&#xff0c;查前面出现过多少次a&#xff0c;查的方法(开一个数组left[x]来统计当前及前面出现过多少次x&#xff0c;cnt记录不同x的数量…

PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下

PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…

基于 Ray 构建的机器学习平台

在当今的人工智能和机器学习领域,构建一个高效、可扩展且易于管理的机器学习平台是许多企业和研究机构面临的重大挑战。随着数据量的不断增长和模型复杂度的提高,传统的机器学习平台往往难以满足现代 AI 应用的需求。Ray,作为一个强大的分布式计算框架,为解决这些问题提供了…

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…

梯度下降法(Gradient Descent) -- 现代机器学习的血液

梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧&#xff0c;用三维可视化案例和代码实现揭示其内在逻辑&#xff0c;为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…

VS Code 如何搭建CC++开发环境

VS Code 如何搭建C/C开发环境 文章目录 VS Code 如何搭建C/C开发环境1. VS Code是什么2. VS Code的下载和安装2.1 下载和安装2.2 环境的介绍 3. VS Code配置C/C开发环境3.1 下载和配置MinGW-w64编译器套件3.2 安装C/C插件3.3 重启VS Code 4. 在VS Code上编写C语言代码并编译成功…

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Python正则

1.正则表达式 1.1含义&#xff1a;记录文本规则的代码&#xff0c;字符串处理工具 注意&#xff1a;需要导入re模块 1.2特点&#xff1a; 1.语法比较负杂&#xff0c;可读性较差 2.通用性很强&#xff0c;适用于多种编程语言 1.3步骤&#xff1a; 1.导入re模块 import…

网络安全虚拟化组成

网络安全虚拟化组成是指利用虚拟技术对网络安全功能进行集成、管理和提供的过程。在当今数字化时代&#xff0c;网络安全已经成为企业以及个人信息安全的重要组成部分。而华为作为一家全球知名的通信技术解决方案提供商&#xff0c;在网络安全领域拥有着丰富的经验和技术积累。…

【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…

【AVL树】—— 我与C++的不解之缘(二十三)

什么是AVL树&#xff1f; AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家&#xff0c;他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树&#xff0c;说白了就是能够自己控制平衡结构…

使用C#控制台调用本地部署的DeepSeek

1、背景 春节期间大火的deepseek&#xff0c;在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了&#xff0c;真是迅速啊&#xff01; C#也是可以进行对接&#xff0c;并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…

Java AQS(AbstractQueuedSynchronizer):深入剖析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

蓝桥备赛(七)- 函数与递归(上)

一、函数是什么 数学中 &#xff0c; 我们其实就见过函数的概念 &#xff0c; 比如 : 一次函数 y kx b &#xff0c; k 和 b 都是常数 &#xff0c; 给一个任意的x 就得到一个 y 值。 其实C/C语言中就引入了函数(function&#xff09;的概念 &#xff0c; 有些翻译成&#…

【java】@Transactional导致@DS注解切换数据源失效

最近业务中出现了多商户多租户的逻辑&#xff0c;所以需要分库&#xff0c;项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好&#xff0c;但之后发现在调用com.baomidou.mybatisplus.ex…

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…