【问题标题】:How to store sparse matrix?如何存储稀疏矩阵?
【发布时间】:2015-09-01 00:19:18
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但是我需要使用链表和数组。
    • 使用链表或数组会给你 O(n) 时间 - 速度较慢,但​​对于较小的 n 值绝对可行。如果您可以对数组进行排序,则可以在 O (log n) 时间内执行二进制搜索。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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) 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

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 2019-03-12
        • 2011-03-29
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2017-09-09
        • 2012-12-10
        • 2014-10-19
        相关资源
        最近更新 更多