如何存储稀疏矩阵

How to store sparse matrix?

本文关键字:存储 何存储      更新时间:2023-10-16

我需要在C++中实现 2 种类型的稀疏矩阵存储:

  • 链表
  • 阵列(有效方式)

空间复杂性在这里非常重要。最有效的方法是什么?

nnz

稀疏矩阵
的非零数 row_size:矩阵行号
column_size:矩阵列号
有很多方法,它们的空间复杂性:

  • 压缩稀疏行 (CSR):2*nnz + row_size内存数
  • 压缩稀疏列 (CSC):2*nnz + column_size内存数量
  • 坐标格式 (COO) : 3*nnz内存数量

对于空间复杂性:
如果row_size > column_size,请使用CSC格式,否则使用CSR格式。

对于时间复杂度:
对于CSR格式,Row 将按O(1)时间编制索引,Column 将按 O(log(k)) 时间编制索引,通过二叉搜索索引列,k是该行的非零元素的数量。因此,值将按O(log(k))时间编制索引。
对于COO格式,值将在O(1)时间内编制索引。

格式详细信息
[1] https://en.wikipedia.org/wiki/Sparse_matrix
[2] https://software.intel.com/en-us/node/471374

一种有效的方法是使用哈希映射(对于每一行)的哈希映射(按列索引将元素存储在每一行中)。然后能够在 O(1) 时间内访问任何元素。

您可以实现所有数值算法,例如仅通过非零元素进行加法和乘法迭代,这将使您比 O(N * M) 具有更好的复杂性,其中 N 和 M 是矩阵中的列数和行数。

由于矩阵是稀疏的,因此您只需要存储填充的单元格。应该可以简单地查找坐标到值。理想情况下,您应该使用具有快速查找功能的东西,例如地图 O(log n) 或 unordered_map O(1)。