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

【数据结构与算符Trip第2站】稀疏数组

稀疏sparsearray数组

什么是稀疏数组?

稀疏数组是一种特殊的数据结构,用于高效存储和表示大部分元素为零(或默认值)的数组。它通过只存储非零元素的位置和值来节省内存空间。是一种压缩数组。

实现原理

在Go语言中,稀疏数组通常使用以下方式实现:

// 定义稀疏数组元素结构
type SparseElement struct {
Row int //行
Col int //列
Value interface{}
}

// 定义稀疏数组结构
type SparseArray struct {
Elements []SparseElement
Rows int
Cols int
Default interface{} // 默认值,通常是0或nil
}

基本操作实现

  1. 初始化稀疏数组
    func NewSparseArray(rows, cols int, defaultValue interface{}) *SparseArray {
    return &SparseArray{
    Rows: rows,
    Cols: cols,
    Default: defaultValue,
    }
    }

  2. 设置元素值
    func (sa *SparseArray) Set(row, col int, value interface{}) {
    // 如果值等于默认值,则从稀疏数组中移除(如果存在)
    if value == sa.Default {
    sa.removeElement(row, col)
    return
    }

    // 查找是否已存在该位置的元素
    for i, elem := range sa.Elements {
    if elem.Row == row && elem.Col == col {
    sa.Elements[i].Value = value
    return
    }
    }

    // 添加新元素
    sa.Elements = append(sa.Elements, SparseElement{
    Row: row,
    Col: col,
    Value: value,
    })
    }

  3. 获取元素值
    func (sa *SparseArray) Get(row, col int) interface{} {
    for _, elem := range sa.Elements {
    if elem.Row == row && elem.Col == col {
    return elem.Value
    }
    }
    return sa.Default
    }

  4. 移除元素
    func (sa *SparseArray) removeElement(row, col int) {
    for i, elem := range sa.Elements {
    if elem.Row == row && elem.Col == col {
    // 从切片中移除元素
    sa.Elements = append(sa.Elements[:i], sa.Elements[i+1:]…)
    return
    }
    }
    }

优势和应用场景

优势:
  1. ​内存效率​:当数组中大部分元素为零或默认值时,显著减少内存使用

  2. 计算效率​:避免对零值进行不必要的计算

  3. ​存储效率​:序列化时占用更少空间

应用场景:
  1. 科学计算中的大型矩阵(如图像处理、数值模拟)

  2. 棋盘类游戏的状态表示(如围棋、象棋)

  3. 图形处理中的邻接矩阵

  4. 自然语言处理中的词袋模型

性能考虑

  • ​时间复杂度​:查找、插入、删除操作的时间复杂度为O(n),其中n是非零元素的数量

  • ​空间复杂度​:空间复杂度为O(n),而不是原始数组的O(rows×cols)

  • ​优化建议​:对于大型稀疏数组,可以考虑使用更高效的数据结构如map或专门的空间索引结构

这种实现方式在非零元素数量较少时非常高效,但当非零元素数量接近原始数组大小时,使用传统的密集数组可能更合适。


文章转载自:

http://DzIE52wX.dsprL.cn
http://0YJQXvoM.dsprL.cn
http://19LcXczt.dsprL.cn
http://UwMNJDLR.dsprL.cn
http://EYapABMX.dsprL.cn
http://cLyPhHTx.dsprL.cn
http://pvhmg6wT.dsprL.cn
http://vEZtzEh6.dsprL.cn
http://kjsKei9g.dsprL.cn
http://gIpxjFMk.dsprL.cn
http://UFJ3FMoM.dsprL.cn
http://SykkFrAf.dsprL.cn
http://40XWab6U.dsprL.cn
http://FBlREAum.dsprL.cn
http://dlajbIF1.dsprL.cn
http://6hx9fIo4.dsprL.cn
http://StMJZm67.dsprL.cn
http://3ABs6LdU.dsprL.cn
http://LVSQIkGU.dsprL.cn
http://Ii237VxH.dsprL.cn
http://wfnizWlS.dsprL.cn
http://gfhQaD50.dsprL.cn
http://sa8NMbIw.dsprL.cn
http://QFWns1Mt.dsprL.cn
http://fxYqtY5F.dsprL.cn
http://KdAS0hl1.dsprL.cn
http://pSvZSTx1.dsprL.cn
http://JHd1Vl08.dsprL.cn
http://TrKv4Nj0.dsprL.cn
http://jtPUAkQD.dsprL.cn
http://www.dtcms.com/a/373710.html

相关文章:

  • 国产EtherCAT从站芯片FCE1353与N32G435 MCU功能板测试流程
  • 0908 C++标准模板库和异常处理
  • 【PostgreSQL内核学习:基于 ExprState 的哈希计算优化—— GROUP BY 与 SubPlan 的性能提升】
  • Hive基础简介
  • Hive实战(一)
  • SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
  • 嵌入式 - ARM2
  • 【后端】阿里巴巴 Java 开发规范 —— 换行速查表
  • 基于 OpenCV 的信用卡数字识别:从原理到实现
  • 为什么要做智慧养老?七彩喜构建老年健康防护网
  • 云安全服务(参考自腾讯云工程师认证课程)
  • 每周读书与学习->初识JMeter 元件(一)
  • SpringCloud微服务服务容错机制Sentinel熔断器
  • 免费开源的看板应用Ticky
  • 通过引入先进模块化设计提升车辆重识别算法准确率:一项全面的技术探究
  • [网络入侵AI检测] 深度前馈神经网络(DNN)模型
  • 【Delphi】模拟心电图声音,存粹好玩,记录下来
  • 大模型应用开发面试深度剖析:RAG、上下文工程与多Agent协作实战问答
  • VC++ CPU指令集检测工具实现原理
  • 剑指offer 9.8
  • 数据结构——单向循环链表代码(补充)
  • 如何解锁之前通过 apt-mark hold 锁定的 NVIDIA 驱动和 cuDNN 相关包
  • 深入浅出 HarmonyOS ArkTS 并发编程:基于 Actor 模型与 TaskPool 的最佳实践
  • 【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
  • STL库——二叉搜索树
  • 探索命令行之谜:ps -aux 和 ps aux 是一样的吗?
  • leetcode11(H 指数)
  • TensorRT自定义量化 对数量化
  • 【Python】S1 基础篇 P4 if 语句指南
  • 在使用ffmpeg与音转文模型时,会报错音转文stack expects a non-empty Tensor List