【问题标题】:Improving code in c (sparse matrix representation)改进 c 中的代码(稀疏矩阵表示)
【发布时间】:2016-10-27 21:00:30
【问题描述】:

我用 C 编写了这段代码,运行时间太长。有什么办法可以改善吗? 我想要做的是对每一行的值求和并将值保存在向量中。在此代码中,i1 是包含矩阵的行位置、列和相关值的值。 i1 未排序。

while(a < 2*var)
{
    for (int c=0; c < 2*var; c++)
    {
        if (i1[c][0] == a)
        {
            diag[b] += i1[c][2];
        }
    }
    a = a+1;
    b = b+1;
}

任何想法或建议将不胜感激。谢谢。

【问题讨论】:

  • Stack Overflow 专注于不工作的代码。如果您可以自信地对Code Review On-Topic Check 中的所有 6 个问题回答“是”,那么您可以在Code Review 上提问。
  • 您发布的代码的计算复杂度为O(N^2)。在不知道矩阵中包含的数据结构的情况下,我无法看到如何改进它。提高计算复杂度的策略将在很大程度上取决于人们可以对矩阵的内容做出的假设。

标签: c matrix sparse-matrix representation


【解决方案1】:

作为b = a + const,您可以简单地使用diag[i1[c][0] + const] += i1[c][2] 并将复杂度从O(N2) 降低到O(N)。

【讨论】:

    【解决方案2】:

    如果ai1[c][0] 是整数类型,您可以将嵌套循环更改为单个循环:

    for (int c = 0; c < 2 * var; c++) {
        if (i1[c][0] >= a && i1[c][0] < 2 * var) {
            diag[b + (i1[c][0] - a)] += i1[c][2];
        }
    }
    b += 2 * var - a;
    a = 2 * var;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多