大O基本算术运算的复杂性

psi*_*lia 18 algorithm math complexity-theory big-o time-complexity

对于基本算术运算的广泛算法,如乘法,平方根,对数,标量和矩阵乘积,Big-O复杂度是多少?

在Big-O复杂性方面是否存在更高效的外来算法,但在实际解决方案中并不是非常普遍(例如,在流行的软件库中没有实现)?

ken*_*ytm 18

请参见http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations


方矩阵的矩阵乘积:

还有一个O(N 2.38)Coppersmith-Winograd算法,但由于巨大的隐藏常数,我不认为它是广泛传播的.

Big-int乘法:

2008年还发布了一个n log n·2 O(log*n)算法,但这个算法太新了,无法普及.


通常,天真的方法对于正常大小的输入来说足够好.

  • 同样处理乘法的"快速"方法.当n类似于2 ^ 8时,O(n平方)不是很大.Schönhage-Strassen甚至不值得考虑,直到你有一个真正庞大的数字(维基百科建议2 ^ 15 - 2 ^ 17位数,然后才开始获得回报). (3认同)

Ski*_*ick 5

操作没有复杂性,算法也没有.例如,存在各种平方根算法,它们将具有不同的复杂性.

  • @Tronic:使用FFT乘法只需要O(n logn) (3认同)
  • 乘法是两个位阵列之间的算法.复杂度为O(n²),如果我没有弄错的话. (2认同)
  • @Skilldrick:OP正在谈论最常用的算法,所以在某种意义上这个答案是无关紧要的. (2认同)
  • FFT乘法不仅是"O(n log n)".好吧,也许如果`n`是数字,但在这些术语中,`n`通常是位数. (2认同)
  • @Skilldrick:我看到你还没有纪律徽章;-) (2认同)

Iai*_*way 5

您将大多数简单操作视为O(1),因为您的输入大小通常是固定的(即32位或64位).

在正常情况下,无论输入的"大小"如何,您的平台将执行与乘法,平方根,对数等完全相同的操作(即int a = 0;并且int b = Int32.MaxValue都是32位整数).

一旦你开始查看矩阵或表示任意精度数字,它就会变得有趣,但有人已经链接了维基百科摘要,所以我不会进入那个.

只是不要使用Schönhage-Strassen来增加"正常"的小数字.它会让我哭泣.仅仅因为算法是O(n 2)并不意味着它是坏的 - 特别是当n几乎总是2 5或2 6时.