【问题标题】:Time complexity of matrix multiplication矩阵乘法的时间复杂度
【发布时间】:2018-03-30 23:53:37
【问题描述】:

我很难理解时间复杂度。人们可以看算法,直接说出它的时间复杂度是多少,但我做不到。

考虑两个n * n 矩阵(AB)。他们的乘法结果是C。 因此,C11 的值由 n 次乘法和 n-1 次加法组成。为什么它的时间复杂度是O(n^3)?我会说O(n^2)

谁能用通俗易懂的语言解释一下?我知道什么是 theta ,我知道什么是大 O,但我就是无法实现这些东西。

如果您提供另一个与上述类似的简单示例,我们将不胜感激。

【问题讨论】:

  • 从广义上讲,你有 2 个fors 来遍历你需要计算的所有 C 单元格,还有 1 个 for 来进行计算 -> 3 fors -> O(n³)
  • 第一个 FOR:遍历 A 行,第二个 FOR:遍历 B 列,第三个 FOR 添加,对吗?你怎么理解它,在飞行中?或者您必须快速编写该算法才能看到这种复杂性?
  • 实际上,您不必将代码可视化才能看到其复杂性。如果您熟记于心,就无法在脑海中想象它。查看this SO answer with a java matrix multiplication 并查看 3 个 for 循环

标签: algorithm time-complexity matrix-multiplication


【解决方案1】:

简单地说,您的矩阵 C 具有 n x n 单元格,这需要对所有单元格进行 n^2 操作。单独计算每个单元格(如c11)需要n 操作。所以这将花费O(n^3) 的总时间复杂度。

您说在 C 中计算一个单元格(如 c11)需要 n^2 是不正确的。计算 c11 需要从 1 循环到 n(写在纸上你会看到),这是O(n) 时间复杂度。

熟能生巧。只要尝试更多的问题,你就会擅长它。此外,Facebook 有一个名为codelab 的面试准备工具供您改进这些相关内容。

希望这会有所帮助!

【讨论】:

  • 我们可以这样说。单元格 C11 需要 n+(n-1) 次操作,即 O(n),然后计算 C 的第一个 raw 是 n*(2n-1),即 O(n2)。然后计算 C 的所有行需要 n*n*(2n-1),即 O(n3)。这是正确的吗?
  • @Sher:您的想法听起来不错,但我建议您不要过多详细说明为什么单元格 C11 需要 2n - 1 次操作。很高兴知道这一点,但它可能会让你在计算这样一个精确的答案时感到困惑,特别是当你有更多的循环要计算时。此外,在许多情况下,如果您不假定它是最好的情况或最坏的情况,您就无法计算出准确的值。例如,在线性搜索中,我们需要从 1 循环到 n 来找到一个值,比如 k。如果 k 是第一个元素,那么它只需要 1 次操作。但是如果 k 是最后一个元素,则需要 n 次操作。
  • @Sher:另外,这可能会有所帮助:stackoverflow.com/questions/3255/…
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多