【问题标题】:Naive matrix multiplication improvement朴素矩阵乘法改进
【发布时间】:2018-02-20 08:22:51
【问题描述】:

我的 CS 老师要求我们对此代码“添加一个小改动”,使其以 N3 - N2 的时间复杂度运行strong> 而不是普通的 N3。我一生都无法弄清楚,我想知道是否有人碰巧知道。我不认为他在谈论斯特拉森方法。 从我看的时候开始,也许它可以利用他只关心正方形(对角线)矩阵的事实。

void multiply(int n, int A[][], int B[][], int C[][]) {
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            C[i][j] = 0;
            for (int k = 0; k < n; k++)
            {
                C[i][j] += A[i][k]*B[k][j];
            }
        }
    }
}

【问题讨论】:

  • 您的问题非常不准确。什么是“时间复杂度”?例如。具有 N 个处理器的机器可以在 O(N^2) 时间内将矩阵相乘。运行时间取决于机器型号。传统上,矩阵算法的效率是通过对矩阵元素的算术运算来衡量的。您的老师可能希望您注意到,您可以通过将C[i][j] = 0 更改为C[i][j] = A[i][0] * B[0][j],然后使用k = 1 启动内部for 循环来节省N^2 个添加。在实践中,这是愚蠢的。作为循环展开优化的一部分,一个好的编译器会为你做这件事。

标签: java c++ algorithm matrix


【解决方案1】:

您无法在 O(N2) 中实现矩阵乘法。但是,您可以从 O(N3) 提高复杂度。在线性代数中,有像 Strassen algorithm 这样的算法,通过减少每个 2x2 子矩阵所需的乘法次数,将时间复杂度降低到 O(N2.8074)从 8 点到 7 点。

Coppersmith–Winograd algorithm 的改进版本是已知最快的矩阵乘法算法,其最佳时间复杂度为 O(N2.3729)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2017-03-11
    相关资源
    最近更新 更多