数据结构-稀疏数组

news2025/7/7 3:34:50

稀疏数组是一种特殊的数据结构,主要用于存储那些大部分元素为零或者未使用的大型数组。以下是关于稀疏数组的详细知识点,按照分点表示和归纳的方式整理:

一、定义

  • 稀疏数组是指那些大部分内容值为空(通常为0)的数组。在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。
  • 通常认为,矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,该矩阵可被视为稀疏矩阵。

二、特点

  • 节省存储空间:由于稀疏数组中大部分元素为零或未使用,直接存储整个数组会浪费大量存储空间。稀疏数组通过仅存储非零元素及其位置信息,极大地减少了存储需求。
  • 提高处理效率:对于稀疏数组,由于非零元素数量较少,因此在执行相关操作时(如矩阵运算),可以只关注非零元素,从而提高处理效率。

三、存储方式

  • 三元组表示法:将非零元素及其坐标信息(行、列)作为记录存储,每条记录包含三个数据:(行索引,列索引,元素值)。
  • 压缩稀疏行(CSR)或压缩稀疏列(CSC)格式:更高级的稀疏数组存储格式,通过三个数组分别存储非零元素值、对应的行索引和列开始位置索引,从而更快地访问和操作非零元素。

四、应用场景

  • 游戏编程中的地图数据存储:如棋类游戏(五子棋、围棋等),只需要存储落子的位置及其状态。
  • 大规模科学计算中的稀疏矩阵运算:例如在有限元分析、网络图论等领域。
  • 图像处理:在图像处理中,某些图像可能包含大量黑色或白色像素(即值为0或某个固定值),可以使用稀疏数组来存储这些图像以节省空间。

五、优势

  • 空间效率:通过仅存储非零元素及其位置信息,稀疏数组显著提高了空间效率。
  • 时间效率:在处理稀疏数组时,由于非零元素数量较少,因此可以更快地执行相关操作。

六、代码示例

     在Java中,稀疏数组的实现通常涉及到一个自定义的类,用于存储非零元素的值以及它们的位置(通常是行索引和列索引)。下面是一个简单的Java实现,用于将二维数组转换为稀疏数组,并允许从稀疏数组恢复原始数组(如果可能的话)。

首先,我们定义一个Triple类来存储非零元素的三元组(值、行索引、列索引)

public class Triple {  
    public int row;  
    public int col;  
    public int value;  
  
    public Triple(int row, int col, int value) {  
        this.row = row;  
        this.col = col;  
        this.value = value;  
    }  
}

接着,我们实现稀疏数组的相关操作

import java.util.ArrayList;  
import java.util.List;  
  
public class SparseArray {  
  
    // 原始二维数组转换为稀疏数组  
    public static List<Triple> toSparseArray(int[][] array) {  
        List<Triple> sparseArray = new ArrayList<>();  
        int rows = array.length;  
        int cols = rows > 0 ? array[0].length : 0;  
  
        // 遍历原始二维数组,找出非零元素  
        for (int i = 0; i < rows; i++) {  
            for (int j = 0; j < cols; j++) {  
                if (array[i][j] != 0) {  
                    sparseArray.add(new Triple(i, j, array[i][j]));  
                }  
            }  
        }  
  
        // 稀疏数组应包含原始数组的大小信息(可选)  
        // 这里省略,因为示例中只处理非零元素  
  
        return sparseArray;  
    }  
  
    // 稀疏数组恢复为原始二维数组  
    public static int[][] fromSparseArray(List<Triple> sparseArray, int rows, int cols) {  
        int[][] array = new int[rows][cols];  
  
        // 将非零元素放回到原始二维数组的位置  
        for (Triple triple : sparseArray) {  
            array[triple.row][triple.col] = triple.value;  
        }  
  
        return array;  
    }  
  
    // 示例代码  
    public static void main(String[] args) {  
        // 原始二维数组  
        int[][] originalArray = {  
                {1, 0, 0, 4},  
                {0, 0, 3, 0},  
                {0, 0, 0, 0}  
        };  
  
        // 转换为稀疏数组  
        List<Triple> sparseArray = toSparseArray(originalArray);  
  
        // 输出稀疏数组(仅为示例)  
        for (Triple triple : sparseArray) {  
            System.out.println("(" + triple.row + ", " + triple.col + "): " + triple.value);  
        }  
  
        // 从稀疏数组恢复原始二维数组(需要知道原始数组的大小)  
        int[][] recoveredArray = fromSparseArray(sparseArray, originalArray.length, originalArray[0].length);  
  
        // 输出恢复后的数组(仅为示例)  
        for (int[] row : recoveredArray) {  
            for (int value : row) {  
                System.out.print(value + " ");  
            }  
            System.out.println();  
        }  
    }  
}

在上面的代码中,toSparseArray 方法将二维数组转换为稀疏数组(即一个Triple对象的列表),而fromSparseArray 方法则将稀疏数组恢复为原始的二维数组。注意,在恢复过程中,我们需要知道原始数组的行数和列数,因为这些信息在稀疏数组中通常是不存储的。在实际应用中,可能需要将原始数组的大小信息也作为稀疏数组的一部分来存储。

七、总结

稀疏数组是一种优化的数据结构,通过仅存储非零元素及其位置信息来节省存储空间并提高处理效率。它在游戏编程、科学计算和图像处理等领域具有广泛的应用。

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

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

相关文章

【Spring6】13-19章 JdbcTemplate+代理模式+AOP+Spring事务+Spring集成MyBatis

十三、JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类&#xff0c;是对JDBC的封装&#xff0c;简化JDBC代码。 当然&#xff0c;你也可以不用&#xff0c;可以让Spring集成其它的ORM框架&#xff0c;例如&#xff1a;MyBatis、Hibernate等。 接下来我们简单来学习一下…

【网络编程】TCP原理

TCP套接字中的I/O缓冲 write函数调用后并非立即传输数据&#xff0c;read函数调用后也非马上接收数据。write函数调用瞬间&#xff0c;数据将移至输出缓冲&#xff1b;read函数调用瞬间&#xff0c;从缓冲读取数据。 这些IO缓冲特性可整理如下。 口IO缓冲在每个TCP套接字中单…

人工智能发展历程和工具搭建学习

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

C#开发-集合使用和技巧(一)常用集合和方法介绍

C#开发-集合使用和技巧 &#xff08;一&#xff09;常用集合和方法介绍常用集合和方法介绍 C#开发-集合使用和技巧1. 集合基础集合介绍集合跟数组对比 2.我们常用的集合类型列表List<T>键值对集合Dictionary<TKey,TValue>队列Queue<T>其他一些集合类型堆栈St…

04-让LLM理解知识 -Prompt

1 Prompt Prompt 可理解为用于指导AI模型生成特定类型、主题或格式内容的文本。在NLP中&#xff0c;Prompt 通常由一个问题或任务描述组成&#xff0c;例如“给我写一篇有关RAG的文章”&#xff0c;这句话就是Prompt。 Prompt赋予了LLM小样本甚至零样本学习的能力。 大模型的…

07 SpringBoot 配置绑定

所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常&#xff0c;我们会把一些配置信息&#xff08;例如&#xff0c;数据库配置&#xff09;放在配置文件中&#xff0c;然后通过 Java 代码去读取该配置文件&#xff0c;并且把配置文件中指定的配置封…

TF-IDF算法:从文本中发现价值的黄金法则

TF-IDF算法 一、简介二、TF-IDF算法原理2.1 词频&#xff08;TF&#xff09;2.2 逆文档频率&#xff08;IDF&#xff09;2.3 TF-IDF的计算 三、TF-IDF算法应用3.1 搜索引擎3.2 文本分类3.3 信息提取3.4 文本摘要 四、TF-IDF算法的改进4.1、TF-IDF算法的改进4.1.1. 基于词的权重…

DC12V升压24V/5A电流 布控球产品应用 升压恒压SL4010耐压40V芯片

随着科技的不断发展&#xff0c;布控球作为一种高效、精准的安全监控设备&#xff0c;被广泛应用于公安、消防、交通等多个领域。然而&#xff0c;布控球在工作过程中需要稳定的电源供应&#xff0c;以保证其正常运行和长期稳定性。因此&#xff0c;一款性能优良的升压恒压芯片…

百度地图3.0截图,下载(解决图形下载偏移的问题)

百度地图应用3.0开发的页面&#xff0c;需要截图并下载的功能。前端采用html2canvas生成base64图片 由于百度地图绘制多边形是svg&#xff0c;而html2canvas不支持生成。不绘制线的截图是正常的&#xff0c;绘制了线条就会出现偏移。以下是对比&#xff0c;上一张是正常的&…

深入解析B树:数据结构、存储结构与算法优势

一、引言 在计算机科学中&#xff0c;数据结构和算法是核心内容。它们的选择和应用直接影响程序的效率和性能。B树&#xff08;B-Tree&#xff09;作为一种自平衡的多叉树数据结构&#xff0c;广泛应用于数据库和文件系统中。本文将详细介绍B树的数据结构模型、存储结构&#…

ssm创意商城-计算机毕业设计源码03663

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

JavaScript快速入门系列-2(JavaScript语言基础)

第二章&#xff1a;JavaScript语言基础 2.1 变量声明&#xff1a;let, const, var2.1.1 变量是什么&#xff1f;2.1.2 var2.1.3 let与const2.1.4 选择哪个关键字&#xff1f; 2.2 数据类型2.2.1 基本数据类型2.2.2 复杂数据类型2.2.3 示例与类型检测 2.3 运算符2.3.1 算术运算符…

C++基础知识(八:STL标准库 Map和multimap )

Map C 标准模板库&#xff08;STL&#xff09;中的 map 容器是一种非常有用的关联容器&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。在 map 中&#xff0c;每个元素都由一个键和一个值组成&#xff0c;其中键是唯一的&#xff0c;而值则可以重复。 基…

来自IEEE编委的发文建议及最佳实践

1.注意关键词(会涉及是否能找到合适的评审人) 2. Intro部分 contribution 通常3-4点 3. 注意文章中的符号使用前后统一 4.需要分析最终的结果(对之后的研究有什么帮助) 5.结论的部分 切忌虎头蛇尾,需要分析优点和缺点 建议未来的研究方向 6.参考文献

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…

max code size exceeded

Warning! Error encountered during contract execution [max code size exceeded] 智能合约编译时提示 contracts/core/CORE.sol:15:1: Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on m…

自研一套带双向认证的Android通用网络库

当前&#xff0c;许多网络库基于Retrofit或OkHttp开发&#xff0c;但实际项目中常需要定制化&#xff0c;并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么&#xff0c;有没有一种通用的封装方式&#xff0c;可以满足大多数项目需求&#xff1f;…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

如何平衡安全访问和办公效率?零信任安全×统一身份才是解决之道

在远程办公、混合办公、跨团队协作日益频繁的今天&#xff0c;企业的业务开展需要支持多种访问接入的需求和场景。如何平衡企业数据的安全访问和办公效率将成为挑战。 在业务的多种接入场景上&#xff0c;企业引入零信任&#xff08;Zero Trust&#xff0c;ZT&#xff09;产品…

鸿蒙用 BuilderParam 实现同一个布局不同内容组件

面通过一个案例展示BuilderParam的具体用法&#xff0c;例如&#xff0c;现需要实现一个通用的卡片组件&#xff0c;如下图所示 卡片中显示的内容不固定&#xff0c;例如 具体实现代码如下&#xff1a; Entry Component struct BuildParamDemo {build() {Column(){Card() {imag…