数据结构(稀疏数组)

简介

稀疏数组是一种数据结构,用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中,只有非零或非重复的元素会被存储,从而节省内存空间。

案例引入

假如想把下面这张表存入文件,我们会怎么做?

二维数组
如果我们不做优化其实是浪费了很大一部分空间去存储空值,有没有办法既能实现效果又能节省空间呢?其实有的,稀疏数组就可以做到。

二维数组转稀疏数组
假如我们只存储右边的数据,相对左边做了相对大的数据压缩,会把空数据也就是无效的数据过滤,只存储有效的数据。
稀疏数组结构解释:

[0][0] - 记录原二维数组有几行
[0][1] - 记录原二维数组有几列
[0][2] - 记录原二维数组有多少个有效的数据

后面的一次记录有效数据所在行和列及有效数据的具体值

1,我们先将上图中的第一个数据结构转成程序中的二维数组

//1,将棋盘中的1,2用二维数组保存起来int[][] chessArray = new int[11][11];chessArray[1][2] = 1;chessArray[2][3] = 2;System.out.println("将棋盘转换为原始的二维数组");for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {System.out.printf("%d\t", chessArray[i][j]);}System.out.println();}
        //2,将棋盘chessArray转出稀疏数组//稀疏数组一共有 row 3 col sum+1  第一行第一列未i行,第一行第二列为j列,第三个为num有效数据//第一步先要找出上述棋盘一共有多少个有效数据,计为sumint sum = 0;//默认0个有效数据for (int[] row : chessArray) {for (int data : row) {if (data != 0) {sum++;}}}//转换的稀疏数组int[][] sparseArray = new int[sum + 1][3];//将有效数据保存到稀疏数组中sparseArray[0][0] = chessArray.length;sparseArray[0][1] = chessArray.length;sparseArray[0][2] = sum;int count = 0;for(int i = 0;i<chessArray.length;i++){for(int j = 0 ;j<chessArray.length;j++){if(chessArray[i][j]!=0){count++;sparseArray[count][0] = i;sparseArray[count][1] = j;sparseArray[count][2] = chessArray[i][j];}}}System.out.println("转换的稀疏数组为");for(int []rows : sparseArray){for(int data:rows){System.out.printf("%d\t",data);}System.out.println();}
 //将稀疏数组转出原始数组//1,读取第一行创建原始数组的大小int [][] chessArray2 = new int[sparseArray[0][0]][sparseArray[0][1]];System.out.println();System.out.println("原始数组"+sparseArray[0][0]+" "+sparseArray[0][1]);for(int i = 1;i<sparseArray.length;i++){chessArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}System.out.println("转换的原始数组");for(int []rows : chessArray2){for(int data:rows){System.out.printf("%d\t",data);}System.out.println();}

总结

从上面的案例中,我们能感受到稀疏数组的一些特点:
存储效率:由于只存储非零或非重复的元素,稀疏数组在处理大量零值或重复值的数据时非常高效。

空间优化:相比于传统的数组,稀疏数组可以显著减少所需的存储空间。

稀疏性:稀疏数组中的元素大部分是零或重复值,这些值不需要存储。

实现方式:稀疏数组可以通过多种方式实现,例如使用哈希表、链表、位图或压缩存储等。

适用场景:稀疏数组适用于那些元素值重复或为零的情况,例如图的邻接矩阵、大规模数据集、科学计算中的矩阵等。

访问速度:虽然稀疏数组在存储上很高效,但访问速度可能会比传统数组慢,因为需要额外的查找步骤来定位非零元素。

更新和删除:在稀疏数组中更新或删除元素可能比在传统数组中更复杂,因为需要维护非零元素的索引或映射。

稀疏度:稀疏数组的效率很大程度上取决于其稀疏度,即非零或非重复元素占总元素的比例。稀疏度越高,稀疏数组的优势越明显。

总的来说,稀疏数组是一种针对特定数据特性优化的数据结构,可以在特定场景下提供存储和处理上的优势。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu 修改源地址

注意事项&#xff1a;版本说明&#xff01;&#xff01;&#xff01; Ubuntu24.04的源地址配置文件发生改变。 不再使用以前的 sources.list 文件&#xff0c;该文件内容变成了一行注释&#xff1a; # Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sources…

U盘有盘符但是打不开?深度解析与双路径恢复策略

数字时代&#xff0c;U盘作为我们日常工作和生活中不可或缺的数据存储工具&#xff0c;其稳定性和可靠性直接关系到我们数据的安全。然而&#xff0c;当您遇到U盘已成功识别盘符&#xff0c;却无法正常访问的情况时&#xff0c;这无疑是一个令人头疼的问题。本文将围绕“U盘有盘…

我在百科荣创企业实践——简易函数信号发生器(5)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

【保姆级教程】油猴脚本的安装使用

目录 前言 一、油猴简介 1. 核心功能 2. 应用场景 3. 安全性与兼容性 4. 社区生态 二、教学开始&#xff08;嫌麻烦直接目录跳转开始学习&#xff09; 1.插件安装&#xff08;以Microsoft Edge浏览器为例&#xff09; 2.获取脚本 3.大展身手 三、扩展&#xff08;脚…

【23】Android高级知识之Window(四) - ThreadedRenderer

一、概述 在上一篇文章中已经讲了setView整个流程中&#xff0c;最开始的addToDisplay和WMS跨进程通信的整个过程做了什么。继文章Android基础知识之Window(二)&#xff0c;这算是另外一个分支了&#xff0c;接着讲分析在performTraversals的三个操作中&#xff0c;最后触发pe…

Ansible的脚本-----playbook剧本【上】

目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一&#xff1a;给被管理主机安装httpd服务 2.2 实战演练二&#xff1a;定义、引用变量 2.3 实战演练三&#xff1a;指定远程主机sudo切换用户 2.4 实战演练四&#xff1a;when条件判断 2.5 实战演练五&…

一家银行数据库的六年攻坚战

前沿科技&#xff0c;数智经济 文&#xff5c;白 鸽 编&#xff5c;王一粟 从传统的商业数据库Oracle&#xff0c;到后来加入的MySQL数据库&#xff0c;再到现如今的分布式数据库&#xff0c;中国金融行业数据库的转型升级走过了多年时间。 “2018年&#xff0c;我们提出…

《你敢不学习?》numpy库——细细学<2>

续接上集: 1、reshape函数&#xff1a;重塑数组的形状 改变数组的维度 其语法为 numpy.reshape(arr, newshape, orderC) 如下图所示 首先生成一个1到17不包括17的16个元素的数组&#xff0c;然后对这个数组进行重塑&#xff0c;使其成为4行4列的二维数组&#xff0c;注意&…

【Micropython入门】Thoony安装并烧录固件到ESP32

文章目录 前言Thonny IDE 介绍Thoony的下载烧录固件到ESP32下载固件烧录固件烧录时的小问题 总结 前言 MicroPython 是一款为微控制器设计的精简版 Python 解释器&#xff0c;它以其简洁和强大的特性赢得了众多嵌入式开发者的青睐。ESP32 是一款功能强大且价格低廉的微控制器&…

React开发者并不存在

根本就没有所谓的React开发者 — 永远不要这样称呼自己。 这是许多软件开发者犯的一个巨大错误&#xff0c;浪费了你大量时间。 专注于工具而非概念。忽视了大局。 React只是一个JavaScript工具。JavaScript只是一个计算工具。计算只是一个解决问题的工具。 当我刚开始编码时&a…

hugging face 使用教程———快速入门

概述 本篇存在的意义是快速介绍hugging face使用&#xff0c;梳理主要部件&#xff0c;梳理易混淆概念。原因是&#xff1a;目前hugging face的使用&#xff0c;官方放在了3个地方&#xff08;参考链接部分&#xff09;&#xff1a;使用文档、NLP教程、Transformers git的readm…

PDF转Word后不能修改怎么办?是什么原因呢?

平时在生活中&#xff0c;很多朋友都会有将PDF转换成Word文档的需求&#xff0c;因为一般情况下PDF文件是不能直接编辑修改的&#xff0c;所以只能通过这种方式来解决问题。但是近期&#xff0c;有部分用户在后台反馈说PDF转Word后不能修改怎么办呢&#xff1f;其实这个问题也是…

前端页面:用户交互持续时间跟踪(duration)user-interaction-tracker

引言 在用户至上的时代&#xff0c;精准把握用户行为已成为产品优化的关键。本文将详细介绍 user-interaction-tracker 库&#xff0c;它提供了一种高效的解决方案&#xff0c;用于跟踪用户交互的持续时间&#xff0c;并提升项目埋点的效率。通过本文&#xff0c;你将了解到如…

云仓如何改变传统仓储模式?

云仓&#xff0c;即云仓储&#xff0c;是一种基于互联网技术的现代仓储模式&#xff0c;与传统的仓储模式相比&#xff0c;它在多个方面进行了创新和优化&#xff0c;包括&#xff1a; ———————————————————— 1、数据管理与实时监控&#xff1a; 云仓储利…

每日一题 LeetCode03 无重复字符的最长字串

1.题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长字串的长度。 2 思路 可以用两个指针, 滑动窗口的思想来做这道题,即定义两个指针.一个left和一个right 并且用一个set容器,一个length , 一个maxlength来记录, 让right往右走,并且用一个set容器来…

【数据结构】链表(单链表实现 + 详解 + 原码)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

Spring Boot配置文件的语法规则

主要介绍两种配置文件的语法和格式&#xff0c;properties和yml 目录 1.配置文件的作用 2.创建配置文件 3.properties语法 4.yml语法 5.配置文件格式 1.配置文件的作用 对于配置文件&#xff0c;也有独立的文件夹去存放&#xff0c;主要用来存放一些需要经过变动的数据&a…

IEDA怎么把springboot项目 启动多个

利用Idea提供的Edit Configurations配置应用参数。 点击Modify Options进行添加应用参数&#xff1a; 确保这里勾选

如何避免蓝屏?轻量部署,安全和业务连续性才能两不误

自19日起&#xff0c;因CrowdStrike软件更新的错误配置而导致的“微软全球蓝屏”&#xff0c;影响依然在持续。这场被称为“史上最大规模的IT故障”&#xff0c;由于所涉全球企业太多&#xff0c;专家估计“蓝屏”电脑全部恢复正常仍需时日。 尽管 CEO 乔治 库尔茨&#xff08…

C#入门与精通

C#精通 本文章主要是对于学习C#基础难点进行学习以及与java语言的不同点&#xff0c;详细学习可见官网&#xff1a;https://dotnet.microsoft.com/en-us/learn 文章目录 C#精通VSVS基本设置 C#是什么C#程序控制台输出变量内插占位符C#foreach循环类型转换操作数组内置方法格式设…