如何存储稀疏矩阵?

say*_*llo 5 c++ time-complexity sparse-matrix

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

  • 链表
  • 数组(有效方式)

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

pgp*_*628 4

nnz:稀疏矩阵的非零个数
row_size:矩阵行数
column_size:矩阵列数
方式有很多种,它们的空间复杂度:

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

对于空间复杂度:
如果row_size > column_size,则使用CSCformat,否则使用CSRformat。

对于时间复杂度:
对于CSR格式,行将按O(1)时间索引,列将按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