【问题标题】:Is there any method for multiplying matrices having O(n) complexity?是否有任何方法可以将具有 O(n) 复杂度的矩阵相乘?
【发布时间】:2010-12-29 00:19:35
【问题描述】:

我想将两个矩阵相乘,但三重循环的复杂度为 O(n3)。动态规划中是否有任何算法可以将两个复杂度为 O(n) 的矩阵相乘?

好吧,我们不能比 O(n2.81) 更好

编辑:但是有没有任何解决方案可以将结果近似到某个特定的数字。矩阵的列和行数

我的意思是我们可以通过复杂的解决方案获得最佳的 O(n2.81 ) 但如果有任何解决方案甚至可以近似矩阵乘法,因为我们有阶乘近似公式等等

如果有你知道的,会帮助我的

问候。

【问题讨论】:

  • <sup></sup> 是你的朋友!
  • 这是因为您没有接受您的 6 个问题的单一答案!
  • 好的,我必须选择一个ans,那么我该如何选择一个?
  • 你能在 O(n) 时间内将两个数字相乘吗?
  • 请尽量使用正确的英语,以便他人理解您。 “为什么”,不是“y”,“是”,不是“r”,“你”,不是“u”。你真的很懒,每个单词的那两个额外的字符会导致你身体疼痛吗?

标签: c++ c matrix big-o


【解决方案1】:

如果

  • 您的矩阵很大
  • 他们有很多零
  • 您愿意以奇怪的格式存储它们

您可以设计复杂性仅取决于非零元素数量的算法。对于某些问题(例如有限元方法),这可能是强制性的。

【讨论】:

    【解决方案2】:

    目前已知的最佳矩阵乘法算法是"Coppersmith-Winograd algorithm"O(n2.38)复杂,但它用于实际目的。

    但是,您始终可以使用 "Strassen's algorithm",它具有 O(n2.81 ) 复杂度,但没有这种已知的矩阵乘法算法复杂度为 O(n)。

    【讨论】:

    • 请注意,铜匠的固定成本非常高,因此仅推荐用于大型矩阵(例如,在视频游戏中将 2 个 4x4 矩阵相乘)
    • 对于每个 epsilon>0,在 O(2^{n+epsilon}) 中都有一个算法。然而,这是一个理论结果,当 epsilon 变为零时,常数会爆炸?
    • Alexandre C. - +1 表示乐观:)
    • @Alexandre:实际上有没有我不知道的结果?我认为基本上该领域的每个人都相信这是真的,但我不相信有人成功地建立了它。
    • @Stephen: 1) 应该读为 O(n^{2 + epsilon}) 2) 公平地说,我不记得看到它被证明了。不久前我读到了这个界限,当时并不奇怪,但如果你说它未经证实,你可能是对的。然而,常数会随着 epsilon->0 而爆炸。更有趣的是 O(n^2 log^* n) 中的算法,例如多项式相乘。
    【解决方案3】:

    如果您有 处理器和共享读取内存架构,您可以在O(n) 时间内将两个矩阵相乘...但这只是目前的理论。

    【讨论】:

      【解决方案4】:

      矩阵有 O(n2) 个元素,每个元素必须至少考虑一次结果,因此矩阵乘法算法不可能在小于 O( n2) 次操作。

      【讨论】:

        【解决方案5】:

        不!我不这么认为。

        除非并且直到您使用并行处理机器,否则没有办法。同样,它也有自己的依赖性和局限性。

        到目前为止,还没有实现。

        【讨论】:

        • 并行处理通常不会降低算法的大O复杂度。来自并行算法或硬件的并发性总是有一些固定的上限,例如 M,因此您最多可以获得恒定的加速。 (请注意,不是持续加速不好。)
        • 您最多只能拥有某个最大数量的处理器,因此并行处理只能使您加快一些(可能很大)恒定因子。
        • 我知道这就是我写“它有自己的依赖关系”的原因。我知道一点阿姆达尔定律。感谢您的评论:-)
        【解决方案6】:

        如果已知矩阵是对角矩阵,您可以在O(N) 操作中将它们相乘。但总的来说,你不能。

        【讨论】:

        • 或者如果它们是 Töplitz 矩阵。
        【解决方案7】:

        矩阵乘法在 O(n^2) 处有一个理论上的下限,因为您必须接触那么多内存位置才能进行乘法运算。正如其他人所说,有些算法会使我们低于 O(n^3),但在实际使用中通常是不切实际的。

        如果您需要加快速度,您可能需要查看 Cache Oblivious Algorithms,例如这个 (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.5650),它通过以缓存内聚方式执行操作来加速性能,确保数据在缓存中需要。

        【讨论】:

          【解决方案8】:

          简短回答:否

          长答案:如果您有特殊类型的矩阵(例如对角矩阵),则有一些方法。更好的矩阵乘法算法可以让你减少到像 O(n2.4) (http://en.wikipedia.org/wiki/Coppersmith-Winograd_algorithm) 这样的东西。我比较熟悉的主要是使用分而治之的算法来分割工作负载(不是我链接的那个)。

          我希望这会有所帮助!

          【讨论】:

          • 呸,我无法让链接正常工作:(
          猜你喜欢
          • 2023-01-19
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 2021-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          相关资源
          最近更新 更多