【小白笔记】稀疏数组 (Sparse Array) 在计算机科学中的存储优化问题

稀疏数组 (Sparse Array) 在计算机科学中的存储优化 问题。使用字典(Python 中的 dict)来存储稀疏数组的方法,通常被称为坐标列表法 (Coordinate List, COO) 或字典键值对法。


🧐 稀疏数组 (Sparse Array) 是什么?

术语解释:

  • 数组 (Array): 一种数据结构,用于存储固定大小的、相同类型元素的集合。在数学和编程中,通常指矩阵(Matrix)或向量(Vector)。
  • 稀疏 (Sparse): 英文单词 Sparse (adj.) 意为"稀疏的、零星的、贫乏的"。
    • 词源:来源于拉丁语 sparsus,意为"散布的、分散的"。
  • 稀疏数组 (Sparse Array / Sparse Matrix):
    • 指数组(特别是二维数组/矩阵 )中绝大多数 元素的值都是零(或某个默认值)的情况。

为什么需要优化?

对于一个 1000×10001000 \times 10001000×1000 的矩阵,如果其中只有 10 个非零元素,但您仍然用 1000×1000=1001000 \times 1000 = 1001000×1000=100 万个位置来存储它,这会造成巨大的内存浪费。


💡 字典存储法:用 [i, j] 做 Key 是什么意思?

"用 [i, j] 做 key" 的意思是:我们不存储所有零 元素,而只存储那些非零元素。

1. 存储结构

这种方法使用一个 Python 字典 (Dictionary) 来存储数据,其结构如下:

Dictionary={Key:Value}\text{Dictionary} = \{ \text{Key} : \text{Value} \}Dictionary={Key:Value}

在这种稀疏存储法中:

  • Key (键): 数组中非零元素 的坐标 ,即它的行索引 iii 和列索引 jjj 。在 Python 中,通常用元组 (Tuple) (i, j) 来表示键,因为元组是不可变的,可以作为字典的键。
  • Value (值): 位于该坐标 (i, j) 上的非零元素的值。

2. 实际操作示例

假设有一个 3×33 \times 33×3 的稀疏矩阵 AAA:

A=(050000−200) A = \begin{pmatrix} 0 & 5 & 0 \\ 0 & 0 & 0 \\ -2 & 0 & 0 \end{pmatrix} A= 00−2500000

传统存储 (浪费内存): 需要 3×3=93 \times 3 = 93×3=9 个内存单元。

字典存储法 (内存优化): 只存储两个非零元素的位置和值:

sparse_dict={(0,1):5,(2,0):−2}\text{sparse\_dict} = \{ (0, 1) : 5, \quad (2, 0) : -2 \}sparse_dict={(0,1):5,(2,0):−2}

解读:

  • 键 (0, 1) 表示:第 0 行,第 1 列的元素。
  • 值 5 表示:该位置上的值是 5。
  • 如果想知道 (1, 2) 位置的值,只需查询字典中没有 这个键,那么默认值就是 000。

3. 核心优势

  • 节省内存: 内存消耗只与非零元素 的数量成正比,而不是与矩阵的总大小成正比。
  • 快速查找: 由于使用了字典的哈希表结构,查找一个特定位置 (i, j) 的时间复杂度接近 O(1)O(1)O(1) (常数时间),非常快。

术语解释:

  • 字典 (Dictionary): Python 中的核心数据结构,存储键值对 (Key-Value Pairs)。
  • 哈希表 (Hash Table): 专业术语 。字典内部实现的数据结构,通过哈希函数 (Hash Function) 将键映射到存储位置,以实现快速的查找、插入和删除操作。

总而言之,用 (i, j) 做 Key 存入字典,是一种高效 且空间友好的稀疏数组存储技术,核心思想是"只记录非零数据的位置和值"。

相关推荐
优选资源分享6 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron
星恒随风7 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式
qq_284274057 小时前
数控机床编程基础与坐标系:编程六步流程、程序号/程序段/程序字格式,与右手定则下车床铣床XYZ轴判定(含考点)
笔记·学习·自动化·制造
问心无愧05138 小时前
[SUCTF 2019]EasySQL
笔记
ss2738 小时前
PG实战笔记 | 09 PostgreSQL psql客户端基本操作
数据库·笔记·postgresql
xxwl5858 小时前
区域赛分类题解
c++·笔记·学习·算法
成都蜀味缘餐饮技术培训学校11 小时前
油炸串串技术培训实战指南,核心食材选购与预处理标准
数据仓库·经验分享·笔记·课程设计·微信公众平台
摇滚侠11 小时前
《大模型应用开发实践:基于 Spring AI+DeepSeek 实现》第 11 章 大模型技术概览 阅读笔记 1
人工智能·笔记·spring
xxwl58512 小时前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法
知产xiao_xin13 小时前
专利立法及修改
经验分享·笔记·知识产权