如何存储稀疏矩阵?

时间:2015-06-16 09:06:42

标签: c++ time-complexity sparse-matrix

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

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

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

3 个答案:

答案 0 :(得分: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)时间索引,列将被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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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