【发布时间】:2015-09-01 00:19:18
【问题描述】:
我需要在C++中实现2种存储稀疏矩阵:
- 链接列表
- 数组(有效方式)
空间复杂度在这里非常重要。最有效的方法是什么?
【问题讨论】:
标签: c++ time-complexity sparse-matrix
我需要在C++中实现2种存储稀疏矩阵:
空间复杂度在这里非常重要。最有效的方法是什么?
【问题讨论】:
标签: c++ time-complexity sparse-matrix
由于矩阵是稀疏的,您只需要存储填充的单元格。只需简单地查找坐标到值即可。理想情况下,您应该使用快速查找的东西,例如 map O(log n) 或 unordered_map O(1)。
【讨论】:
一种有效的方法是使用哈希映射的哈希映射(对于每一行)(按列索引存储每一行中的元素)。然后将能够在 O(1) 时间内访问任何元素。
您可以实现所有数值算法,例如仅通过非零元素迭代的加法和乘法运算,这将使您获得比 O(N * M) 更好的复杂性,其中 N 和 M 是矩阵中的列数和行数。
【讨论】:
nnz:非零稀疏矩阵个数row_size:矩阵行数column_size:矩阵列数
有很多方法,它们的空间复杂度:
2*nnz + row_size 内存数2*nnz + column_size 内存数量3*nnz内存数量对于空间复杂度:
如果是row_size > column_size,则使用CSC 格式,否则使用CSR 格式。
对于时间复杂度:
对于CSR 格式,Row 将由O(1) time 索引,Column 将由O(log(k)) time 索引,通过二进制搜索 Column,k 是该行的非零元素的数量。所以值将由O(log(k))时间索引。
对于COO 格式,值将以O(1) 时间为索引。
格式详情
[1]https://en.wikipedia.org/wiki/Sparse_matrix
[2]https://software.intel.com/en-us/node/471374
【讨论】: