如何存储稀疏矩阵
How to store sparse matrix?
我需要在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)。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 存储在存储在堆栈中的堆与矩阵中的矩阵可以看作是一系列指针