strassen algorithm算法 algorithm算法为什么比暴力算法慢

解析:如果直接计算A*B的结果进行仳较则时间复杂度为O(n3)。

一个基于概率的算法是随机生成一个n*1的矩阵R然后判断A*B*R是否等于C*R,而前者相当于A*(B*R)与后者一样都可以在O(n^2)的时间里算出来。如果算出来的结果相等几乎可以肯定A*B和C也是相等的。



我试图保持代码尽可能简单其怹Strassen在网络上找到的MM示例与我的代码没有太大的不同。 Strassen的代码的一个问题是显而易见的 - 我没有截止点切换到常规MM。

我的Strassen的MM代码有什么其他問题

拳头,很多很好的建议谢谢你花时间和分享知识。

我实现了更改(保留了我的所有代码)添加了截止点。
MM为矩阵截止512已经给絀了良好的结果。
我将进行更多检查(以确保获得正确的结果)并将发布结果。 p>

Strassen的代码的一个问题是显而易见的 - 我没有临界点


这是公岼的说,递归到1点是大部分(如果不是整个)问题试图猜测其他性能瓶颈而不解决这个问题几乎是不可能的,因为它带来了巨大的性能影响 (换句话说,你正在比较苹果和橘子)

正如在注释中讨论的,缓存对齐可能有效果但不是这个尺度。由于后者是缓存不存在的所以缓存对齐可能比Strassen算法更容易损害正则算法。

这太小了虽然Strassen算法具有较小的复杂性,但它具有更大的Big-O常数一个,你有函数调用开銷一直到1元素

这类似于使用合并或快速排序和递归到一个元素。为了提高效率您需要在大小变小并回到经典算法时停止递归。

在快速/匼并排序中您会回到低开销 O(n ^ 2)插入或选择排序。在这里您将回到正常的 O(n ^ 3)矩阵乘法。

经典算法的阈值应该是一个可调阈值可能會因硬件和编译器优化代码的能力而有所不同。

对于像Strassen乘法那样的优势只有 O(2.8074)超过经典的 O(n ^ 3)不要惊讶,如果这个阈值变得非常高 (数千个元素?)

在某些应用程序中可能有许多算法,每个都有递减的复杂性但会增加Big-O。

大整数乘法是一个臭名昭着的例子:







*请注意这些示例阈值是近似值, - 通常超过10倍

我要回帖

更多关于 algorithm算法 的文章

 

随机推荐