当前位置: 首页 > news >正文

数据结构与算法:稀疏数组

前言

  • 此文以整型元素的二维数组为例,阐述稀疏数组的思想。
  • 其他类型或许有更适合压缩算法或者其他结构的稀疏数组,此文暂不扩展。

稀疏数组的定义

在一个二维数据数组里,由于大量的元素的值为同一个值,比如 0或者其他已知的默认值,在处理此类数据的数据的时候,为了某种目的(如节省存储空间)而将 0 值或默认剔除方式,使用一个新数组来组织的剩余数据(此文称为存储有效数据,简称有效数),此时将该新数组称为稀疏数组

简而言之,存储原二维数组中有效数据信息的数组称为稀疏数组。

如下图中的 0 值是最多的元素,可以将 0 值视为要剔除储存的值,此文称为 剔除数
在这里插入图片描述

此处是压缩思想在数组上的应用,稀疏数组一般用于数据的压缩存储,已达到节省空间的目的。

稀疏数组的结构

二维数据的元素是数值

稀疏数据一般为 N*3的矩阵,N 为非剔除数据的个数,行列式的第一行描述元素的结构信息,如行列数,有效数的个数;其他行描述有效数的具体信息,如所在原数组中的位置。

第一列第二列第三列
行号列号
  • 第1行,第1列为原始数据的行数
  • 第1行,第2列为原始数据的列数
  • 第1行,第3列为原始数据的有效数的个数 n ,这个决定了稀疏数组的行数N( N= n+1)
第1行(原数组结构信息)18(原数组的行数)18(原数组的列数)68(原数组中有效数的个数)
第2行(原数组中元素的信息)0(值所在的行)0(值所在的列)7(值为 7)

二维数据的元素是字符

稀疏数据一般为 N*3的矩阵,N 为非剔除数据的个数

  • 第1行,第1列为原始数据的行数
  • 第1行,第2列为原始数据的列数
  • 第1行,第3列为原始数据的有效数的个数 n ,这个决定了稀疏数组的行数N( N= n+1)

稀疏数组的应用场景

  1. 数据元素中存在相同值较多且需要存储的情况。
  2. 网络数据传输的时候,可以根据传输的数据结构,采用稀疏数据的思想

总之,就是可以压缩存储或者压缩传输的时候,都可以考虑此稀疏思想。

案例

该案例演示了一个二维数组(业务数组)和与其匹配的稀疏数组(存储数组),仅为演示二者相互转换,未考虑转换中涉及到的算法优化,仅仅展示存储优化的设计思想。

  • 原始数组大小为:18*18=324
  • 稀疏数组大小为:68*3=204

转换后节省了 (324-204)/324*100%=37%的空间

package com.jj;import org.junit.jupiter.api.Test;public class TestAlgArray {@Testpublic void test() {int countRow = 18;int countCol = 18;int[][] arr = new int[countRow][countCol];for (int i = 0; i < countCol; i++) {arr[0][i] = 8;arr[7][i] = 5;arr[i][0] = 7;arr[i][7] = 3;}//输出int valueCount = 0;for (int i = 0; i < countCol; i++) {for (int j = 0; j < countCol; j++) {System.out.print(arr[i][j] + " ");if (arr[i][j] != 0) {valueCount++;}}System.out.println();}System.out.println("valueCount:" + valueCount);//生成一个稀疏数组int[][] saveData = new int[valueCount + 1][3];saveData[0][0] = countRow;saveData[0][1] = countCol;saveData[0][2] = valueCount;int index = 1;for (int i = 0; i < countCol; i++) {for (int j = 0; j < countCol; j++) {if (arr[i][j] != 0) {saveData[index][0] = i;saveData[index][1] = j;saveData[index][2] = arr[i][j];index++;}}}//输出 saveDatafor (int i = 0; i < saveData.length; i++) {for (int j = 0; j < saveData[i].length; j++) {System.out.print(saveData[i][j] + " ");}System.out.println();}//恢复业务数组int[][] newArr = new int[saveData[0][0]][saveData[0][1]];for (int i = 1; i < saveData.length; i++) {newArr[saveData[i][0]][saveData[i][1]] = saveData[i][2];}//输出业务数组for (int i = 0; i < newArr.length; i++) {for (int j = 0; j < newArr[i].length; j++) {
//                System.out.print(newArr[i][j] + " ");if (newArr[i][j] == 0) {System.out.print(" ");} else {System.out.print(newArr[i][j] + " ");}}System.out.println();}}
}
  • 原始数组(业务数据):18x18的矩阵
7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 5 5 5 5 5 5 3 5 5 5 5 5 5 5 5 5 5 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
  • 稀疏数组(存储数据):68x3 的矩阵
18 18 68 
0 0 7 
0 1 8 
0 2 8 
0 3 8 
0 4 8 
0 5 8 
0 6 8 
0 7 8 
0 8 8 
0 9 8 
0 10 8 
0 11 8 
0 12 8 
0 13 8 
0 14 8 
0 15 8 
0 16 8 
0 17 8 
1 0 7 
1 7 3 
2 0 7 
2 7 3 
3 0 7 
3 7 3 
4 0 7 
4 7 3 
5 0 7 
5 7 3 
6 0 7 
6 7 3 
7 0 7 
7 1 5 
7 2 5 
7 3 5 
7 4 5 
7 5 5 
7 6 5 
7 7 3 
7 8 5 
7 9 5 
7 10 5 
7 11 5 
7 12 5 
7 13 5 
7 14 5 
7 15 5 
7 16 5 
7 17 5 
8 0 7 
8 7 3 
9 0 7 
9 7 3 
10 0 7 
10 7 3 
11 0 7 
11 7 3 
12 0 7 
12 7 3 
13 0 7 
13 7 3 
14 0 7 
14 7 3 
15 0 7 
15 7 3 
16 0 7 
16 7 3 
17 0 7 
17 7 3 
  • 数据恢复
7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 5 5 5 5 5 5 3 5 5 5 5 5 5 5 5 5 5 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 

相关文章:

数据结构与算法:稀疏数组

前言 此文以整型元素的二维数组为例&#xff0c;阐述稀疏数组的思想。其他类型或许有更适合压缩算法或者其他结构的稀疏数组&#xff0c;此文暂不扩展。 稀疏数组的定义 在一个二维数据数组里&#xff0c;由于大量的元素的值为同一个值&#xff0c;比如 0或者其他已知的默认值…...

Meta重磅发布Llama 3.3 70B:开源AI模型的新里程碑

在人工智能领域&#xff0c;Meta的最新动作再次引起了全球的关注。今天&#xff0c;我们见证了Meta发布的Llama 3.3 70B模型&#xff0c;这是一个开源的人工智能模型&#xff0c;它不仅令人印象深刻&#xff0c;而且在性能上达到了一个新的高度。 一&#xff0c;技术突破&#…...

VSCode中的Black Formatter没有生效的解决办法

说明 如果正常按照配置进行的话&#xff0c;理论上是可以生效的。 "[python]": {"editor.defaultFormatter": "ms-python.black-formatter","editor.formatOnSave": true }但我在一种情况下发现不能生效&#xff0c;应为其本身的bug…...

【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题

目录 背包问题简介 问题描述 输入&#xff1a; 输出&#xff1a; 动态规划解法 动态规划状态转移 代码实现 代码解释 动态规划的时间复杂度 例子解析 输出&#xff1a; 总结 作者我蓝桥杯&#xff1a;2023第十四届蓝桥杯国赛C/C大学B组一等奖&#xff0c;所以请听我…...

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…...

微信小程序苹果手机自带的数字键盘老是弹出收起,影响用户体验,100%解决

文章目录 1、index.wxml2、index.js3、index.wxss1、index.wxml <!--index.wxml--> <view class="container"><view class="code-input-container"><view class="code-input-boxes"><!-- <block wx:for="{{…...

sql中case when若条件重复 执行的顺序

sql case when若条件重复 执行的顺序 在 SQL 中&#xff0c;如果你在 CASE 表达式中定义了多个 WHEN 子句&#xff0c;并且这些条件有重叠&#xff0c;那么 CASE 表达式的执行顺序遵循以下规则&#xff1a; &#xff08;1&#xff09;从上到下&#xff1a;SQL 引擎会按照 CASE …...

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…...

cesium 与 threejs 对比

Cesium 和 Three.js 都是用于在 Web 浏览器中创建和渲染 3D 图形的强大 JavaScript 库&#xff0c;但它们有显著的不同之处&#xff0c;主要体现在应用领域、功能集和使用场景上。 以下是两者之间的对比&#xff1a; 1. 应用场景 Three.js: 适用于广泛的 3D 图形应用&#xff…...

探索QScreen的信号与槽:动态响应屏幕变化

在处理屏幕显示和多显示器环境时&#xff0c;QScreen 提供了一些特有的信号&#xff0c;这些信号可以在屏幕的变化时通知应用程序&#xff0c;帮助我们动态地适配和响应显示设备的变化。今天&#xff0c;我们将深入探讨如何使用 QScreen 的信号与槽&#xff0c;并展示适用的使用…...

vLLM项目加入PyTorch生态系统,引领LLM推理新纪元

近日&#xff0c;vLLM项目宣布正式成为PyTorch生态系统的一部分&#xff0c;标志着该项目与PyTorch的合作进入了一个全新的阶段。本文将从以下几个方面进行介绍&#xff0c;特别提醒&#xff1a;安装方案在第四个部分&#xff0c;可选择性阅读。 vLLM项目概述 vLLM的成就与实际…...

索引-介绍结构语法

一.概述&#xff1a; 1.当给某个字段创建索引后&#xff0c;就会把字段生成二叉排序树进行查找&#xff0c;大大增加了查找效率&#xff0c;比不创建索引时用的全表扫描好得多。 2.二叉排序树&#xff1a;小的在左边&#xff0c;大的在右边(查找和存放都遵循这个原则)。 3.注…...

SpringBoot整合JDBC

讲到这里&#xff0c;基本上我们就可以使用SpringBoot来开发Web项目视图显示和业务逻辑代码&#xff0c;但是要做一个完成案例&#xff0c;我们还差一点点&#xff0c;就是怎么访问数据库&#xff0c;获取数据&#xff0c;接下来我们就看怎么用SpringBoot整合我们前面已经讲过的…...

XXE靶场

XXE-lab 靶场 靶场网址&#xff1a;http://172.16.0.87/ 第一步我们看到网站有登录框我们试着用 bp 去抓一下包 将抓到的包发到重放器中 然后我们构建palody <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/readconvert.base64-encode/resourceC:/flag/fla…...

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者&#xff1a;来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么&#xff1f; Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…...

Facebook的隐私保护政策:用户数据如何在平台上被管理?

在当今数字化世界&#xff0c;社交平台如何管理用户数据并保护隐私成为了一个热点话题。作为全球最大的社交网络&#xff0c;Facebook&#xff08;现Meta&#xff09;在数据隐私方面的政策备受关注。本文将简要介绍Facebook的隐私保护措施&#xff0c;以及用户数据如何在平台上…...

【ETCD】【源码阅读】深入解析 EtcdServer.applySnapshot方法

今天我们来一步步分析ETCD中applySnapshot函数 一、函数完整代码 函数的完整代码如下&#xff1a; func (s *EtcdServer) applySnapshot(ep *etcdProgress, apply *apply) {if raft.IsEmptySnap(apply.snapshot) {return}applySnapshotInProgress.Inc()lg : s.Logger()lg.In…...

‌HBase是什么,‌HBase介绍

‌官方网站&#xff1a;Apache HBase – Apache HBase Home HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;主要用于存储和处理海量数据。‌它起源于Google的​​​​​​​BigTable论文&#xff0c;是Apache Hadoop项目的子项目。HBase设计用于高可靠性、高性能和可伸…...

【Rust自学】3.3. 数据类型:复合类型

3.3.0. 写在正文之前 欢迎来到Rust自学的第三章&#xff0c;一共有6个小节&#xff0c;分别是: 变量与可变性数据类型&#xff1a;标量类型数据类型&#xff1a;复合类型&#xff08;本文&#xff09;函数和注释控制流&#xff1a;if else控制流&#xff1a;循环 通过第二章…...

【C++】小乐乐求和问题的高效求解与算法对比分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述与数学模型1.1 题目概述1.2 输入输出要求1.3 数学建模 &#x1f4af;方法一&#xff1a;朴素循环求和法2.1 实现原理2.2 分析与问题2.3 改进方案2.4 性能瓶颈与结论…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...